2015-01-21 27 views
47

Qual è il miglior tipo di dati da utilizzare quando si memorizzano i dati di posizione in C#? Vorrei usare il decimale per la sua esattezza, ma le operazioni sui numeri decimali in virgola mobile sono più lente dei numeri in virgola mobile binario (doppio).Doppio o decimale per i valori di latitudine/longitudine in C#

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

+3

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

+0

Decimale per una precisione assoluta. Se stai memorizzando milioni su di essi, puoi risparmiare un po 'sulle dimensioni e migliorare un po' le prestazioni usando il doppio, ma trascurabile. –

+1

Nel database è necessario utilizzare "sql spatial data type" per archiviare longitudine e latitudine –

risposta

3

Ho affrontato questa domanda un po 'di tempo fa quando ho iniziato con la programmazione spaziale. Ho letto un libro qualche tempo fa 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 vostra applicazione con i dati spaziali. poi per salvare i dati utilizzare questo in SQL

CREATE TABLE myGeoTable 
{ 
LatLonPoint GEOMETRY 
} 

altro, se si sta utilizzando un'altra cosa che non sta SQL solo convertire il punto in esadecimale e memorizzarlo. Conosco da molto tempo usando spaziale che questo è il più sicuro.

24

Una doppia ha fino a 15 cifre decimali di precisione. Quindi, supponiamo che tre di queste cifre si trovino alla sinistra del punto decimale per valori lat/long (max di 180 gradi). Questo lascia 12 cifre di precisione sulla destra. Dato che un grado di lat/long è ~ 111 km, 5 di quelle 12 cifre ci darebbero precisione al metro. Altre 3 cifre ci darebbero precisione al millimetro. Le restanti 4 cifre ci porteranno con precisione a 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 l'utilizzo del decimale.

+0

Sono convinto (periodo) –

64

Andare per il doppio, ci sono diversi motivi.

  • funzioni trigonometriche sono disponibili solo per il doppio
  • precisione della doppia è di gran lunga al di là di tutto ciò di cui avrete bisogno per Lat/Lon valori
  • moduli di terze parti (ad esempio DotSpatial) utilizzano anche il doppio per le coordinate