puntos longitud latitud geograficos euclidiana entre ejemplos distancia calcular python math 3d latitude-longitude data-conversion

python - longitud - formula de haversine ejemplos



Convierta Latitud y Longitud para apuntar en el espacio 3D (3)

Como dijo TreyA, LLA to ECEF es la solución. Ver http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html

Necesito convertir valores de latitud y longitud a un punto en el espacio tridimensional. He estado intentando esto durante aproximadamente 2 horas, pero no obtengo los resultados correctos.

Las coordenadas equirectangulares provienen de openflights.org . Probé varias combinaciones de cos y pecado , pero el resultado nunca se pareció a nuestra pequeña tierra amada.

A continuación, puede ver el resultado de aplicar la conversión que Wikipedia sugiere. Creo que uno puede adivinar desde el contexto qué es c4d.Vector .

def llarToWorld(latit, longit, altid, rad): x = math.sin(longit) * math.cos(latit) z = math.sin(longit) * math.sin(latit) y = math.cos(longit) v = c4d.Vector(x, y, z) v = v * altid + v * rad return v

Rojo: X, verde: Y, azul: Z

Uno puede identificar Norte y Sudamérica, especialmente la tierra alrededor del Golfo de México. Sin embargo, parece algo aplastado y algo así como en el lugar equivocado ...

Como el resultado parece algo rotado, creo que intenté cambiar la latitud y la longitud. Pero ese resultado es algo incómodo.

def llarToWorld(latit, longit, altid, rad): temp = latit latit = longit longit = temp x = math.sin(longit) * math.cos(latit) z = math.sin(longit) * math.sin(latit) y = math.cos(longit) v = c4d.Vector(x, y, z) v = v * altid + v * rad return v

Este es el aspecto del resultado sin convertir los valores.

def llarToWorld(latit, longit, altid, rad): return c4d.Vector(math.degrees(latit), math.degrees(longit), altid)

Pregunta : ¿Cómo puedo convertir la longitud y la latitud correctamente?

Solución

Gracias a TreyA, encontré esta página en mathworks.com. El código que hace su trabajo es el siguiente:

def llarToWorld(lat, lon, alt, rad): # see: http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html f = 0 # flattening ls = atan((1 - f)**2 * tan(lat)) # lambda x = rad * cos(ls) * cos(lon) + alt * cos(lat) * cos(lon) y = rad * cos(ls) * sin(lon) + alt * cos(lat) * sin(lon) z = rad * sin(ls) + alt * sin(lat) return c4d.Vector(x, y, z)

En realidad, cambié y z porque la tierra se rotó entonces, ¡sin embargo, funciona! Ese es el resultado:


He reformateado el código que se mencionó anteriormente aquí, pero lo más importante es que ha omitido algunas de las ecuaciones mencionadas en el enlace proporcionado por Niklas R

def LLHtoECEF(lat, lon, alt): # see http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html rad = np.float64(6378137.0) # Radius of the Earth (in meters) f = np.float64(1.0/298.257223563) # Flattening factor WGS84 Model cosLat = np.cos(lat) sinLat = np.sin(lat) FF = (1.0-f)**2 C = 1/np.sqrt(cosLat**2 + FF * sinLat**2) S = C * FF x = (rad * C + alt)*cosLat * np.cos(lon) y = (rad * C + alt)*cosLat * np.sin(lon) z = (rad * S + alt)*sinLat return (x, y, z)

Resultado de comparación: encontrar ECEF para Los Ángeles, CA (34.0522, -118.40806, 0 elevación)
Mi código:
X = -2516715.36114 metros o -2516.715 km
Y = -4653003.08089 metros o -4653.003 km
Z = 3551245.35929 metros o 3551.245 km

Tu codigo:
X = -2514072.72181 metros o -2514.072 km
Y = -4648117.26458 metros o -4648.117 km
Z = 3571424.90261 metros o 3571.424 km

Aunque en su entorno de rotación de tierra su función producirá una región geográfica correcta para su visualización, NO proporcionará las coordenadas equivalentes de ECEF correctas. Como puede ver, algunos de los parámetros varían en hasta 20 KM, que es un error bastante grande.

Factor de aplanamiento, f depende del modelo que asume para su conversión. Típico, el modelo es WGS 84 ; Sin embargo, hay otros modelos.

Personalmente, me gusta usar este enlace a la Escuela Naval de Posgrado para verificar mis verificaciones de mis conversiones.


no estás haciendo lo que sugiere wikipedia. léelo nuevamente con cuidado.

ellos dicen:

x = r cos(phi) sin(theta) y = r sin(phi) sin(theta) z = r cos(theta)

y entonces:

theta == latitude phi == longitude

y, en tu caso, r = radio + altitud

entonces deberías estar usando:

r = radius + altitude x = r cos(long) sin(lat) y = r sin(long) sin(lat) z = r cos(lat)

tenga en cuenta que la entrada final es cos(lat) (está usando longitud).