Leaflet: координаты контейнера против координат слоя?

17

В чем разница между координатами контейнера карты и координатами слоя ?

Из того, что я собрал, координаты контейнера карты всегда относятся к области просмотра карты, и, хотя координаты слоя всегда начинаются с тех же значений, что и координаты контейнера , они изменяются после панорамирования карты.

API, которые ссылаются на координаты / точку:

Саад Малик
источник

Ответы:

21

Короткий ответ

Методы containerPoint датируются запросом на функцию еще в 2012 году , и сегодня они немного сбивают с толку.

Наилучший ответ - описание автора буклета Владимира Агафонкина:

"layerPoint на самом деле является точкой относительно слоя карты (div, который содержит плитки и маркеры), а не внешнего контейнера карты. Вам нужен map.layerPointToContainerPoint. Но я согласен, что нет удобного способа получить его немедленно, поэтому планируем это для следующей версии. "

Длинный ответ

Более подробно:

Основными публичными методами преобразования в Leaflet, хотя они редко используются разработчиками приложений, являются L.Map.project(latlng [, zoom])и L.Map.unproject(point [, zoom]).

Веб-карты разделены на сетку плиток, каждая с одинаковым количеством пикселей. При более высоких уровнях масштабирования карта делится на большее количество плиток с соответствующим большим количеством пикселей. Таким образом, размер пикселя карты зависит от уровня масштабирования.

Это означает, что если вы поэкспериментируете с демонстрационным окном Leaflet в вашем браузере, вывод L.Map.project` для данного latlng изменится только при увеличении и уменьшении.

Начиная с последней версии Leaflet (0.7.3), определение L.Map.latLngToLayerPointгласит:

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

Напротив, L.Map.latLngToContainerPointчитает:

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

с L.Map.layerPointToContainerPointопределением:

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

Метод приватной карты _getMapPanePos()возвращает смещение между текущей позицией карты и ее позицией, когда она была впервые создана. Это изменяется только во время панорамирования карты (но не при масштабировании), поэтому разница между layerPoint и containerPoint, соответствующая данному значению latlng, заключается в том, что layerPoint - это положение latlng в контейнере карты <div> с картой в ее начальном положении , в то время как containerPoint - это текущая позиция latlng в контейнере карты <div>.

Джастин мэнли
источник
1
Чувак - если бы я мог проголосовать, ты бы проголосовал 100 раз.
Саад Малик
0

РЕДАКТИРОВАТЬ: оказывается, я был не прав. Координаты контейнера, по-видимому, соответствуют видимому кадру, а координаты слоя - большей области, чем видимая. На этот вопрос нужен кто-то более знающий, чем я, чтобы ответить на него.

Алекс Лейт
источник
1
Алекс - я не верю, что это правильно. Координаты контейнера и координаты слоя указаны в пикселях от начала координат (вверху слева) контейнера. Однако, когда я начинаю панорамирование карты, координата / точка слоя маркера остается неизменной, в то время как координата / точка карты для маркера обновляется в соответствии с верхней левой точкой начала координат.
Саад Малик
Привет @ SimFox3, ты прав. И я должен был это проверить, прежде чем что-то сказать! Теперь я понимаю, что точка слоя - это координата, которая определена относительно своего рода «окна», которое больше, чем экран. Это похоже на кэшированное представление, которое больше, чем экран. Вот почему координаты точки слоя меняются, но не часто, и только при перемещении «окна». Координаты точек контейнера кажутся всегда ограниченными координатами относительно видимого вида. Сказав все это, ясно, что я не знаю больше, чем вы, так что было бы здорово, если бы разработчик Leaflet. может скинуться!
Алекс Лейт