bon/meilleur type pour le stockage de la latitude et de la longitude
Dans un système de niveau de langage de programmation comme C, C++ ou D, quel est le meilleur type/codant pour le stockage de la latitude et de la longitude?
Les options que je vois sont:
- IEEE-754 FP en degrés ou en radians
- degrés ou en radians stocké comme un point fixe de la valeur dans un 32 ou 64 bits int
- cartographie d'un nombre entier de gamme au degré de la gamme: ->
deg = (360/2^32)*val
- degrés, minutes, secondes et fractions de secondes stockées en tant que champs de bits dans un int
- une structure quelconque.
La solution de facilité (FP) a pour principal inconvénient qu'il a fortement non uniforme de résolution (quelque part en Angleterre, il peut mesurer en microns, au Japon, il ne peut pas). Aussi ce a toutes les questions de FP de comparaison et autres joyeusetés. Les autres options nécessitant plus d'efforts dans les différentes parties des données du cycle de vie. (la production, la présentation, calculs, etc.)
Une option intéressante est d'une précision en virgule flottante de type qui, où, comme la Latitude d'augmenter, il devient de plus en plus de bits et la Longitude est moins (comme ils se rapprochent vers les pôles).
Les questions connexes qui ne sont pas tout couvrir ce:
- Qu'est-ce que l'idéal type de données à utiliser lors de l'entreposage de latitude et de longitude dans une base de données MySQL
- De travail avec la latitude/longitude valeurs en Java
BTW: 32 bits vous donne une E/W résolution à l'équateur d'environ 0,3 à. C'est à proximité de l'échelle de haute qualité GPS configurations peuvent travailler à la (IIRC ils peuvent descendre à environ 0,5 dans certains modes).
Otoh, que si les 32 bits de poids est réparti uniformément sur la surface de la terre, vous pouvez indice des carrés d'environ 344m sur un côté, 5 Octets donner 21m, 6B->1,3 m et 8B->5mm.
Je n'ai pas une utilisation spécifique à l'esprit pour l'instant, mais ont travaillé avec ce genre de chose avant et attendre à nouveau, à un certain point.
- Vous l'avez remarqué dans un couple de répondre à des commentaires et à cette question, la question de la résolution. Quelle est la résolution avez-vous besoin? Il avait également être utile de préciser quelles sont les opérations que vous devez effectuer ainsi. Si vous allez faire un Grand Cercle calcs ensuite, vous aurez besoin de les convertir à un lit double ou float, de toute façon.
- N'est-ce pas un 64-bits en virgule flottante double précision de la valeur d'un meilleur choix que la 32 bits de type int car il a une plus grande granularité? C'est quelque chose que vous avez commenté. Il est également plus facile de travailler avec.
- double possible de qu'est-Ce que l'idéal type de données à utiliser lors de l'entreposage de latitude et de longitude dans une base de données MySQL?
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple est juste de le stocker en tant que float/double en degrés. Positif pour N et E, négatif pour S et W. rappelez-vous Juste que les minutes et les secondes sont de 60 (donc 31 45'N est 31.75). Il est facile de comprendre que les valeurs sont en les regardant et, le cas échéant, la conversion en radians, est trivial.
Des calculs sur les latitudes et les longitudes comme le Grand Cercle distance entre deux coordonnées dépendent fortement des fonctions trigonométriques, qui utilisent généralement le double. Tout autre format va s'appuyer sur un autre de mise en œuvre de sinus, cosinus, atan2 et racine carrée, au minimum. Précision arbitraire des nombres (par exemple BigDecimal en Java) de ne pas travailler pour cela. Quelque chose comme l'int où 2^32 est réparti uniformément va avoir des problèmes similaires.
Le point de l'uniformité a venir dans plusieurs commentaires. Sur ce je constate simplement que la Terre, à l'égard de la longitude, n'est pas uniforme. Une seconde d'arc de longitude dans le Cercle Arctique est une distance plus courte qu'à l'Équateur. Double précision flotte de donner des sous-millimètre de précision n'importe où sur Terre. N'est-ce pas suffisant? Si non, pourquoi pas?
Ça aussi intéressant de noter ce que vous voulez faire avec cette information que les types de calculs que vous avez besoin d'avoir un impact sur ce format de stockage que vous utilisez.
Les Longitudes et latitudes sont généralement pas connus pour une plus grande précision de 32 bits à virgule flottante. Donc, si vous êtes inquiet à propos de l'espace de stockage, vous pouvez utiliser des flotteurs. Mais en général, il est plus commode de travailler avec des nombres en double.
Radians sont plus commodes pour théorique de mathématiques. (Par exemple, la dérivée de la fonction sinus cosinus est seulement lorsque vous utilisez radians.) Mais les diplômes sont généralement plus familier et plus facile pour les gens à interpréter, de sorte que vous pouvez coller avec degrés.
Une représentation Décimale avec une précision de 8 devrait être plus que suffisant selon cet article de wikipédia sur Degrés Décimaux.
Les problèmes que vous avez mentionnés, avec des valeurs à virgule flottante devenir un problème? Si la réponse est non, je vous suggère de simplement en utilisant les radians valeur en double précision - vous en aurez besoin si vous allez faire des calculs trigonométriques de toute façon.
Si il pourrait y avoir un problème avec la perte de précision due lors de l'utilisation de doubles ou vous n'aurez pas à faire de la trigonométrie, je vous suggère de votre solution de cartographie pour un intervalle entier - ce qui va vous donner la meilleure résolution, peuvent être facilement convertis quel que soit le format d'affichage que vous avez locale va être l'aide et l'après - choisir un 0-méridien - peut être utilisé pour convertir des valeurs à virgule flottante de haute précision.
PS: je me suis toujours demandé pourquoi il ne semble pas que celui qui utilise géocentrique coordonnées sphériques - ils devraient être assez proches, les coordonnées géographiques, et n'ont pas besoin de toute cette fantaisie de maths sur les sphéroïdes de faire des calculs; pour le fun, j'ai voulu convertir de Gauss-Krüger-Koordinaten (qui sont en cours d'utilisation par l'allemand Katasteramt) à des coordonnées GPS - laissez-moi vous dire, que c'était laid: on utilise l'ellipsoïde de Bessel, les autres WGS84, et Gauss-Krüger la cartographie elle-même est assez dingue sur son propre...
De 0,3 pouces de résolution est d'arriver au point où les tremblements de terre de plus de quelques années de faire une différence. Vous pouvez vouloir reconsidérer pourquoi vous pensez que vous avez besoin d'une telle résolution élevée dans le monde entier.
Certains des centres d'expansion dans l'Océan Pacifique changement de 15 cm/an.
Ce que le codage est "meilleur" dépend vraiment de vos objectifs/besoins.
Si vous effectuez l'arithmétique, la virgule flottante la latitude,la longitude est souvent très pratique. D'autres fois en coordonnées cartésiennes (ie x,y,z) peut être plus commode. Par exemple, si l'on ne se souciait de points sur la surface de la terre, vous pouvez utiliser un n-vecteur.
Que pour l'entreposage à long terme, en virgule flottante IEEE de déchets de bits pour les gammes de vous ne se soucient pas (pour lat/lon) ou pour plus de précision vous pouvez soucient pas dans le cas de coordonnées cartésiennes (sauf si vous souhaitez une très bonne précision à l'origine pour quelque raison que ce soit). Vous pouvez bien sûr la carte ou le type de coordonnées à ints de votre taille préférée, de sorte que l'ensemble de la gamme de dit ints couvre la gamme qui vous intéresse à la résolution que vous vous souciez.
Il existe évidemment d'autres choses à penser que de ne pas gaspiller de bits dans le codage. Par exemple, (Geohashes)[https://en.wikipedia.org/wiki/Geohash] ont la belle propriété qu'il est facile de trouver d'autres geohashes dans la même zone. (La plupart ont le même préfixe, et vous pouvez calculer le préfixe que les autres.) Malheureusement, ils gardent la même précision en degrés de longitude, près de l'équateur que près des pôles. Je suis actuellement à l'aide de 64 bits geohashes pour le stockage, ce qui donne environ 3 m de résolution au niveau de l'équateur.
La Maidenhead Locator a des caractéristiques similaires, mais semble plus optimisé pour communiquer les emplacements entre les êtres humains au lieu de les stocker sur un ordinateur. (Mémorisation de la MLS de chaîne de perdre beaucoup de bits pour certains assez triviale de détection d'erreur.)
Le seul système que j'ai trouvé qu'il prend en charge les pôles différemment, c'est le Military Grid Reference System, bien qu'il semble plus humaine de communication axée sur les résultats. (Et il semble comme une douleur à convertir ou à lat/lon.)
En fonction de ce que vous voulez exactement, vous pouvez utiliser quelque chose de similaire à la Universelle polaire sereographic système de coordonnées près des pôles avec quelque chose de plus gourmand en ressources informatiques sain d'esprit que UTM pour le reste du monde, et d'utiliser plus d'un bit pour indiquer lequel des deux systèmes que vous utilisez. Je dis un peu, car il est peu probable que la plupart des points que vous vous souciez d'seraient près des pôles. Par exemple, vous pourriez utiliser "la moitié un peu" en disant 11 indique l'utilisation du système polaire, tandis que 00, 01 et 10 indiquent l'utilisation de l'autre système, et font partie de la représentation.
Désolé c'est un peu long, mais je voulais sauver ce que j'avais appris récemment. Malheureusement je n'ai pas trouvé toute norme, sain d'esprit, et efficace pour représenter un point sur la terre avec l'uniforme de précision.
Edit: j'ai trouvé une autre approche qui ressemble beaucoup ce que tu voulais, depuis plus directement profite de la moindre précision nécessaire pour la longitude proches des pôles. Il s'avère qu'il ya beaucoup de recherche sur le stockage de vecteurs normaux. Codage de Vecteurs Normaux utilisation Optimisée des Coordonnées Sphériques décrit un tel système pour le codage de vecteurs normaux tout en maintenant un niveau minimum de précision, mais elle pourrait tout aussi bien être utilisé pour coordonnées géographiques.
http://www.esri.com/news/arcuser/0400/wdside.html
Au niveau de l'équateur, une seconde d'arc de longitude est approximativement égale à une seconde d'arc de la latitude, qui est de 1/60e de un mille marin (ou 101.27 pieds ou 30.87 mètres).
Virgule flottante de 32 bits contient 23 explicite bits de données.
180 * 3600 nécessite log2(648000) = 19.305634287546711769425914064259 bits de données. Noter que le bit de signe est stocké séparément et, par conséquent, nous avons besoin à la somme de 180 degrés.
Après soustraction de 23 bits pour log2(648000) il nous reste extra 3.694365712453288230574085935741 bits pour le sous-deuxième de données.
Qui est de 2 ^ 3.694365712453288230574085935741 = 12.945382716049382716049382716053 pièces par seconde.
Donc un type de données float peut avoir 30.87 /12.945382716049382716049382716053 ~= 2.38 mètres de précision à l'équateur.
Un programme Java pour comuting max erreur d'arrondi dans les compteurs de la coulée lat/long valeurs en Float/Double:
De sortie:
Si par "stockage" tu veux dire "tenir dans la mémoire", la vraie question est: qu'allez-vous faire avec eux?
Je soupçonne que, avant ces coordonnées de faire quelque chose d'intéressant, ils ont été entraînés comme radians par le biais des fonctions mathématiques.h. Sauf si vous envisagez sur la mise en œuvre de quelques fonctions transcendantes qui opèrent sur Deg/Min/Sec emballé dans un champ de bits.
Alors pourquoi ne pas garder les choses simples, de les stocker dans la norme IEEE-754 degrés ou en radians à la précision de vos exigences?
Le code suivant packs les coordonnées WGS84 sans perte de coordonnées dans un unsigned long (c'est à dire dans 8 octets):
Source: http://www.dupuis.me/node/35
Grande question!
Je sais que cette question a 9 ans maintenant, et je ne connais qu'une partie de la réponse que vous attendez, mais je suis juste venu ici avoir une question similaire, et beaucoup de choses ont changé depuis que la question a été posée, tels que le matériel et GPSes disponibles. Je travaille avec ce thème très souvent dans le firmware de traiter différents types de GPSes dans différents types d'applications, et ont perdu le compte des heures (et jours) j'ai passé à travailler à "le meilleur design" pour les différentes applications, avec qui j'ai travaillé ou développés.
Comme toujours, différentes solutions sont à fournir des avantages et des coûts, et en fin de compte, un "meilleur design" est toujours un "meilleur ajustement" des avantages et des coûts à l'encontre des exigences du système. Voici certaines choses que j'ai à considérer quand j'ai poser la même question:
Temps CPU Coût
Si le CPU n'est intégré à virgule flottante co-processeur (comme c'est le cas avec de nombreux microcontrôleurs), puis traiter avec 'float', 'double', et "long double" peut être extrêmement coûteux. Par exemple, avec un microcontrôleur 16 bits qui je travaille régulièrement, une multiplication à l'aide de "double", les valeurs des coûts 326 cycles d'horloge du CPU, et une division des coûts 1193 cycles d'horloge. Très cher!
Précision Compromis
À l'équateur, un 'float' (IEEE-754 32 bits à virgule flottante valeur), devant représenter un signé le degré de la valeur, en supposant que 7 "propre" d'importants chiffres décimaux en mesure d'être représenté, le changement de l'un des moins significatif chiffre décimal (par exemple, de 179.9999 à 180.0000) va représenter une distance d'environ 11.12 mètres. Cela peut ou ne peut pas répondre dur système des exigences de précision. Alors qu'un "double" (avec 15 "propre" significative des chiffres représentés, ainsi un changement de 179.999999999999 à 180.000000000000) représente environ 0.00011 mm.
Précision De L'Entrée Limitations
Si vous faites affaire avec l'aide d'un GPS, comment beaucoup de chiffres de réelle précision êtes-vous, et combien avez-vous besoin de conserver?
Temps De Développement, Les Coûts
IEEE-754 64 bits double précision de la valeur ("double") et 32 bits de simple précision de la valeur ('float') sont TRÈS pratique de travailler avec des dans le langage C depuis bibliothèques de mathématiques pour les deux viennent avec pratiquement tous les compilateur C, et sont généralement très fiables. Si votre PROCESSEUR est livré avec un matériel processeur en virgule flottante, c'est un choix facile.
RAM et les Coûts de Stockage
Si vous devez garder un grand nombre de ces valeurs dans la mémoire vive (ou de stockage par exemple MYSQL), la quantité de RAM disponible (et de l'espace de stockage) peuvent avoir un impact sur l'exploitabilité de la solution.
Données disponibles vs Données Requises
Un exemple, je m'occupe à présent de l'écriture (la raison pour laquelle je suis venu ici à cette question), c'est que j'ai affaire à un u-blox GPS M8 qui est capable de me donner binaire des informations GPS (enregistrement de la charge du CPU de la traduction ASCII phrases NMEA). Dans ce format binaire (appelé "UBX Protocole") la latitude et la longitude sont représentés comme signé nombres entiers de 32 bits, dont la représentation est en mesure de représenter l'exactitude (à l'équateur) de descendre à environ 1.11 cm. Par exemple, -105.0269805 degrés de longitude est représenté comme -1050269805 (à l'aide de la totalité des 32 bits) et un LSb changement représente environ 1.11 cm de changement de latitude n'importe où, et 1,11 cm de longitude à l'équateur (et de moins en moins à des latitudes plus élevées, en proportion de le cosinus de la latitude). L'application de ce GPS est en fait des tâches de navigation, qui (déjà existant et bien testé le code) exige que "double" types de données. Malheureusement, la conversion de cet entier IEEE-754 64 bits "double" ne peut pas être fait facilement par un simple mouvement de la base-2 bits de l'entier dans la représentation interne des morceaux de la "double" depuis la virgule changement est effectué à base 10 décimal maj. Ont une base décimale 2 maj au lieu de cela, puis la base-2 bits de l'entier pourrait être déplacé dans la bit-champs de la "double" avec très peu de traduction. Mais hélas, ce n'est pas le cas avec l'entier signé j'ai. Donc, il va me coûter une multiplication sur un CPU qui n'a pas de matériel à virgule flottante du processeur: 326 cycles d'horloge du CPU.
Remarque cette multiplication a été choisi sur ce:
parce que "double" la multiplication est d'environ 3,6 X plus rapide que le "double" de la division sur le CPU que je m'occupe. Telle est la vie dans le microcontrôleur monde. 🙂
Ce qui aurait été GÉNIAL (et peut-être dans l'avenir si je peux épargner le temps le week-end) si les tâches de navigation pourrait être faite directement auprès de l'entier signé 32 bits! Ensuite, aucune conversion n'est nécessaire.... Mais ne serait-il plus rentable de faire les tâches de navigation avec un tel entier? CPU coûts, sans doute beaucoup plus efficace. Le temps de développement, les coûts? C'est une autre question, surtout avec un système déjà en place, qui utilise la norme IEEE-754 64 bits "double" des valeurs! De Plus, il est déjà existants, un logiciel qui fournit des données cartographiques (à l'aide de double degré de valeurs), les logiciels qui devront être converties pour utiliser l'entier signé ainsi -- pas du jour au lendemain tâche!
Une option TRÈS intéressante est directement (sans traduction) représentent les intersections entre les approximations de "rectangles" (en fait, des trapèzes, qui deviennent des triangles aux pôles) à l'aide de la crue de latitude/longitude entiers. Au niveau de l'équateur, ces rectangles aurait des dimensions d'environ 1.11 cm d'est en ouest par 1.11 cm nord-sud, alors qu'à une latitude de Londres, en Angleterre, les dimensions serait d'environ de 0,69 cm d'est en ouest par 1.11 cm nord-sud. Qui peut ou peut ne pas être facile à gérer, selon les besoins de l'application.
De toute façon, j'espère que ces réflexions et de discussions aider les autres qui sont à la recherche à ce sujet pour le "meilleur design", pour leur système.
Salutations,
Vic
Vous pouvez utiliser
decimal
type de données: