web-dev-qa-db-fra.com

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éopositionnelles en C #? J'utiliserais décimale pour son exactitude, mais les opérations sur les nombres décimaux en virgule flottante sont plus lentes que les nombres à virgule flottante binaires (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 des doublons importe alors ou peut-elle être ignorée?

71
KRTac

Optez pour le double, il y a plusieurs raisons.

  • Les fonctions trigonométriques ne sont disponibles que pour les doubles
  • La précision du double (plage de 100 nanomètres) dépasse de loin tout ce dont vous aurez besoin pour les valeurs lat/long
  • GeoCoordinate Class et les modules tiers (par exemple, DotSpatial ) utilisent également double pour les coordonnées
92
Wernfried Domscheit

Un double a jusqu'à 15 chiffres décimaux de précision. Supposons donc que trois de ces chiffres vont se trouver à gauche de la virgule décimale pour les valeurs lat/long (max de 180 degrés). Cela laisse 12 chiffres de précision à droite. Comme 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 supplémentaires nous donneraient une précision au millimètre près. Les 4 chiffres restants nous donneraient une précision d'environ 100 nanomètres. Puisque double gagnera du point de vue des performances et de la mémoire, je ne vois aucune raison de penser à l’utilisation de la décimale.

49
MarkPflug

J'ai fait face à cette question il y a un bon bout de temps quand j'ai commencé avec la programmation spatiale. J'ai lu un livre il y a quelque temps qui m'a amené à 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. puis pour sauvegarder les données, utilisez ceci en sql

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

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

5
Jonny