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ć z 1?
Jaki jest najlepszy (lub najczęściej używany) typ danych do przechowywania tego rodzaju danych?
Nie znam odpowiedzi na SQL Server, ale ...
W MySQL zapisz go jako
FLOAT( 10, 6 )
To jest oficjalna rekomendacja z dokumentacji programistów Google .
źródło
lat
ilng
Doskonałośćgeorgraphy
, nawet przy wysokiej gęstości indeksów w SQL 2014 na przykład: znaleźć wszystko punkt withing prostokąt. Tylko nie jestem pewien, widzę, że Mapy Google używają teraz 7 zamiast 6 cyfr?Sposób, w jaki to robię: przechowuję szerokość i długość geograficzną, a następnie mam trzecią kolumnę, która jest automatycznie wyprowadzonym typem geograficznym pierwszych dwóch kolumn. Tabela wygląda następująco:
Zapewnia to elastyczność zapytań przestrzennych w kolumnie geoPoint, a także umożliwia pobieranie wartości szerokości i długości geograficznej, gdy są potrzebne do wyświetlania lub wyodrębniania do celów CSV.
źródło
Point
zamiastSTGeomFromText
. Na przykład:[geography]::Point([Latitude], [Longitude], 4326)
.Nienawidzę być przeciwieństwem tych, którzy mówili „oto nowy typ, użyjmy go”. Nowe typy przestrzenne SQL Server 2008 mają pewne zalety - mianowicie wydajność, jednak nie można ślepo powiedzieć, że zawsze używaj tego typu. To naprawdę zależy od większych problemów z obrazem.
Na przykład integracja. Ten typ ma równoważny typ w .Net - ale co z interopem? A co z obsługą lub rozszerzaniem starszych wersji .Net? A co z ujawnieniem tego typu w warstwie usług na innych platformach? A co z normalizacją danych - może interesuje Cię łata lub długa jako samodzielne informacje. Być może napisałeś już złożoną logikę biznesową do obsługi długich / lat.
Nie mówię, że nie powinieneś używać typu przestrzennego - w wielu przypadkach powinieneś. Mówię tylko, że powinieneś zadać bardziej krytyczne pytania, zanim pójdziesz tą ścieżką. Aby jak najdokładniej odpowiedzieć na Twoje pytanie, potrzebowałbym więcej informacji o Twojej konkretnej sytuacji.
Przechowywanie długich / szer. Osobno lub w typie przestrzennym jest dobrym rozwiązaniem i jedno może być lepsze od drugiego w zależności od twoich okoliczności.
źródło
To, co chcesz zrobić, to zapisać szerokość i długość geograficzną jako nowy typ SQL2008 Spatial -> GEOGRAPHY.
Oto zrzut ekranu tabeli, którą mam.
tekst alternatywny http://img20.imageshack.us/img20/6839/zipcodetable.png
W tej tabeli mamy dwa pola, które przechowują dane geograficzne.
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 -> np. Punkt w poli, odległość między dwoma punktami itp.
BTW, używamy również Google Maps API do pobierania danych o szerokości / długości i przechowywania ich w naszej bazie danych Sql 2008 - więc ta metoda działa.
źródło
SQL Server obsługuje informacje przestrzenne. Więcej informacji można znaleźć pod adresem http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx .
Alternatywnie możesz przechowywać informacje jako dwa podstawowe pola. Zwykle liczba zmiennoprzecinkowa jest standardowym typem danych zgłaszanych przez większość urządzeń i jest wystarczająco dokładna z dokładnością do cala lub dwóch - więcej niż wystarczająca dla Map Google.
źródło
szerokość geograficzna i długość geograficzna z Google Maps powinny być przechowywane jako dane Point (uwaga duże P) na serwerze SQL w ramach typu danych geograficznych.
Zakładając, że twoje bieżące dane są przechowywane w tabeli
Sample
jako varchar pod kolumnami,lat
alon
poniższe zapytanie pomoże ci przekonwertować na geografięPS: Następnym razem, gdy wybierzesz tę tabelę z danymi geograficznymi, oprócz zakładki Wyniki i wiadomości, otrzymasz również kartę Wyniki przestrzenne, jak poniżej, do wizualizacji
źródło
Jeśli używasz Entity Framework 5 <możesz użyć
DbGeography
. Przykład z MSDN:https://msdn.microsoft.com/en-us/library/hh859721(v=vs.113).aspx
Coś, z czym walczyłem, a potem zacząłem używać,
DbGeography
tocoordinateSystemId
. Zobacz odpowiedź poniżej, aby uzyskać doskonałe wyjaśnienie i źródło poniższego kodu.https://stackoverflow.com/a/25563269/3850405
źródło
Jeśli zamierzasz zamienić go na adres URL, przypuszczam, że wystarczy jedno pole - możesz więc utworzyć adres URL podobny do
ale ponieważ są to dwie części danych, przechowywałbym je w osobnych polach
źródło
Przechowuj oba jako zmiennoprzecinkowe i używaj na nich unikalnych słów kluczowych
źródło
House A
, i przeniesie się doHouse B
, domu, w którym Alicja używane żyć. Wkrótce Bob nie będzie mógł zapisać swojego adresu (lokalizacji), ponieważ Alicja jeszcze nie zaktualizowała swojego adresu - lub nigdy tego nie zrobi.