Tengo algunos puntos de coordenadas centrados en la Tierra dados como latitud y longitud ( WGS-84 ).
¿Cómo puedo convertirlos a coordenadas cartesianas (x, y, z) con el origen en el centro de la tierra?
mapping
geometry
geospatial
daphshez
fuente
fuente
Respuestas:
Recientemente he hecho algo similar a esto usando la "Fórmula de Haversine" en datos de WGS-84, que es un derivado de la "Ley de Haversines" con resultados muy satisfactorios.
Sí, WGS-84 asume que la Tierra es un elipsoide, pero creo que solo obtienes un error promedio de 0.5% usando un enfoque como la "Fórmula Haversine", que puede ser una cantidad aceptable de error en tu caso. Siempre tendrá una cierta cantidad de error a menos que esté hablando de una distancia de unos pocos pies e incluso entonces hay una curvatura teórica de la Tierra ... Si necesita un enfoque más rígidamente compatible con WGS-84, consulte la "Fórmula Vincenty".
Entiendo de dónde viene starblue , pero una buena ingeniería de software a menudo se trata de compensaciones, por lo que todo depende de la precisión que requiera para lo que está haciendo. Por ejemplo, el resultado calculado a partir de la "Fórmula de distancia de Manhattan" frente al resultado de la "Fórmula de distancia" puede ser mejor para determinadas situaciones, ya que es computacionalmente menos costoso. Piense en "¿qué punto está más cerca?" escenarios en los que no necesita una medición de distancia precisa.
En cuanto a la "Fórmula de Haversine", es fácil de implementar y es agradable porque utiliza "Trigonometría esférica" en lugar de un enfoque basado en la "Ley de los cosenos" que se basa en la trigonometría bidimensional, por lo que se obtiene un buen equilibrio de precisión. sobre la complejidad.
Un caballero llamado Chris Veness tiene un gran sitio web en http://www.movable-type.co.uk/scripts/latlong.html que explica algunos de los conceptos que le interesan y demuestra varias implementaciones programáticas; esto también debería responder a su pregunta de conversión x / y.
fuente
Aquí está la respuesta que encontré:
Solo para completar la definición, en el sistema de coordenadas cartesianas:
La conversión es:
Donde R es el radio aproximado de la Tierra (por ejemplo, 6371 km).
Si sus funciones trigonométricas esperan radianes (lo que probablemente es así), primero deberá convertir su longitud y latitud a radianes. Obviamente, necesita una representación decimal, no grados \ minutos \ segundos (consulte, por ejemplo, aquí sobre la conversión).
La fórmula para la conversión inversa:
asin es, por supuesto, arc sine. leer acerca de atan2 en wikipedia . No olvide convertir de radianes a grados.
Esta página proporciona el código c # para esto (tenga en cuenta que es muy diferente de las fórmulas), y también una explicación y un buen diagrama de por qué esto es correcto.
fuente
Teoría para convertir
GPS(WGS84)
a coordenadas cartesianas https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinatesLo siguiente es lo que estoy usando:
Adjunté un código VB que escribí:
Tenga en cuenta que la
h
altitud es superior aWGS 84 ellipsoid
.Normalmente
GPS
nos dará una alturaH
superiorMSL
. LaMSL
altura debe convertirse en altura porh
encima de laWGS 84 ellipsoid
utilizando el modelo geopotencialEGM96
( Lemoine et al, 1998 ).Esto se hace interpolando una cuadrícula del archivo de altura del geoide con una resolución espacial de 15 minutos de arco.
O si tiene algún nivel profesional
GPS
tiene AltitudH
( msl, altura por encima del nivel medio del mar ) yUNDULATION
, la relación entre elgeoid
y elellipsoid (m)
de la salida de referencia elegida de la tabla interna. puedes obtenerh = H(msl) + undulation
A XYZ por coordenadas cartesianas:
fuente
El software proj.4 proporciona un programa de línea de comandos que puede realizar la conversión, por ejemplo
También proporciona una API C . En particular, la función
pj_geodetic_to_geocentric
hará la conversión sin tener que configurar primero un objeto de proyección.fuente
En python3.x se puede hacer usando:
fuente
Si le interesa obtener coordenadas basadas en un elipsoide en lugar de una esfera, eche un vistazo a http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF : proporciona las fórmulas y las constantes WGS84 que necesita para la conversión .
Las fórmulas allí también tienen en cuenta la altitud relativa a la superficie del elipsoide de referencia (útil si está obteniendo datos de altitud de un dispositivo GPS).
fuente
¿Por qué implementar algo que ya ha sido implementado y probado?
C #, por ejemplo , tiene NetTopologySuite, que es el puerto .NET de JTS Topology Suite.
Específicamente, tiene una falla grave en su cálculo. La Tierra no es una esfera perfecta, y la aproximación del radio de la Tierra podría no ser suficiente para obtener medidas precisas.
Si en algunos casos es aceptable usar funciones caseras, GIS es un buen ejemplo de un campo en el que se prefiere usar una biblioteca confiable y probada.
fuente
fuente
java.lang.IllegalArgumentException: dimension must be <= 3
Puede hacerlo de esta manera en Java.
fuente