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).