Jaki jest najlepszy sposób przechowywania współrzędnych (długość/szerokość geograficzna, z Google Maps) w SQL Server?

Projektuję tabelę w SQL Server 2008, która będzie przechowywać listę użytkowników i współrzędne Google Maps (długość i szerokość geograficzna).

Czy będę potrzebował dwóch pól, czy można to zrobić za pomocą 1?

Jaki jest najlepszy (lub najczęstszy) typ danych do przechowywania tego rodzaju danych?

Author: j0k, 2009-02-16

11 answers

Spójrz na nowe typy danych przestrzennych, które zostały wprowadzone w SQL Server 2008. Są one przeznaczone do tego rodzaju zadań i sprawiają, że indeksowanie i wyszukiwanie jest znacznie łatwiejsze i bardziej wydajne.

Więcej informacji:

 55
Author: Craig Bovis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 10:48:18

Ostrzeżenie! zanim skorzystasz z porady, aby użyć typu geografia, upewnij się, że nie planujesz używać Linq lub Entity Framework, aby uzyskać dostęp do danych, ponieważ nie są one obsługiwane (stan na listopad 2010) i będziesz smutny!

Aktualizacja Lipiec 2017

Dla tych, którzy teraz czytają tę odpowiedź, jest ona przestarzała, ponieważ odnosi się do wstecznego stosu technologii. Więcej szczegółów można znaleźć w komentarzach.

 63
Author: dan90266,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

nie znam odpowiedzi na SQL Server ale...

W MySQL Zapisz jako FLOAT( 10, 6 )

Jest to oficjalna rekomendacja z dokumentacji programisty Google.
CREATE TABLE `coords` (
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
 28
Author: powtac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-10 20:43:26

Sposób, w jaki to robię: przechowuję szerokość geograficzna i Długość geograficzna , a następnie mam trzecią kolumnę, która jest automatycznym pochodnym typem geografii pierwszych dwóch kolumn. Tabela wygląda tak:

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

Daje to elastyczność zapytań przestrzennych w kolumnie geoPoint, a także można pobrać wartości szerokości i długości geograficznej, które są potrzebne do wyświetlania lub wyodrębniania do celów csv.

 22
Author: jaxxbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 18:05:16

Nienawidzę być przeciwnikiem tych, którzy powiedzieli "Oto nowy typ, użyjmy go". Nowe typy przestrzenne SQL Server 2008 mają pewne plusy - mianowicie wydajność, jednak nie można ślepo powiedzieć, że zawsze używaj tego typu. To naprawdę zależy od kilku problemów z szerszym obrazem.

Jako przykład integracja. Ten typ ma typ equivilent w. Net - ale co z interop? A co z obsługą lub rozszerzaniem starszych wersji. Net? a co z narażeniem tego typu w całej warstwie usług na inne platformy? A co z normalizacją danych - może interesuje Cię lat lub długo jako samodzielne fragmenty informacji. Być może napisałeś już skomplikowaną logikę biznesową do obsługi long / lat.

Nie mówię, że nie powinieneś używać typu przestrzennego - w wielu przypadkach powinieneś. Mówię tylko, że powinieneś zadać kilka bardziej krytycznych pytań przed pójściem tą ścieżką. Aby jak najdokładniej odpowiedzieć na twoje pytanie, muszę wiedzieć więcej o Twoim konkretnym sytuacja.

Przechowywanie long / lat oddzielnie lub w typie przestrzennym to zarówno realne rozwiązania, a jedno może być lepsze od drugiego w zależności od własnych okoliczności.

 21
Author: R. Lawson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-04 17:53:00

Chcesz zapisać szerokość i długość geograficzną jako nowy typ przestrzenny Sql2008 - > Geografia.

Oto screen z tabeli, który mam.

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

W tej tabeli mamy dwa pola, które przechowują dane geograficzne.

  • granica: to jest wielokąt, który jest granicą kodu pocztowego
  • Centerpoint: jest to punkt szerokości / długości geograficznej, który reprezentuje wizualną środkowy punkt tego wielokąta.

Głównym powodem, dla którego chcesz zapisać go w bazie danych jako typ geografii, jest to, że możesz następnie wykorzystać wszystkie metody przestrzenne z niego - > np. Punkt w Poli, odległość między dwoma punktami itp.

BTW, używamy również Google Maps API do pobierania danych lat / long i przechowywać je w naszym SQL 2008 DB -- więc ta metoda działa.

 15
Author: Pure.Krome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-10 00:49:14

SQL Server posiada obsługę informacji przestrzennych. Możesz zobaczyć więcej na http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx .

Alternatywnie można przechowywać informacje jako dwa podstawowe pola, Zwykle float jest standardowym typem danych zgłaszanym przez większość urządzeń i jest wystarczająco dokładny, aby w ciągu cala lub dwóch-więcej niż odpowiednie dla Google Maps.

 11
Author: Rosstified,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-16 00:19:21

Uwaga: jest to ostatnia odpowiedź oparta na ostatnich aktualizacjach stosu SQL server,. NET

Szerokość I Długość geograficzna z google Maps powinny być przechowywane jako dane punktowe(Uwaga Wielka P) w SQL server w typie danych Geografia.

Zakładając, że Twoje bieżące dane są przechowywane w tabeli Sample jako varchar pod Kolumnami lat i lon, poniższe zapytanie pomoże Ci przekonwertować na Geografia

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

PS: następnym razem, gdy zrobisz select na tej tabeli z danymi geograficznymi, oprócz zakładki wyniki i wiadomości, otrzymasz również zakładkę wyniki przestrzenne, jak poniżej dla wizualizacji

Zakładka wyników SSMS geo

 2
Author: DhruvJoshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 21:34:30

Jeśli używasz encji Framework 5 DbGeography. Przykład z 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

Coś, z czym zmagałem się potem zacząłem używać {[2] } było coordinateSystemId. Zobacz odpowiedź poniżej, aby uzyskać doskonałe wyjaśnienie i źródło poniższego kodu.

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

 0
Author: Ogglas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-11 20:46:39

Jeśli zamierzasz zastąpić go adresem URL, przypuszczam, że zrobi to jedno pole - możesz więc utworzyć adres URL w stylu

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

Ale ponieważ są to dwa kawałki danych, zapisałbym je w osobnych polach

 -4
Author: Kristen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-16 16:15:03

Przechowuj oba jako float i używaj na nich unikalnych słów kluczowych.i. em

create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
 -10
Author: Graviton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-16 16:19:50