Obter posição do mapa quando WGS-84 lat / lon quando latitude / longitude são dadas direito cantos superior esquerdo e inferior
Pergunta
Suponha que eu tenho um mapa, por exemplo, de openstreetmaps.org. Eu sei que os WGS-84 lat / lon do canto superior esquerdo e no canto inferior direito do mapa. Como posso encontrar outras posições no mapa de dados WGS-84 lat / lon coordenadas?
Solução
Se o mapa é mais ou menos do nível da rua / cidade, usa um mercator projeção (como < a href = "http://www.openstreetmap.org" rel = "nofollow noreferrer"> openstreetmap.org parece), e não é muito perto dos pólos, interpolação linear pode ser suficiente preciso. Assumindo o seguinte:
- TL = lat / lon do canto superior esquerdo
- BR = lat / lon do canto inferior direito
- P = latitude / longitude do ponto que deseja localizar no mapa
- (w, h) = largura e altura do mapa que você tem (pixels?)
- a origem da imagem do mapa, (0,0), está em seu canto superior esquerdo canto
, que pode interpolar a posição (x, y) correspondente a P como:
x = w * (P.lon - TL.lon) / (BR.lon - TL.lon)
y = h * (P.lat - TL.lat) / (BR.lat - TL.lat)
Common pegadinha de:
-
A latitude / longitude notação listas convenções o primeiro latitude e longitude do segundo, isto é, "vertical" antes "horizontal". Esta é oposta à x comum, notação y de coordenadas de imagem.
-
Os valores de latitude aumentam quando indo em uma direção norte-ward ( "up"), enquanto y coordenadas em seu mapa de imagem pode estar aumentando ao fazer-se.
-
Se o mapa cobre uma área maior, interpolação linear não vai ser tão preciso para latitudes. Para um mapa que abrange um grau de latitude e está em zonas habitáveis ??da terra (por exemplo, a área da baía), a latitude centro vai estar fora por 0,2% ou menos, o que é provável que pelo menos de um pixel (dependendo do tamanho)
Se isso é suficiente preciso para suas necessidades, você pode parar por aqui!
A matemática mais precisa para começar a partir latitude de P para uma posição y do pixel começaria com a matemática Mercator. Sabemos que para um P.lat latitude, a posição Y em uma projeção Começando pelo Equador seria o seguinte (eu vou usar um capital Y como ao contrário do valor y estamos procurando, Y começa no equador e aumenta para o norte):
Y = k * ln((1 + sin(P.lat)) / (1 - sin(P.lat)))
A constante k depende da escala vertical do mapa, o que podemos não saber. Felizmente, pode-se deduzir observando que y (TL) - y (BR) = h. Isso nos leva:
k = h / (ln((1 + sin(TL.lat)) / (1 - sin(TL.lat))) - ln((1 + sin(BR.lat)) / (1 - sin(BR.lat))))
(yikes! Isso é quatro níveis de suportes!) Com k conhecido, agora temos a fórmula para descobrir a posição Y de qualquer latitude. Nós só precisamos correto para: (1) o nosso valor começa Y no TL.lat, não do equador, e (2) y cresce em direção ao sul, ao invés de para o norte. Isso nos leva:
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))
Então, isso faz com que você:
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