Ottieni la posizione della mappa quando WGS-84 lat / lon quando sono indicati lat / lon degli angoli in alto a sinistra e in basso a destra
Domanda
Supponiamo di avere una mappa, ad esempio da openstreetmaps.org. Conosco il WGS-84 lat / lon dell'angolo in alto a sinistra e in basso a destra della mappa. Come posso trovare altre posizioni sulla mappa da determinate coordinate lat / lon WGS-84?
Soluzione
Se la mappa è approssimativamente a livello di strada / città, utilizza una proiezione mercatore (come < a href = "http://www.openstreetmap.org" rel = "nofollow noreferrer"> openstreetmap.org sembra), e non è troppo vicino ai poli, l'interpolazione lineare può essere abbastanza accurata. Supponendo quanto segue:
- TL = lat / lon dell'angolo in alto a sinistra
- BR = lat / lon dell'angolo in basso a destra
- P = lat / lon del punto che desideri localizzare sulla mappa
- (w, h) = larghezza e altezza della mappa che hai (pixel?)
- l'origine dell'immagine della mappa, (0,0), è nell'angolo in alto a sinistra
, potremmo interpolare la posizione (x, y) corrispondente a P come:
x = w * (P.lon - TL.lon) / (BR.lon - TL.lon)
y = h * (P.lat - TL.lat) / (BR.lat - TL.lat)
Gotcha comuni:
-
La convenzione di notazione lat / lon elenca prima la latitudine e la seconda di longitudine, vale a dire "verticale". prima di "orizzontale". Questo è opposto alla comune notazione x, y delle coordinate dell'immagine.
-
I valori di latitudine aumentano quando si procede in direzione nord ("alto"), mentre le coordinate y nell'immagine della mappa potrebbero aumentare quando si scende.
-
Se la mappa copre un'area più ampia, l'interpolazione lineare non sarà precisa per le latitudini. Per una mappa che si estende su un grado di latitudine e si trova nelle zone abitabili della terra (ad es. L'area della baia), la latitudine centrale sarà disattivata dello 0,2% o giù di lì, che è probabile che sia inferiore a un pixel (a seconda delle dimensioni)
Se è abbastanza preciso per le tue esigenze, puoi fermarti qui!
La matematica più precisa per passare dalla latitudine di P a una posizione di pixel y inizierebbe con la matematica del mercatore. Sappiamo che per una latitudine P.lat, la posizione Y su una proiezione che inizia all'equatore sarebbe la seguente (userò una Y maiuscola come diversamente dal valore y che stiamo cercando, Y inizia dall'equatore e aumenta verso nord):
Y = k * ln((1 + sin(P.lat)) / (1 - sin(P.lat)))
La costante k dipende dal ridimensionamento verticale della mappa, che potremmo non conoscere. Fortunatamente, si può dedurre osservando che y (TL) - y (BR) = h. Questo ci rende:
k = h / (ln((1 + sin(TL.lat)) / (1 - sin(TL.lat))) - ln((1 + sin(BR.lat)) / (1 - sin(BR.lat))))
(yikes! sono quattro livelli di parentesi!) Con k noto, ora abbiamo la formula per scoprire la posizione Y di qualsiasi latitudine. Dobbiamo solo correggere: (1) il nostro valore y inizia da TL.lat, non dall'equatore, e (2) y cresce verso sud, piuttosto che verso nord. Questo ci porta:
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))
Quindi questo ti arriva:
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