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

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

  •  06-07-2019
  •  | 
  •  

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?

È stato utile?

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 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top