Jaki jest najlepszy typ danych do użycia podczas przechowywania danych geopozycyjnych w C #? Użyłbym dziesiętnego dla jego dokładności, ale operacje na dziesiętnych liczbach zmiennoprzecinkowych są wolniejsze niż binarne liczby zmiennoprzecinkowe (podwójne).
Czytałem, że przez większość czasu nie potrzebujesz więcej niż 6 lub 7 cyfr precyzji dla szerokości lub długości geograficznej. Czy niedokładność podwójnych w ogóle ma wtedy znaczenie, czy można ją zignorować?
c#
latitude-longitude
geopoints
KRTac
źródło
źródło
double
,double
może być najlepszym rozwiązaniem.Odpowiedzi:
Idź
double
, jest kilka powodów.źródło
Podwójna ma dokładność do 15 cyfr dziesiętnych. Zatem załóżmy, że trzy z tych cyfr będą znajdować się po lewej stronie przecinka dziesiętnego dla wartości szerokości / długości (maksymalnie 180 stopni). Pozostawia to 12 cyfr precyzji po prawej stronie. Ponieważ stopień szerokości / długości wynosi ~ 111 km, 5 z tych 12 cyfr dałoby nam dokładność do metra. 3 dodatkowe cyfry dałyby nam dokładność do milimetra. Pozostałe 4 cyfry dałyby nam precyzję do około 100 nanometrów. Ponieważ podwójna wygra z punktu widzenia wydajności i pamięci, nie widzę powodu, by nawet rozważać użycie dziesiętnych.
źródło
Spotkałem się z tym pytaniem już jakiś czas temu, kiedy zacząłem od programowania przestrzennego. Niedawno przeczytałem książkę, 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);
To najlepszy sposób podczas pracy w aplikacji z danymi przestrzennymi. następnie, aby zapisać dane, użyj tego w sql
w przeciwnym razie, jeśli używasz czegoś innego, co nie jest sql, po prostu przekonwertuj punkt na szesnastkowy i zapisz go. Wiem po długim czasie używania spacerów, że to jest najbezpieczniejsze.
źródło
Podwójnie
Łącząc odpowiedzi, Microsoft przedstawia siebie w bibliotece SqlGeography
[get: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] public System.Data.SqlTypes.SqlDouble Lat {get; } Wartość właściwości SqlDouble Wartość SqlDouble określająca szerokość geograficzną.
źródło