2009-07-26 14 views
75

Tengo algunos puntos de coordenadas centrados en la tierra como latitud y longitud (WGS-84).Conversión de longitud latitud a coordenadas cartesianas

¿Cómo puedo convertirlos en coordenadas cartesianas (x, y, z) con el origen en el centro de la tierra?

+0

¿Ha logrado convertir la longitud y la latitud WGS-84 en coordenadas cartesianas? También tengo elevación. He intentado la respuesta aceptada aquí, pero no me da la respuesta correcta. Comparé mis resultados con este sitio web: http://www.apsalin.com/convert-geodetic-to-cartesian.aspx. – Yasmin

Respuesta

33

Recientemente he hecho algo similar a esto usando "Haversine Formula" en los datos WGS-84, que es un derivado de la "Ley de Haversines" con resultados muy satisfactorios.

Sí, WGS-84 supone que la Tierra es un elipsoide, pero creo que solo obtiene un error medio de 0.5% con un enfoque como la "Fórmula Haversine", que puede ser una cantidad aceptable de error en su caso. Siempre tendrá un poco 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ígido compatible con WGS-84, busque la fórmula de Vincenty."

entiendo de dónde starblue está viniendo, pero buena ingeniería de software es a menudo acerca de compensaciones, así que todo depende de la precisión que necesita para lo que está haciendo. Por ejemplo, el resultado calculado de" Manhattan Distancia La fórmula "versus el resultado de la" Fórmula de distancia "puede ser mejor para ciertas situaciones, ya que es computacionalmente menos costosa. Piense en" ¿cuál es el punto más cercano? "Donde no necesita una medición de distancia precisa.

la "Fórmula Haversine" es fácil de implementar y es agradable porque usa "Trigonometría Esférica" ​​en lugar de un enfoque basado en la Ley de Coseno que se basa en la trigonometría bidimensional, por lo tanto obtienes un buen ba lanza de precisión sobre complejidad.

un caballero por el nombre de 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 tu pregunta de conversión x/y.

+1

0.5% error - 0.5% de qué? En el contexto de esta pregunta, podría ser el radio de la tierra, por lo que el 0,5% podría ser de 30 km :) – MarkJ

+1

Ha revisado su enlace. La cotización del 0.5% es por error en la distancia del círculo máximo entre dos puntos, por lo que no es estrictamente relevante para esta pregunta. Pensaría que al convertir long-long a coordenadas cartesianas con el origen en el centro de la tierra, los errores de asumir una tierra esférica podrían ser significativos. No está claro qué quiere ** hacer ** el ponente con las coordenadas cartesianas. ¿O es más conveniente trabajar en ellos por alguna extraña razón, o quizás es un requisito para la exportación de datos? Si esto último, la precisión sería importante. – MarkJ

92

Aquí está la respuesta que encontré:

sólo para hacer la definición completa, en el sistema de coordenadas cartesianas:

  • el eje X pasa por mucho tiempo, lat (0,0), por lo que la longitud 0 se encuentra con el ecuador;
  • el eje y pasa (0,90);
  • y el eje z pasa por los polos.

La conversión es:

x = R * cos(lat) * cos(lon) 

y = R * cos(lat) * sin(lon) 

z = R *sin(lat) 

Donde R es the approximate radius of earth (por ejemplo 6371KM).

Si sus funciones trigonométricas esperan radianes (lo que probablemente hacen), primero tendrá que convertir su longitud y latitud en radianes. Obviamente, necesita una representación decimal, no grados \ minutos \ segundos (consulte e.g. here sobre la conversión).

La fórmula para la conversión de nuevo:

lat = asin(z/R) 
    lon = atan2(y, x) 

asin es de sine curso arco. read about atan2 in wikipedia. No te olvides de convertir de radianes a grados.

This page da código C# para esto (en cuenta que es muy diferente de las fórmulas), y también alguna explicación y el diagrama agradable de por qué esto es correcto,

+11

-1 Esto está mal. Estás asumiendo que la tierra es una esfera, mientras que WGS-84 asume un elipsoide. – starblue

+20

@starblue: No estoy seguro de que esté en posición de etiquetar la respuesta "correcta" o "incorrecta". La aproximación esférica (para obtener coordenada x, y, z de estilo ECEF) usando lat/lngs disponibles (que están referenciados a WGS-84) es "adecuada" para las necesidades del afiche original, o "no adecuada". Para las estimaciones de distancia y rumbo, apostaría que esta simple conversión está bien. Si está lanzando satélites, tal vez no. Después de todo, WGS-84 en sí mismo está "equivocado" ... en que no es un modelo perfecto de la superficie de la tierra; todos los modelos elipsoidales son aproximaciones. Lástima que OP no nos dijo lo que estaba tratando de hacer. –

+8

@Dan H La pregunta es por WGS-84, y si responde algo más, al menos debe discutir las diferencias/error, que esta respuesta no. – starblue

6

¿Por qué poner en práctica algo que ya ha sido implementado y Ensayos ¿probado?

C#, para uno, tiene el NetTopologySuite que es el puerto .NET de JTS Topology Suite.

