Was ist der beste Weg zum Speichern von Koordinaten (Längen- / Breitengrad, von Google Maps) in SQL Server?

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

Frage

Ich bin eine Tabelle in SQL Server 2008 entwerfen, die eine Liste von Benutzern und ein Google Maps-Koordinaten (Längengrad und Breitengrade) gespeichert werden.

Benötige ich zwei Felder, oder kann es mit 1 getan werden?

Was ist der beste (oder am häufigsten) Datentyp zur Speicherung diese Art von Daten zu benutzen?

War es hilfreich?

Lösung

Werfen Sie einen Blick auf die neuen Spatial-Datentypen, die in SQL Server eingeführt wurden 2008. Sie sind für diese Art von Aufgabe konzipiert und macht Indizierung und Abfragen viel einfacher und effizienter zu gestalten.

Weitere Informationen:

Andere Tipps

Fair Warning! Vor dem Rat unter den Geography-Typen zu verwenden, stellen Sie sicher, dass Sie nicht über die Verwendung von Linq oder Entity Framework planen die Daten zugreifen, da sie nicht unterstützt wird (Stand: November 2010) und Sie werden traurig sein!

  

Update Juli 2017

     

Für das Lesen Sie diese Antwort jetzt ist es überflüssig, wie es auf rückwirkende Technologie-Stack bezeichnet. Siehe Anmerkungen für weitere Details.

Ich weiß nicht, die Antwort für SQL Server, aber ...

MySQL speichern Sie es als FLOAT( 10, 6 )

Dies ist die offizielle Empfehlung der Google Entwickler-Dokumentation .

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

Ich hasse ein Contrarian zu denen sein, die sagte: „Hier ist eine neue Art, nutzen wir sie“. Die neuen SQL Server 2008 Raumtypen haben einige Profis, um es - nämlich Effizienz, jedoch können Sie nicht blind sagen immer, dass Typ verwenden. Es hängt wirklich von einigen größeren Bild Fragen.

Als Beispiel Integration. Dieser Typ hat eine equivilent Art in .Net - aber was ist Interop? Was ist die Unterstützung oder ältere Versionen von Net erstreckt? Was über diese Art über den Service-Layer auf andere Plattformen ausgesetzt wird? Was ist der Datennormalisierung - vielleicht sind Sie interessiert lat oder lang als eigenständige Stücke von Informationen. Vielleicht haben Sie bereits komplexe Geschäftslogik geschrieben long / lat zu behandeln.

Ich sage nicht, dass Sie nicht den räumlichen Datentyp verwenden sollten - in vielen Fällen sollten Sie. Ich sage nur, sollten Sie einige kritischere Fragen stellen, bevor diesen Weg hinunter. Für mich Ihre Frage möglichst genau zu beantworten, müssen Sie mir mehr über Ihre spezifische Situation kennen.

Speichern von long / lat separat oder in einer räumlichen Typ sind beide tragfähige Lösungen, und man kann auf die andere je nach Ihren eigenen Umständen vorzuziehen.

So wie ich es tun: Ich speichere die Breite und Länge und dann habe ich eine dritte Säule, die ein automatischer abgeleitete Geographie Typ der ersten zwei Spalten. Die Tabelle sieht wie folgt aus:

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))) 
)

Dies gibt Ihnen die Flexibilität der räumlichen Abfragen auf der GeoPoint Spalte und Sie können auch die Breiten- und Längenwerte abrufen, wie Sie sie für die Anzeige benötigen oder für csv Zwecke zu extrahieren.

Was möchten Sie tun ist speichern Sie die Breite und Länge als der neue SQL2008 Spatial Typ. -> GEOGRAPHY

Hier ist ein Screenshot einer Tabelle, die ich habe.

alt text http://img20.imageshack.us/img20/6839/zipcodetable.png

In dieser Tabelle haben wir zwei Felder, die Geographie Daten speichern.

  • Boundary: Das ist das Polygon, das die Postleitzahl Grenze
  • ist
  • MittelPunkt. Dies ist die Breite / Länge Punkt, der den visuellen Mittelpunkt dieses Polygons darstellt

Der Hauptgrund, warum Sie wollen, dass es in der Datenbank speichern als eine Art GEOGRAPHY ist so können Sie dann alle SPATIAL Methoden off es nutzen -> zB. Punkt in Poly, Abstand zwischen zwei Punkten, etc.

BTW, wir verwenden auch Google Maps API lat / long Daten abzurufen und speichern, dass in unserem SQL 2008 DB -. So dass diese Methode funktioniert

SQL Server hat die Unterstützung für räumliche bezogene Informationen. Sie können mehr unter http://www.microsoft.com/ sehen sqlserver / 2008 / en / us / Raum-data.aspx .

Alternativ können Sie die Informationen als zwei Basisfelder speichern, in der Regel ein Schwimmer ist der Standard, der von den meisten Geräten berichtet Datentyp und ist genau genug, um innerhalb ein oder zwei Zoll - mehr als ausreichend für Google Maps.

  

Hinweis : Dies ist eine aktuelle Antwort auf die jüngsten SQL Server, .NET-Stack-Updates

Breitengrade und Länge von Google Maps sollte als Point (Anmerkung Hauptstadt P) Daten in SQL Server unter Geographie-Datentyp gespeichert werden.

Ihre aktuellen Daten in einer Tabelle Sample als varchar gespeichert Unter der Annahme, unter Spalten lat und lon, unter Abfrage werden Ihnen helfen, zu konvertieren Geographie

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

PS: Das nächste Mal, wenn Sie mit der Geographie Daten zu dieser Tabelle eine ausgewählte tun, außer Ergebnisse und Registerkarte Nachrichten, werden Sie auch Spatial Ergebnisse Tab wie unten für die Visualisierung

erhalten

Wenn Sie Entity Framework verwenden 5 DbGeography verwenden können. Beispiel von 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 / hh859721 (v = vs.113) aspx

Etwas, das ich mit dann kämpfte ich mit DbGeography begann, war die coordinateSystemId. Siehe Antwort unten für eine ausgezeichnete Erklärung und Quelle für den Code unten.

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

Wenn Sie vorhaben, nur um es in eine URL zu ersetzen ich ein Feld annehmen tun würde -, so dass Sie eine URL wie

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

, aber da es zwei Stücke von Daten ist, würde ich speichert sie in getrennten Feldern

Speicher sowohl als float, und verwendet eindeutige Schlüsselwörter auf them.i.em

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top