Obtener la posición del mapa cuando WGS-84 lat / lon cuando se dan las esquinas superior izquierda e inferior derecha 'lat / lon
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?
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