82 votes

type approprié/meilleur pour stocker la latitude et la longitude

Dans un langage de programmation de niveau système comme C, C++ ou D, quel est le meilleur type/encodage pour stocker la latitude et la longitude ?

Les options que je vois sont :

  • IEEE-754 FP en degrés ou radians
  • degrés ou radians stockés comme une valeur à virgule fixe dans un int de 32 ou 64 bits
  • mise en correspondance d'un intervalle de nombres entiers avec l'intervalle de degrés : -> deg = (360/2^32)*val
  • degrés, minutes, secondes et fractions de secondes stockés sous forme de champs binaires dans un fichier int.
  • une sorte de structure.

La solution facile (FP) présente l'inconvénient majeur d'avoir une résolution très inégale (quelque part en Angleterre, il peut mesurer en microns, alors qu'au Japon, il ne le peut pas). Elle pose également tous les problèmes de comparaison des PF et autres. Les autres options nécessitent des efforts supplémentaires à différents stades du cycle de vie des données. (génération, présentation, calculs, etc.)

Une option intéressante est un type de précision flottante où, à mesure que la latitude augmente, le nombre de bits augmente et la longitude diminue (car ils se rapprochent l'un de l'autre vers les pôles).

Questions connexes qui ne couvrent pas tout à fait ce sujet :


BTW : 32 bits vous donnent une résolution E/W à l'équateur d'environ 0.3 in. C'est proche de l'échelle à laquelle les GPS de haute qualité peuvent travailler (IIRC, ils peuvent descendre à environ 0,5 pouce dans certains modes).

Par contre, si les 32 bits sont répartis uniformément sur la surface de la terre, vous pouvez indexer des carrés d'environ 344 m de côté, 5 octets donnent 21 m, 6B->1,3 m et 8B->5 mm.

Je n'ai pas d'utilisation spécifique en tête pour le moment, mais j'ai déjà travaillé avec ce genre de choses et je compte bien le faire à nouveau, à un moment donné.

1 votes

Vous avez noté dans quelques commentaires de réponse et dans cette question la question de la résolution. De quelle résolution avez-vous besoin ? Il serait également utile de préciser les opérations que vous devez effectuer. Si vous devez faire des calculs de grand cercle, vous devrez de toute façon convertir en double/float.

1 votes

Une valeur en virgule flottante de 64 bits à double précision n'est-elle pas un meilleur choix que l'int de 32 bits car elle a une plus grande granularité ? C'est un point sur lequel vous avez fait des commentaires. C'est aussi beaucoup plus facile de travailler avec.

44voto

cletus Points 276888

Le plus simple est de le stocker sous la forme d'un flottant/double en degrés. Positif pour N et E, négatif pour S et W. N'oubliez pas que les minutes et les secondes sont en dehors de 60 (donc 31 45'N est 31.75). Il est facile de comprendre quelles sont les valeurs en les regardant et, si nécessaire, la conversion en radians est triviale.

Les calculs sur les latitudes et les longitudes tels que le Grand Cercle La distance entre deux coordonnées dépend fortement des fonctions trigonométriques, qui utilisent généralement des doubles. Tout autre format va dépendre d'une autre implémentation de sinus, cosinus, atan2 et racine carrée, au minimum. Les nombres de précision arbitraire (par exemple BigDecimal en Java) ne fonctionneront pas pour cela. Quelque chose comme l'int où 2^32 est réparti uniformément va avoir des problèmes similaires.

La question de l'uniformité a été soulevée dans plusieurs commentaires. À ce sujet, je me contenterai de noter que la Terre, en ce qui concerne la longitude, n'est pas uniforme. Une seconde d'arc de longitude au cercle arctique est une distance plus courte qu'à l'équateur. Les flotteurs de double précision donnent une précision inférieure au millimètre partout sur la Terre. N'est-ce pas suffisant ? Si non, pourquoi ?

Il convient également de noter ce que vous voulez faire avec ces informations, car les types de calculs dont vous avez besoin auront un impact sur le format de stockage que vous utiliserez.

2 votes

Un point valable, mais qui n'aborde pas ce que j'espérais voir aborder.

1 votes

Cette réponse est celle que j'aurais donnée également - je pense que vous devez clarifier votre question si elle n'y répond pas.

3 votes

Je suis d'accord pour dire que cela répond à la question posée. La plupart des systèmes commerciaux que j'ai utilisés utilisent des degrés ou des radians en interne. L'absence ou l'uniformité est une fonction des définitions de la lattitude et de la longitude, et non de la manière dont elles sont stockées.

23voto

John D. Cook Points 19036

Les longitudes et les latitudes ne sont généralement pas connues avec une précision supérieure à un flottant de 32 bits. Donc, si vous êtes préoccupé par l'espace de stockage, vous pouvez utiliser des flottants. Mais en général, il est plus pratique de travailler avec des nombres sous forme de doubles.

Les radians sont plus pratiques pour les mathématiques théoriques. (Par exemple, la dérivée d'un sinus n'est un cosinus que si l'on utilise des radians). Mais les degrés sont généralement plus familiers et plus faciles à interpréter, c'est pourquoi il est préférable de s'en tenir aux degrés.

0 votes

Un point valable, mais qui n'aborde pas ce que j'espérais voir aborder. (J'ai édité la question pour la clarifier)

0 votes

Quelle résolution souhaitez-vous ?

0 votes

@cletus, La résolution uniforme est plus intéressante que la haute résolution, mais 32 bits répartis uniformément, c'est un ordre de grandeur de tout ce dont j'ai besoin.

13voto

Pykler Points 2698

Une représentation décimale avec une précision de 8 devrait être plus que suffisante selon cet article de wikipedia sur Degrés décimaux .

0 decimal places, 1.0 = 111 km
...
7 decimal places, 0.0000001 = 1.11 cm
8 decimal places, 0.00000001 = 1.11 mm

1 votes

Log_2(365*10^8) ~= 35 donc cela prend ~70 bits, arrondis en octets : 9 octets. Répartis uniformément, 9 octets peuvent résoudre des régions de 0,1 mm^2.

0 votes

Err quoi ? Il faut 35 bits et pour 7 il en faut un peu moins de 32, donc un int est suffisant pour stocker 365 degrés avec 7 décimales si vous les convertissez ensuite en double lors des calculs.

5voto

Christoph Points 64389

Les problèmes que vous avez mentionnés avec les valeurs à virgule flottante pourraient-ils devenir un problème ? Si la réponse est non, je vous suggère d'utiliser simplement la valeur radians en double précision - vous en aurez besoin si vous effectuez des calculs trigonométriques de toute façon.

S'il y a un problème de perte de précision lors de l'utilisation de doubles ou si vous n'avez pas l'intention de faire de la trigonométrie, je suggérerais votre solution de mappage sur une plage d'entiers - cela vous donnera la meilleure résolution, peut facilement être converti en n'importe quel format d'affichage utilisé dans votre région et - après avoir choisi un méridien 0 approprié - peut être utilisé pour convertir en valeurs à virgule flottante de haute précision.

PS : Je me suis toujours demandé pourquoi personne ne semble utiliser les coordonnées sphériques géocentriques - elles devraient être raisonnablement proches des coordonnées géographiques, et ne nécessiteront pas toutes ces mathématiques fantaisistes sur les sphéroïdes pour faire les calculs ; pour le plaisir, j'ai voulu convertir les coordonnées Gauss-Krüger (qui sont utilisées par le Katasteramt allemand) en coordonnées GPS - laissez-moi vous dire que c'était moche : l'une utilise l'ellipsoïde de Bessel, l'autre le WGS84, et la cartographie Gauss-Krüger elle-même est assez folle en soi. ..

1 votes

@Greg : Les coordonnées de Gauss-Krüger sont dérivées des projections cylindriques mais "améliorées" de manière à obtenir des résultats significatifs lorsque vous utilisez votre règle sur une carte (pour certaines valeurs de "significatif" ;)). Tout a commencé quand j'ai pensé : "Hé, ça ne devrait pas être trop compliqué...".

3voto

Greg Hewgill Points 356191

La résolution de 0,3 pouce se rapproche du point où les tremblements de terre sur quelques années font une différence. Vous devriez peut-être reconsidérer la raison pour laquelle vous pensez avoir besoin d'une résolution aussi fine à l'échelle mondiale.

Certains centres d'expansion dans l'océan Pacifique changent jusqu'à 15 cm/an .

0 votes

0.3in est pour les cas uniformes. avec un FP 32bit qui sait ce que vous obtenez comme beaucoup (la plupart ?) des valeurs ne sont plus valides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X