2015-01-21 13 views
47

Welcher ist der beste Datentyp zum Speichern geopositionaler Daten in C#? Ich würde Dezimal für seine Genauigkeit verwenden, aber Operationen auf dezimalen Gleitkommazahlen sind langsamer als binäre Gleitkommazahlen (double).Doppelt oder dezimal für Breiten-/Längengradwerte in C#

Ich lese, dass Sie die meiste Zeit nicht mehr als 6 oder 7 Stellen der Genauigkeit für den Längen- oder Breitengrad benötigen. Spielt die Ungenauigkeit von Doubles dann auch eine Rolle oder kann sie ignoriert werden?

+3

Ich würde die umgekehrte Frage stellen: Ist der Leistungsunterschied sogar wichtig oder kann es ignoriert werden? – Heinzi

+0

Dezimal für absolute Genauigkeit. Wenn Sie Millionen auf ihnen speichern, können Sie ein wenig an Größe sparen und ein wenig Leistung mit doppelter, aber vernachlässigbar verbessern. –

+1

In der Datenbank sollten Sie "sql spatial data type" verwenden, um Längen- und Breitengrade zu speichern –

Antwort

3

Ich habe diese Frage vor einiger Zeit gestellt, als ich mit der räumlichen Programmierung begann. Ich habe vor einiger Zeit ein Buch gelesen, das mich dazu geführt hat.

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

Dies ist die beste Art und Weise, wenn in Ihrer Anwendung mit räumlichen Daten arbeiten. dann die Daten zu speichern, diese verwenden in SQL

CREATE TABLE myGeoTable 
{ 
LatLonPoint GEOMETRY 
} 

sonst, wenn Sie etwas anderes, das ist nicht SQL nur den Punkt konvertieren hexadezimal und speichern Sie es verwenden. Ich weiß nach einer langen Zeit mit Raum, dass dies die sicherste ist.

24

Ein Double hat eine Genauigkeit von bis zu 15 Dezimalziffern. Also nehmen wir an, dass drei dieser Ziffern links von dem Dezimalpunkt für lat/long-Werte (max von 180 deg) sein werden. Dies lässt 12 Ziffern der Genauigkeit auf der rechten Seite. Da ein Grad von lat/long ~ 111 km ist, würden uns 5 dieser 12 Ziffern Genauigkeit geben. 3 weitere Ziffern würden uns millimetergenau geben. Die restlichen 4 Ziffern würden uns Präzision auf rund 100 Nanometer bringen. Da Double aus der Perspektive der Performance und des Gedächtnisses gewinnen wird, sehe ich keinen Grund, auch nur die Verwendung von Dezimalzahlen in Betracht zu ziehen.

+0

Ich bin überzeugt (Zeitraum) –

64

Gehen Sie für Doppel, gibt es mehrere Gründe.

  • trigonometrische Funktionen sind nur verfügbar für Doppel
  • Präzision der doppelt so hoch ist weit über alles, was Sie jemals für Lat/Lon-Wert
  • Module von Drittanbietern (zB DotSpatial) auch für Koordinaten verwenden Doppel erfordern würden