J'ai quelques points de coordonnées centrés sur la terre donnés en latitude et longitude ( WGS-84 ).
Comment puis-je les convertir en coordonnées cartésiennes (x, y, z) avec l'origine au centre de la terre?
mapping
geometry
geospatial
daphshez
la source
la source
Réponses:
J'ai récemment fait quelque chose de similaire en utilisant la "formule Haversine" sur les données WGS-84, qui est un dérivé de la "loi des havresins" avec des résultats très satisfaisants.
Oui, WGS-84 suppose que la Terre est un ellipsoïde, mais je crois que vous n'obtenez qu'une erreur moyenne d'environ 0,5% en utilisant une approche comme la «formule Haversine», ce qui peut être une quantité d'erreur acceptable dans votre cas. Vous aurez toujours une certaine quantité d'erreur à moins que vous ne parliez d'une distance de quelques mètres et même alors il y a théoriquement une courbure de la Terre ... Si vous avez besoin d'une approche plus rigoureusement compatible WGS-84, consultez la "formule Vincenty".
Je comprends d'où vient starblue , mais une bonne ingénierie logicielle est souvent une question de compromis, donc tout dépend de la précision dont vous avez besoin pour ce que vous faites. Par exemple, le résultat calculé à partir de la «formule de distance de Manhattan» par rapport au résultat de la «formule de distance» peut être meilleur dans certaines situations car il est moins coûteux en calcul. Pensez "quel point est le plus proche?" scénarios où vous n'avez pas besoin d'une mesure de distance précise.
En ce qui concerne la "formule Haversine", elle est facile à mettre en œuvre et est agréable car elle utilise la "trigonométrie sphérique" au lieu d'une approche basée sur la "loi des cosinus" qui est basée sur la trigonométrie bidimensionnelle, vous obtenez donc un bel équilibre de précision sur la complexité.
Un gentlemen du nom de Chris Veness a un excellent site Web à http://www.movable-type.co.uk/scripts/latlong.html qui explique certains des concepts qui vous intéressent et montre diverses implémentations programmatiques; cela devrait également répondre à votre question de conversion x / y.
la source
Voici la réponse que j'ai trouvée:
Juste pour rendre la définition complète, dans le système de coordonnées cartésien:
La conversion est:
Où R est le rayon approximatif de la Terre (par exemple, 6371 km).
Si vos fonctions trigonométriques attendent des radians (ce qu'elles font probablement), vous devrez d'abord convertir votre longitude et votre latitude en radians. Vous avez évidemment besoin d'une représentation décimale, pas de degrés \ minutes \ secondes (voir par exemple ici à propos de la conversion).
La formule de la rétro-conversion:
asin est bien sûr un arc sinus. lisez atan2 sur wikipedia . N'oubliez pas de convertir les radians en degrés.
Cette page donne du code c # pour cela (notez que c'est très différent des formules), ainsi que des explications et un joli diagramme expliquant pourquoi c'est correct,
la source
Théorie de la conversion
GPS(WGS84)
en coordonnées cartésiennes https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinatesVoici ce que j'utilise:
J'ai joint un code VB que j'ai écrit:
Veuillez noter que l'
h
altitude est au-dessus duWGS 84 ellipsoid
.Habituellement
GPS
, nous donnera une hauteurH
supérieureMSL
. LaMSL
hauteur doit être convertie en hauteurh
au-dessus de laWGS 84 ellipsoid
en utilisant le modèle géopotentielEGM96
( Lemoine et al, 1998 ).Cela se fait en interpolant une grille du fichier de hauteur du géoïde avec une résolution spatiale de 15 minutes d'arc.
Ou si vous avez un niveau professionnel
GPS
a AltitudeH
( msl, hauteur au-dessus du niveau moyen de la mer ) etUNDULATION
, la relation entre legeoid
et leellipsoid (m)
de la sortie de référence choisie de la table interne. vous pouvez obtenirh = H(msl) + undulation
Vers XYZ par coordonnées cartésiennes:
la source
Le logiciel proj.4 fournit un programme en ligne de commande qui peut faire la conversion, par exemple
Il fournit également une API C . En particulier, la fonction
pj_geodetic_to_geocentric
effectuera la conversion sans avoir à configurer au préalable un objet de projection.la source
Dans python3.x, cela peut être fait en utilisant:
la source
Si vous souhaitez obtenir des coordonnées basées sur un ellipsoïde plutôt qu'une sphère, jetez un œil à http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF - il donne les formules ainsi que les constantes WGS84 dont vous avez besoin pour la conversion .
Les formules y prennent également en compte l'altitude par rapport à la surface de l'ellipsoïde de référence (utile si vous obtenez des données d'altitude à partir d'un appareil GPS).
la source
Pourquoi implémenter quelque chose qui a déjà été implémenté et testé?
C #, pour sa part, a la NetTopologySuite qui est le port .NET de JTS Topology Suite.
Plus précisément, vous avez un grave défaut dans votre calcul. La terre n'est pas une sphère parfaite et l' approximation du rayon de la terre pourrait ne pas la couper pour des mesures précises.
Si dans certains cas il est acceptable d'utiliser des fonctions homebrew, le SIG est un bon exemple d'un domaine dans lequel il est de loin préférable d'utiliser une bibliothèque fiable et éprouvée.
la source
la source
java.lang.IllegalArgumentException: dimension must be <= 3
Vous pouvez le faire de cette façon sur Java.
la source