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

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

J’ai lu que la plupart du temps, vous n’avez pas besoin de plus de 6 ou 7 chiffres de précision pour la latitude ou la longitude. Est-ce que l’inexactitude du double est importante ou peut-elle être ignorée?

Aller pour le double, il y a plusieurs raisons.

  • Les fonctions sortinggonomésortingques ne sont disponibles que pour les doubles
  • La précision du double dépasse de loin tout ce dont vous avez besoin pour les valeurs Lat / Lon
  • Les modules GeoCoordinate Class et tiers (par exemple DotSpatial ) utilisent également le double pour les coordonnées

Un double a jusqu’à 15 chiffres décimaux de précision. Donc, supposons que trois de ces chiffres vont être à gauche du séparateur décimal pour les valeurs lat / long (max de 180deg). Cela laisse 12 chiffres de précision à droite. Étant donné qu’un degré de latitude / longitude est d’environ 111 km, 5 de ces 12 chiffres nous donneraient une précision au mètre. 3 chiffres supplémentaires nous donneraient une précision au millimètre. Les 4 chiffres restants nous apporteraient une précision d’environ 100 nanomètres. Puisque le double va gagner du sharepoint vue de la performance et de la mémoire, je ne vois aucune raison d’envisager d’utiliser le décimal.

J’ai fait face à cette question il y a quelque temps lorsque j’ai commencé avec la programmation spatiale. J’ai lu un livre il y a quelque temps qui m’a conduit à ceci.

 //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. alors pour enregistrer les données utilisez ceci en sql

 CREATE TABLE myGeoTable { LatLonPoint GEOMETRY } 

Sinon, si vous utilisez quelque chose d’autre qui n’est pas SQL, il suffit de convertir le point en hexadécimal et de le stocker. Je sais qu’après de longues périodes d’utilisation d’espaces, c’est le plus sûr.