2015-01-21 12 views
47

Jaki jest najlepszy typ danych do użycia podczas przechowywania danych geoprzestrzennych w języku C#? Używałbym dziesiętnej, by była dokładna, ale operacje na dziesiętnych liczbach zmiennoprzecinkowych są wolniejsze niż binarne liczby zmiennoprzecinkowe (podwójne).Podwójne lub dziesiętne dla wartości szerokości/długości geograficznej w C#

Przeczytałem, że przez większość czasu nie potrzebujesz więcej niż 6 lub 7 cyfr precyzji dla szerokości i długości geograficznej. Czy nieścisłość dublowania jest wtedy ważna, czy może być ignorowana?

+3

Chciałbym zadać przeciwne pytanie: czy różnica w wydajności ma znaczenie, czy może być ignorowana? – Heinzi

+0

Dziesiętny dla absolutnej precyzji. Jeśli przechowujesz na nich miliony, możesz zaoszczędzić trochę na wielkości i poprawić nieco wydajność przy użyciu podwójnego, ale nieistotnego. –

+1

W bazie danych należy użyć "typ danych przestrzennych sql" do przechowywania długości i szerokości geograficznej –

Odpowiedz

3

Napotkałem to pytanie już jakiś czas temu, kiedy zacząłem od programowania przestrzennego. Czytałem książkę jakiś czas temu, która doprowadziła mnie do tego.

//sql server has a really cool dll that deals with spacial data such like 
//geography points and so on. 
//add this namespace 
Using Microsoft.SqlServer.Types; 

//SqlGeography.Point(dblLat, dblLon, SRID)

var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326); 

Jest to najlepszy sposób podczas pracy w aplikacji z danych przestrzennych. następnie zapisać dane wykorzystuje to w sql

CREATE TABLE myGeoTable 
{ 
LatLonPoint GEOMETRY 
} 

indziej, jeśli używasz coś innego, że isnt sql tylko przekonwertować punkt na szesnastkowy i zapisać go. Wiem po długim czasie używania przestrzeni, że to jest najbezpieczniejsze.

24

Podwójny ma do 15 cyfr dziesiętnych dokładności. Załóżmy więc, że trzy z tych cyfr znajdują się po lewej stronie przecinka dziesiętnego dla wartości długich/długich (maks. 180 stopni). Pozostawia 12 cyfr precyzji po prawej. Ponieważ stopień lat/długości wynosi ~ 111km, 5 z tych 12 cyfr dałoby nam dokładność pomiaru. Trzy kolejne cyfry dałyby nam dokładność do milimetra. Pozostałe 4 cyfry zapewnią nam dokładność do około 100 nanometrów. Ponieważ podwójne wygrywa z perspektywy wydajności i pamięci, nie widzę powodu, aby nawet rozważyć użycie dziesiętnych.

+0

Jestem przekonany (okres) –

64

Idź za podwójne, jest kilka powodów.

  • funkcje trygonometryczne są dostępne tylko dla podwójnego
  • Precyzja podwójna jest daleko poza czymkolwiek kiedykolwiek będziesz potrzebować dla Lat/Lon wartości
  • trzeciego Party moduły (np DotSpatial) również użyć podwójnie dla współrzędnych
Powiązane problemy