Was ist der beste Datentyp für die Speicherung von Geopositionsdaten in C #? Ich würde Dezimalstellen für die Genauigkeit verwenden, aber Operationen mit dezimalen Gleitkommazahlen sind langsamer als binäre Gleitkommazahlen (doppelt).
Ich habe gelesen, dass Sie die meiste Zeit nicht mehr als 6 oder 7 Stellen Genauigkeit für Breiten- oder Längengrade benötigen. Ist die Ungenauigkeit von Doppel dann überhaupt von Bedeutung oder kann sie ignoriert werden?
c#
latitude-longitude
geopoints
KRTac
quelle
quelle
double
, ist diesdouble
möglicherweise die beste Lösung.Antworten:
Gehen Sie für
double
, gibt es mehrere Gründe.quelle
Ein Double hat eine Genauigkeit von bis zu 15 Dezimalstellen. Nehmen wir also an, drei dieser Ziffern befinden sich für Lat / Long-Werte (max. 180 Grad) links vom Dezimalpunkt. Dadurch bleiben rechts 12 Stellen Genauigkeit. Da ein Lat / Long-Grad ~ 111 km beträgt, würden 5 dieser 12 Ziffern uns Präzision für das Messgerät geben. 3 weitere Ziffern würden uns millimetergenau machen. Die verbleibenden 4 Stellen würden uns eine Genauigkeit von etwa 100 Nanometern bringen. Da Double aus Sicht von Leistung und Gedächtnis gewinnen wird, sehe ich keinen Grund, überhaupt die Verwendung von Dezimalzahlen in Betracht zu ziehen.
quelle
Ich habe mich vor einiger Zeit mit dieser Frage befasst, als ich mit der räumlichen Programmierung begann. Ich habe vor einiger Zeit ein Buch gelesen, das mich dazu geführt hat.
//SqlGeography.Point(dblLat, dblLon, srid)
Dies ist der beste Weg, wenn Sie in Ihrer Anwendung mit räumlichen Daten arbeiten. Um die Daten zu speichern, verwenden Sie diese in SQL
Andernfalls, wenn Sie etwas anderes verwenden, das nicht SQL ist, konvertieren Sie den Punkt einfach in hexadezimal und speichern Sie ihn. Ich weiß nach langer Zeit mit Spacial, dass dies am sichersten ist.
quelle
Doppelt
Durch die Kombination der Antworten wird es von Microsoft selbst in der SqlGeography-Bibliothek dargestellt
[get: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] public System.Data.SqlTypes.SqlDouble Lat {get; } Eigenschaftswert SqlDouble Ein SqlDouble-Wert, der den Breitengrad angibt.
quelle