Folheto: Coordenadas do contêiner versus coordenadas da camada?

17

Qual é a diferença entre coordenadas de contêiner de mapa e coordenadas de camada ?

Pelo que reuni, as coordenadas do contêiner do mapa são sempre relativas à janela de visualização do mapa e, embora as coordenadas da camada sempre comecem com os mesmos valores que as cordas do contêiner , elas mudam quando o mapa é panorâmico.

APIs que se referem a coordenadas / ponto:

Saad Malik
fonte

Respostas:

21

Resposta curta

Os métodos containerPoint datam de uma solicitação de recurso em 2012 e hoje são um pouco confusos.

A melhor resposta é a descrição do mantenedor do Leaflet Vladimir Agafonkin:

"layerPoint é na verdade um ponto relativo à camada do mapa (a div que contém blocos e marcadores), não ao contêiner externo do mapa. O que você precisa é map.layerPointToContainerPoint. Mas eu concordo que não há um método conveniente para obtê-lo imediatamente, portanto, agende isso para a próxima versão ".

Resposta longa

Mais detalhadamente:

Os principais métodos de conversão pública no Leaflet, embora raramente sejam usados ​​pelos desenvolvedores de aplicativos, são L.Map.project(latlng [, zoom])e L.Map.unproject(point [, zoom]).

Os mapas da Web são divididos em uma grade de blocos, cada um com o mesmo número de pixels. Em níveis mais altos de zoom, o mapa é dividido em um número maior de blocos, com um número maior correspondente de pixels. Assim, o tamanho do pixel do mapa depende do nível de zoom.

Isso significa que, se você estiver mexendo com uma janela de demonstração do Leaflet no navegador, a saída do L.Map.project` para uma determinada latlng será alterada se você aumentar e diminuir o zoom.

Na versão mais recente do Leaflet (0.7.3), a definição de L.Map.latLngToLayerPointlê:

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

Por outro lado, L.Map.latLngToContainerPointlê-se:

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

com L.Map.layerPointToContainerPointdefinido para ser:

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

O método de mapa privado _getMapPanePos()retorna o deslocamento entre a posição atual do mapa e sua posição quando foi criada. Isso muda apenas durante uma panorâmica do mapa (não durante o zoom); portanto, a diferença entre o layerPoint e o containerPoint correspondente a uma determinada latlng é que o layerPoint é a posição da latlng no contêiner de mapa <div> com o mapa em sua posição inicial , enquanto o containerPoint é a posição atual do latlng no container de mapa <div>.

Justin Manley
fonte
1
Cara - se eu pudesse votar, você seria votado 100 vezes.
Saad Malik
0

Edição: Acontece que eu estava errado. As coordenadas do contêiner parecem ser para o quadro visível, enquanto as coordenadas da camada são para uma área maior que a visível. Esta pergunta precisa de alguém com mais conhecimento do que eu para respondê-la.

Alex Leith
fonte
1
Alex - Não acredito que isso esteja correto. As coordenadas do contêiner e as coordenadas da camada são especificadas em pixels da origem (canto superior esquerdo) do contêiner. No entanto, quando começo a mover o mapa, a coordenada / ponto da camada de um marcador permanece o mesmo, enquanto a coordenada / ponto do mapa de um marcador é atualizada de acordo com o ponto de origem superior esquerdo.
Saad Malik
Olá @ SimFox3, você está certo. E eu deveria ter testado antes de dizer qualquer coisa! Agora, considero que o ponto da camada é uma coordenada definida em relação a uma espécie de 'janela' mantida, maior que a tela. É como uma visualização em cache que é mais biótica que a tela. É por isso que as coordenadas do ponto da camada mudam, mas não com frequência, e somente quando a 'janela' é movida. As coordenadas do ponto do contêiner parecem sempre confinadas às coordenadas relativas à vista visível. Dito tudo isso, é claro que eu não sei mais do que você, por isso seria ótimo se um desenvolvedor do Leaflet. poderia chip!
Alex Leith