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?
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:
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.
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 )
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
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.
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.
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.
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.
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
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);
}
}
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
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)
);
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