Opuscolo: coordinate del contenitore vs coordinate del livello?


17

Qual è la differenza tra le coordinate del contenitore della mappa e le coordinate del livello ?

Da quello che ho raccolto, le coordinate del contenitore della mappa sono sempre relative al viewport della mappa e mentre le coordinate del livello iniziano sempre con gli stessi valori dei coord del contenitore , cambiano una volta che la mappa viene spostata.

API che si riferiscono a coordinate / punto:

Risposte:


21

Risposta breve

I metodi containerPoint risalgono a una richiesta di funzionalità nel 2012 e oggi sono un po 'confusi.

La migliore risposta è la descrizione del manutentore del volantino Vladimir Agafonkin:

"layerPoint è in realtà un punto relativo al layer della mappa (il div che contiene riquadri e marker), non il contenitore esterno della mappa. Ciò di cui hai bisogno è map.layerPointToContainerPoint. Ma sono d'accordo che non esiste un metodo conveniente per ottenerlo immediatamente, quindi pianificalo per la prossima versione ".

Risposta lunga

Più in dettaglio:

I principali metodi di conversione pubblici in Leaflet, sebbene usati raramente dagli sviluppatori di applicazioni, sono L.Map.project(latlng [, zoom])e L.Map.unproject(point [, zoom]).

Le mappe Web sono suddivise in una griglia di riquadri, ciascuno con lo stesso numero di pixel. A livelli di zoom più elevati, la mappa è divisa in un numero maggiore di riquadri, con un corrispondente numero maggiore di pixel. Pertanto, la dimensione dei pixel della mappa dipende dal livello di zoom.

Ciò significa che se stai scherzando con una finestra demo di Leaflet nel tuo browser, l'output di L.Map.project` per un dato latlng cambierà solo se ingrandisci e riduci .

A partire dall'ultima versione di Leaflet (0.7.3), la definizione di L.Map.latLngToLayerPointlegge:

latLngToLayerPoint: function (latlng) {
    var projectedPoint = this.project(L.latLng(latlng))._round();
    return projectedPoint._subtract(this.getPixelOrigin());
}

Al contrario, si L.Map.latLngToContainerPointlegge:

latLngToContainerPoint: function (latlng) {
    return this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));
}

con L.Map.layerPointToContainerPointdefinito come:

layerPointToContainerPoint: function (point) { 
    return L.point(point).add(this._getMapPanePos());
}

Il metodo della mappa privata _getMapPanePos()restituisce l' offset tra la posizione corrente della mappa e la sua posizione quando è stata creata per la prima volta. Questo cambia solo durante una panoramica della mappa (non durante lo zoom), quindi la differenza tra layerPoint e containerPoint corrispondente a un dato latlng è che layerPoint è la posizione del latlng nel contenitore <div> della mappa con la mappa nella sua posizione iniziale , mentre il containerPoint è la posizione corrente del latlng nel contenitore della mappa <div>.


1
Amico - se potessi votare, verrai votato 100 volte.
Saad Malik,

0

EDIT: si scopre che mi sbagliavo. Le coordinate del contenitore sembrano essere per il frame visibile mentre le coordinate del layer sono per un'area più grande di quella visibile. Questa domanda ha bisogno di qualcuno più esperto di me per rispondere.


1
Alex - Non credo sia corretto. Le coordinate del contenitore e le coordinate del livello sono entrambe specificate in pixel dall'origine (in alto a sinistra) del contenitore. Tuttavia, quando inizio a eseguire la panoramica della mappa, la coordinata / punto del livello di un marcatore rimane invariata mentre la coordinata / punto della mappa per un marcatore viene aggiornato rispetto al punto di origine in alto a sinistra.
Saad Malik,

Ciao @ SimFox3, hai ragione. E avrei dovuto testarlo prima di dire qualsiasi cosa! Ora penso che il punto del livello sia una coordinata definita in relazione a una sorta di "finestra" che è mantenuta, che è più grande dello schermo. È come una vista cache che è biogger dello schermo. Ecco perché le coordinate del punto del livello cambiano, ma non spesso, e solo quando viene spostata la 'finestra'. Le coordinate del punto contenitore sembrano sempre confinate alle coordinate relative alla vista visibile. Detto questo, è chiaro che non ne conosco più di te, quindi sarebbe fantastico se un sviluppatore di volantini. potrebbe entrare!
Alex Leith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.