ما هي أفضل طريقة لتخزين المنسق (خط الطول / خط العرض، من خرائط Google) في SQL Server؟

StackOverflow https://stackoverflow.com/questions/551894

سؤال

أقوم بتصميم جدول في SQL Server 2008 الذي سيقوم بتخزين قائمة المستخدمين وتنسيق خرائط Google (خط الطول والخطوط).

هل سأحتاج إلى حقلين، أم يمكن القيام به مع 1؟

ما هو أفضل نوع البيانات (أو الأكثر شيوعا) لاستخدامها لتخزين هذا النوع من البيانات؟

هل كانت مفيدة؟

المحلول

ألق نظرة على أنواع البيانات المكانية الجديدة التي تم تقديمها في SQL Server 2008. وهي مصممة لهذا النوع من المهمة وإجراء الفهرسة والاستعلام عن أسهل بكثير وأكثر كفاءة.

معلومات اكثر:

نصائح أخرى

تحذير عادل! قبل اتخاذ المشورة لاستخدام نوع الجغرافيا، تأكد من أنك لا تخطط لاستخدام LinQ أو إطار كيان للوصول إلى البيانات لأنه غير مدعوم (اعتبارا من نوفمبر 2010) وستحزن!

تحديث يوليو 2017.

بالنسبة لأولئك الذين يقرؤون هذه الإجابة الآن، فهو عتيق كما يشير إلى مكدس التكنولوجيا الخلفية. انظر التعليقات لمزيد من التفاصيل.

أنا لا أعرف الإجابة عن SQL Server ولكن ...

في mysql. حفظها كما FLOAT( 10, 6 )

هذه هي التوصية الرسمية من وثائق مطور جوجل.

