Obtener la posición del mapa cuando WGS-84 lat / lon cuando se dan las esquinas superior izquierda e inferior derecha 'lat / lon

StackOverflow https://stackoverflow.com/questions/1415375

  •  06-07-2019
  •  | 
  •  

Pregunta

Supongamos que tengo un mapa, por ejemplo de openstreetmaps.org. Sé el WGS-84 lat / lon de la esquina superior izquierda y la esquina inferior derecha del mapa. ¿Cómo puedo encontrar otras posiciones en el mapa a partir de las coordenadas lat / lon WGS-84?

¿Fue útil?

Solución

Si el mapa está aproximadamente a nivel de calle / ciudad, utiliza una proyección de mercator (como < a href = "http://www.openstreetmap.org" rel = "nofollow noreferrer"> openstreetmap.org parece), y no está demasiado cerca de los polos, la interpolación lineal puede ser lo suficientemente precisa. Asumiendo lo siguiente:

  • TL = lat / lon de la esquina superior izquierda
  • BR = lat / lon de la esquina inferior derecha
  • P = lat / lon del punto que desea ubicar en el mapa
  • (w, h) = ancho y alto del mapa que tiene (¿píxeles?)
  • el origen de la imagen del mapa, (0,0), está en su esquina superior izquierda

, podríamos interpolar la posición (x, y) correspondiente a P como:

x = w * (P.lon - TL.lon) / (BR.lon - TL.lon)
y = h * (P.lat - TL.lat) / (BR.lat - TL.lat)

Gotcha común:

  • La convención de notación lat / lon enumera primero la latitud y la longitud en segundo lugar, es decir, vertical. antes de "horizontal". Esto es opuesto a la notación común x, y de las coordenadas de la imagen.

  • Los valores de latitud aumentan cuando se dirige hacia el norte (`` arriba ''), mientras que las coordenadas y en la imagen del mapa pueden aumentar al bajar.

  • Si el mapa cubre un área más grande, la interpolación lineal no será tan precisa para las latitudes. Para un mapa que abarca un grado de latitud y se encuentra en las zonas habitables de la tierra (por ejemplo, el área de la bahía), la latitud central estará apagada en un 0.2% más o menos, lo que probablemente sea menor a un píxel (dependiendo del tamaño)

¡Si eso es lo suficientemente preciso para sus necesidades, puede detenerse aquí!

La matemática más precisa para pasar de la latitud de P a una posición de píxel y comenzaría con la matemática de mercator. Sabemos que para una latitud P.lat, la posición Y en una proyección que comienza en el ecuador sería la siguiente (usaré una Y mayúscula, a diferencia del valor y que estamos buscando, Y comienza en el ecuador y aumenta hacia el norte):

Y = k * ln((1 + sin(P.lat)) / (1 - sin(P.lat)))

La constante k depende de la escala vertical del mapa, que quizás no sepamos. Afortunadamente, se puede deducir observando que y (TL) - y (BR) = h. Eso nos lleva:

k = h / (ln((1 + sin(TL.lat)) / (1 - sin(TL.lat))) - ln((1 + sin(BR.lat)) / (1 - sin(BR.lat))))

(¡ay! ¡son cuatro niveles de paréntesis!) Con k conocido, ahora tenemos la fórmula para averiguar la posición Y de cualquier latitud. Solo necesitamos corregir: (1) nuestro valor y comienza en TL.lat, no en el ecuador, y (2) y crece hacia el sur, en lugar de hacia el norte. Esto nos lleva:

Y(TL.lat) = k * ln((1 + sin(TL.lat)) / (1 - sin(TL.lat)))
Y(P.lat)  = k * ln((1 + sin(P.lat )) / (1 - sin(P.lat )))
y(P.lat)  = -(Y(P.lat) - Y(TL.lat))

Entonces esto te hace:

x = w * (P.lon - TL.lon) / (BR.lon - TL.lon) // like before
y = -(Y(P.lat) - Y(TL.lat))                  // where Y(anything) depends just on h, TL.lat and BR.lat 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top