Específicamente, tiene un error grave en su cálculo. La tierra no es una esfera perfecta, y la aproximación del radio de la tierra podría no cortarse para mediciones precisas.

Si en algunos casos es aceptable usar funciones homebrew, GIS es un buen ejemplo de un campo en el que se prefiere mucho usar una biblioteca confiable y probada.

+1

+1. Usar una biblioteca confiable es más preciso que una función homebrew y también ** más fácil **. – MarkJ

+4

¿Cómo se convierte NetTopologySuite de larga/tardía a carrito? – vinayan

+1

NTS no incluye capacidades de conversión de coordenadas, tal vez necesite Proj.NET http://projnet.codeplex.com –

3

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 obtiene datos de altitud de un dispositivo GPS).

+0

Votación ascendente aunque no haya publicado el contenido del enlace aquí. –

1
Coordinate[] coordinates = new Coordinate[3]; 
coordinates[0] = new Coordinate(102, 26); 
coordinates[1] = new Coordinate(103, 25.12); 
coordinates[2] = new Coordinate(104, 16.11); 
CoordinateSequence coordinateSequence = new CoordinateArraySequence(coordinates); 

Geometry geo = new LineString(coordinateSequence, geometryFactory); 

CoordinateReferenceSystem wgs84 = DefaultGeographicCRS.WGS84; 
CoordinateReferenceSystem cartesinaCrs = DefaultGeocentricCRS.CARTESIAN; 

MathTransform mathTransform = CRS.findMathTransform(wgs84, cartesinaCrs, true); 

Geometry geo1 = JTS.transform(geo, mathTransform); 
+0

¿Sería capaz de elaborar? I [creado] (https://gist.github.com/2787570) una aplicación simple que jerarca para transformar una sola coordenada utilizando su enfoque. Sin embargo, siempre falla, ya que las dimensiones de la fuente (2) y las dimensiones del objetivo (3) son diferentes, lo que da como resultado una excepción 'java.lang.IllegalArgumentException: dimension debe ser <= 3 ' – oschrenk

+0

Hmmm ... Miré a JTS por un momento. Las líneas hasta e incluyendo el nuevo LineString() se ven como JTS. Pero no veo las cosas de CRS y Transform en JTS. Entonces, ¿están allí y los extraño? ¿Estuvieron allí, y se eliminaron en 1.12? O: ¿es esa una biblioteca diferente? –

6

teoría para convertir GPS(WGS84) a coordenadas cartesianas https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

La siguiente es lo que estoy utilizando:

  • Longitud GPS (WGS84) y las coordenadas cartesianas son los mismos .
  • Latitud necesita ser convertido por WGS 84 elipsoide parámetros eje semi-mayor es 6378137 m, y
  • Reciprocal de aplanamiento es 298.257223563.

Os adjunto un código VB escribí:

Imports System.Math 

'Input GPSLatitude is WGS84 Latitude,h is altitude above the WGS 84 ellipsoid 

Public Function GetSphericalLatitude(ByVal GPSLatitude As Double, ByVal h As Double) As Double 

     Dim A As Double = 6378137 'semi-major axis 
     Dim f As Double = 1/298.257223563 '1/f Reciprocal of flattening 
     Dim e2 As Double = f * (2 - f) 
     Dim Rc As Double = A/(Sqrt(1 - e2 * (Sin(GPSLatitude * PI/180)^2))) 
     Dim p As Double = (Rc + h) * Cos(GPSLatitude * PI/180) 
     Dim z As Double = (Rc * (1 - e2) + h) * Sin(GPSLatitude * PI/180) 
     Dim r As Double = Sqrt(p^2 + z^2) 
     Dim SphericalLatitude As Double = Asin(z/r) * 180/PI 
     Return SphericalLatitude 
End Function 

Por favor, observe que la h es altitud por encima del WGS 84 ellipsoid.

Por lo general, GPS nos dará H de la altura de MSL. La altura MSL tiene que ser convertido a la altura por encima de la hWGS 84 ellipsoid utilizando el modelo de 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 profesionalGPS tiene Altitud H (MSL, Altura sobre el nivel del mar) y UNDULATION, la relación entre el geoid y la ellipsoid (m) de los elegidos salida dato de tabla interna. puede obtener h = H(msl) + undulation

Para XYZ por las coordenadas cartesianas:

x = R * cos(lat) * cos(lon) 

y = R * cos(lat) * sin(lon) 

z = R *sin(lat) 
+0

¿Cuál es el valor de R? – eych

+0

Supongo que es el radio de la esfera, que es 6371km para la tierra. – Matthias

1

El software proj.4 ofrece un programa de línea de comandos que puede hacer la conversión, por ejemplo,

LAT=40 
LON=-110 
echo $LON $LAT | cs2cs +proj=latlong +datum=WGS84 +to +proj=geocent +datum=WGS84 

También proporciona una C API. En particular, la función pj_geodetic_to_geocentric hará la conversión sin tener que configurar primero un objeto de proyección.

Cuestiones relacionadas