CREATE TABLE `coords` (
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;

أنا أكره أن أكون مناقضة لأولئك الذين قالوا "هنا نوع جديد، دعونا نستخدمها". الأنواع المكانية SQL Server 2008 الجديدة لديها بعض المحترفين لها - وهي الكفاءة، ومع ذلك، لا يمكنك أن تقول عمياء دائما استخدام هذا النوع. ذلك يعتمد حقا على بعض قضايا الصور الأكبر.

كمثال، التكامل. هذا النوع لديه نوع متكافئ في .NET - ولكن ماذا عن interop؟ ماذا عن دعم أو توسيع الإصدارات القديمة من .NET؟ ماذا عن تعريض هذا النوع عبر طبقة الخدمة إلى منصات أخرى؟ ماذا عن تطبيع البيانات - ربما كنت مهتما ب LAT أو طويلة مثل قطع معلومات مستقلة. ربما كنت قد كتبت بالفعل منطق الأعمال المعقدة للتعامل مع الطويل / اللقط.

أنا لا أقول أنه يجب ألا تستخدم النوع المكاني - في كثير من الحالات يجب عليك. أنا فقط أقول أنك يجب أن تطلب بعض الأسئلة الأكثر أهمية قبل النزول في هذا المسار. بالنسبة لي للإجابة على سؤالك بدقة سأحتاج إلى معرفة المزيد عن وضعك المحدد.

يتم تخزين الطويل / اللقط بشكل منفصل أو في النوع المكاني حلولا قابلة للتطبيق، وقد يكون المرء أفضل من الآخر اعتمادا على ظروفك الخاصة.

الطريقة التي أفعلها: أخزن خط العرض و خط الطول ثم لدي عمود ثالث وهو نوع جغرافيا مشتقة تلقائيا من أعماليين الأولين. الجدول يشبه هذا:

CREATE TABLE [dbo].[Geopoint]
(
    [GeopointId] BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    [Latitude] float NOT NULL, 
    [Longitude] float NOT NULL, 
    [ts] ROWVERSION NOT NULL, 
    [GeographyPoint]  AS ([geography]::STGeomFromText(((('POINT('+CONVERT([varchar](20),[Longitude]))+' ')+CONVERT([varchar](20),[Latitude]))+')',(4326))) 
)

يمنحك هذا مرونة الاستعلامات المكانية على عمود Geopoint ويمكنك أيضا استرداد قيم خطوط الطول والعرض أثناء حاجةها لعرض أو استخراج لأغراض CSV.

ما تريد القيام به هو تخزين خطوط الطول والعرض كنوع مكاني SQL2008 الجديد -> الجغرافيا.

إليك لقطة شاشة من طاولة، والتي لدي.

النص البديل http://img20.imageshack.us/img20/6839/sipcodetable.png.

في هذا الجدول، لدينا حقلان تخزن بيانات الجغرافيا.

  • الحدود: هذا هو المضلع الذي هو حدود الرمز البريدي
  • CentrePoint: هذه هي نقطة خط العرض / خط الطول الذي يمثل النقطة الوسطى المرئية لهذا المضلع.

السبب الرئيسي وراء الرغبة في حفظه إلى قاعدة البيانات كوعي جغرافيا هو أنه يمكنك بعد ذلك الاستفادة من جميع الأساليب المكانية قبالةها -> على سبيل المثال. أشر في بولي، المسافة بين نقطتين، إلخ.

راجع للشغل، ونحن نستخدم أيضا خرائط Google API لاسترداد البيانات اللات / الطويلة وتخزين ذلك في SQL 2008 DB - لذلك هذه الطريقة تعمل.

خادم SQL لديه دعم للمعلومات المكانية ذات الصلة. يمكنك أن ترى المزيد في http://www.microsoft.com/sqlserver/2008/EN/US/SPatial-Data.aspx..

من البديل، يمكنك تخزين المعلومات كحقول أساسية، عادة ما تكون تعويم هو نوع البيانات القياسي الذي أبلغ عنه معظم الأجهزة وهو دقيق بما فيه الكفاية خلال بوصة أو اثنين - أكثر من كافية لخرائط Google.

ملاحظة: هذه إجابة حديثة بناء على تحديثات SQL Server الأخيرة، .NET Stack

يجب تخزين Latulting وعلى الطوق من خرائط Google بيانات نقطة (ملاحظة رأس المال P) في SQL Server ضمن نوع بيانات الجغرافيا.

يتم تخزين بياناتك الحالية في جدول Sample كما varchar تحت الأعمدة lat و lon, ، أدناه الاستعلام سوف يساعدك على التحول إلى الجغرافيا

alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go

ملاحظة: في المرة القادمة عند القيام بتحديد هذا الجدول مع بيانات الجغرافيا، بصرف النظر عن علامة التبويب النتائج والرسائل، ستحصل أيضا على علامة تبويب النتائج المكانية مثل أدناه للتصور

SSMS geo results tab

إذا كنت تستخدم إطار الكيان 5 <يمكنك استخدامه DbGeography. وبعد مثال من MSDN:

public class University  
{ 
    public int UniversityID { get; set; } 
    public string Name { get; set; } 
    public DbGeography Location { get; set; } 
}

public partial class UniversityContext : DbContext 
{ 
    public DbSet<University> Universities { get; set; } 
}

using (var context = new UniversityContext ()) 
{ 
    context.Universities.Add(new University() 
        { 
            Name = "Graphic Design Institute", 
            Location = DbGeography.FromText("POINT(-122.336106 47.605049)"), 
        }); 

    context. Universities.Add(new University() 
        { 
            Name = "School of Fine Art", 
            Location = DbGeography.FromText("POINT(-122.335197 47.646711)"), 
        }); 

    context.SaveChanges(); 

    var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)"); 

    var university = (from u in context.Universities 
                        orderby u.Location.Distance(myLocation) 
                        select u).FirstOrDefault(); 

    Console.WriteLine( 
        "The closest University to you is: {0}.", 
        university.Name); 
}

https://msdn.microsoft.com/en-us/library/hhh859721(V=VS.113).aspx.

شيء كافح مع ثم بدأت في استخدام DbGeography كان coordinateSystemId. وبعد انظر الإجابة أدناه للحصول على شرح ممتاز ومصدر للرمز أدناه.

public class GeoHelper
{
    public const int SridGoogleMaps = 4326;
    public const int SridCustomMap = 3857;

    public static DbGeography FromLatLng(double lat, double lng)
    {
        return DbGeography.PointFromText(
            "POINT("
            + lng.ToString() + " "
            + lat.ToString() + ")",
            SridGoogleMaps);
    }
}

https://stackoverflow.com/a/25563269/3850405.

إذا كنت ستحليلها في عنوان URL، ففترض أنه سيفعل حقل واحد - حتى تتمكن من تشكيل عنوان URL

http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6

ولكن كما هي قطعتين من البيانات وأود أن تخزينها في مجالات منفصلة

تخزين كلاهما تعويم، واستخدام الكلمات الرئيسية الفريدة على لهم

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top