Doppio o decimale per i valori di latitudine / longitudine in C #


96

Qual è il miglior tipo di dati da usare quando si archiviano dati geoposizionali in C #? Vorrei usare il decimale per la sua esattezza, ma le operazioni sui numeri in virgola mobile decimale sono più lente dei numeri in virgola mobile binari (doppi).

Ho letto che la maggior parte delle volte non avrai bisogno di più di 6 o 7 cifre di precisione per latitudine o longitudine. L'inesattezza dei doppi conta allora o può essere ignorata?


6
Vorrei fare la domanda opposta: la differenza di prestazioni è importante o può essere ignorata?
Heinzi

1
Nel database dovresti usare "sql spatial data type" per memorizzare longitudine e latitudine
azhar_SE_nextbridge

8
Si noti che lo stesso .NET BCL utilizza double nella sua classe GeoCoordinate , che è una forte indicazione che la precisione potrebbe essere sufficiente.
Heinzi

1
Anche TzdbZoneLocation di NodaTime usa double.
Rick Davin

4
1) Considererei punto fisso. 2) Poiché spesso è necessario eseguire operazioni trigonometriche su coordinate geografiche, e quelle sono implementate solo per double, doublepotrebbe essere la soluzione migliore.
CodesInChaos

Risposte:


120

Prova double, ci sono diversi motivi.

  • Le funzioni trigonometriche sono disponibili solo per il doppio
  • La precisione del doppio (gamma di 100 nanometri) è molto al di là di qualsiasi cosa tu possa mai richiedere per i valori Lat / Lon
  • La classe GeoCoordinate e i moduli di terze parti (ad esempio DotSpatial ) utilizzano anche double per le coordinate

74

Un double ha fino a 15 cifre decimali di precisione. Quindi, supponiamo che tre di queste cifre si trovino a sinistra del punto decimale per i valori lat / long (massimo 180deg). Ciò lascia 12 cifre di precisione sulla destra. Poiché un grado di latitudine / longitudine è ~ 111 km, 5 di queste 12 cifre ci darebbero precisione al metro. 3 cifre in più ci darebbero una precisione millimetrica. Le restanti 4 cifre ci porterebbero una precisione di circa 100 nanometri. Dal momento che il doppio vincerà dal punto di vista delle prestazioni e della memoria, non vedo alcun motivo per prendere in considerazione anche l'uso dei decimali.


2
Più uno per una spiegazione dettagliata e precisa.
Najeeb

4

Ho affrontato questa domanda un po 'di tempo fa quando ho iniziato con la programmazione spaziale. Qualche tempo fa ho letto un libro che mi ha portato a questo.

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

Questo è il modo migliore quando si lavora nella propria applicazione con dati spaziali. quindi per salvare i dati utilizzare questo in sql

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

altrimenti, se stai usando qualcos'altro che non è sql, basta convertire il punto in esadecimale e memorizzarlo. So dopo molto tempo che uso lo spazio spaziale che questo è il più sicuro.


Ho problemi a trovare LatLonPoint, quali riferimenti o pacchetti dovevi includere o quali "utilizzi" nel tuo progetto c #? (supponendo che la tabella di creazione fosse per il modello di identità / codice c #, perché quel tipo non viene valutato neanche in SSMS). Grazie in anticipo!
Chris

0

Doppio

Combinando le risposte è come Microsoft lo rappresenta nella libreria SqlGeography

[get: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] pubblico System.Data.SqlTypes.SqlDouble Lat {get; } Valore proprietà SqlDouble Un valore SqlDouble che specifica la latitudine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.