Saltar al contenido

Conversión de longitud/latitud a coordenadas X/Y

Ten en cuenta que en las ciencias un problema casi siempre tiene más de una resoluciones, por lo tanto aquí mostramos lo más óptimo y eficiente.

Solución:

El gran problema con el trazado de mapas es que la superficie esférica de la Tierra no se puede convertir convenientemente en una representación plana. Hay un montón de proyecciones diferentes que intentan resolver esto.

Mercator es uno de los más simples: asume que las líneas de igual latitud son paralelas horizontales, mientras que las líneas de igual longitud son paralelas verticales. Esto es válido para latitud (1 grado de latitud equivale aproximadamente a 111 km estés donde estés), pero no para longitud (la distancia superficial de un grado de longitud es proporcional al coseno de la latitud).

Sin embargo, siempre que esté por debajo de los 45 grados (que es lo que ocurre en la mayor parte de Minnesota), una proyección de Mercator funciona muy bien y crea las formas que la mayoría de las personas reconocerán en los mapas de sus escuelas primarias. Y es muy simple: simplemente trate los puntos como coordenadas absolutas y amplíelos al espacio en el que los esté dibujando. No se necesita trigonometría.

Recuerde que el aspecto de un mapa depende de la proyección utilizada para representar el mapa. Google Maps parece usar una proyección de Mercator (o algo muy similar). ¿A qué proyección equivale su algoritmo? Si desea que su representación 2D se parezca a la de Google, debe usar una proyección idéntica.

Para convertir lat/lon/alt (lat en grados norte, lon en grados este, alt en metros) a coordenadas fijas centradas en la Tierra (x,y,z), haga lo siguiente:

double Re = 6378137;
double Rp = 6356752.31424518;

double latrad = lat/180.0*Math.PI;
double lonrad = lon/180.0*Math.PI;

double coslat = Math.cos(latrad);
double sinlat = Math.sin(latrad);
double coslon = Math.cos(lonrad);
double sinlon = Math.sin(lonrad);

double term1 = (Re*Re*coslat)/
  Math.sqrt(Re*Re*coslat*coslat + Rp*Rp*sinlat*sinlat);

double term2 = alt*coslat + term1;

double x=coslon*term2;
double y=sinlon*term2;
double z = alt*sinlat + (Rp*Rp*sinlat)/
  Math.sqrt(Re*Re*coslat*coslat + Rp*Rp*sinlat*sinlat);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *