Double ou décimal pour les valeurs de latitude / longitude en C #


96

Quel est le meilleur type de données à utiliser lors du stockage de données géographiques en C #? J'utiliserais décimal pour son exactitude, mais les opérations sur les nombres décimaux à virgule flottante sont plus lentes que les nombres binaires à virgule flottante (double).

J'ai lu que la plupart du temps, vous n'aurez plus besoin de 6 ou 7 chiffres de précision pour la latitude ou la longitude. L'inexactitude des doubles compte-t-elle même alors ou peut-elle être ignorée?


6
Je poserais la question opposée: la différence de performance a-t-elle même une importance ou peut-elle être ignorée?
Heinzi

1
Dans la base de données, vous devez utiliser le "type de données spatiales sql" pour stocker la longitude et la latitude
azhar_SE_nextbridge

8
Notez que le .NET BCL lui-même utilise des doubles dans sa classe GeoCoordinate , ce qui est une forte indication que la précision peut être suffisante.
Heinzi

1
TzdbZoneLocation de NodaTime utilise également le double.
Rick Davin

4
1) Je considérerais le point fixe. 2) Étant donné que vous devez souvent effectuer des opérations trigonométriques sur des coordonnées géographiques, et que celles-ci ne sont implémentées que pour double, cela doublepourrait être le meilleur ajustement.
CodesInChaos

Réponses:


120

Allez double-y, il y a plusieurs raisons.

  • Les fonctions trigonométriques ne sont disponibles que pour les
  • La précision du double (plage de 100 nanomètres) est bien au-delà de tout ce dont vous aurez besoin pour les valeurs Lat / Lon
  • La classe GeoCoordinate et les modules tiers (par exemple DotSpatial ) utilisent également le double pour les coordonnées

75

Un double a jusqu'à 15 chiffres décimaux de précision. Supposons donc que trois de ces chiffres se trouvent à gauche de la virgule décimale pour les valeurs lat / long (max de 180 degrés). Cela laisse 12 chiffres de précision sur la droite. Étant donné qu'un degré de lat / long est d'environ 111 km, 5 de ces 12 chiffres nous donneraient une précision au mètre. 3 chiffres de plus nous donneraient une précision au millimètre. Les 4 chiffres restants nous permettraient d'obtenir une précision d'environ 100 nanomètres. Étant donné que le double gagnera du point de vue des performances et de la mémoire, je ne vois aucune raison d'envisager même d'utiliser le décimal.


2
Plus un pour une explication détaillée et précise.
Najeeb

4

J'ai été confronté à cette question il y a un certain temps lorsque j'ai commencé la programmation spatiale. J'ai lu il y a quelque temps un livre qui m'a amené à cela.

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

C'est la meilleure façon de travailler dans votre application avec des données spatiales. puis pour enregistrer les données, utilisez ceci dans sql

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

sinon, si vous utilisez quelque chose d'autre qui n'est pas SQL, convertissez simplement le point en hexadécimal et stockez-le. Je sais qu'après une longue période d'utilisation spatiale, c'est le plus sûr.


J'ai du mal à trouver LatLonPoint, quelles références ou packages avez-vous dû inclure ou quelles «utilisations» dans votre projet c #? (en supposant que la table de création était pour le modèle d'identité / code c #, car ce type ne s'évalue pas non plus dans SSMS). Merci d'avance!
Chris

0

Double

En combinant les réponses, c'est ainsi que Microsoft le représente lui-même dans la bibliothèque SqlGeography

[get: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] public System.Data.SqlTypes.SqlDouble Lat {get; } Valeur de la propriété SqlDouble Une valeur SqlDouble qui spécifie la latitude.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.