传单:容器坐标与图层坐标?


Answers:


21

简短答案

containerPoint方法可追溯到2012年的功能请求,而今天,它们有些令人困惑。

最好的答案是Leaflet维护者Vladimir Agafonkin的描述:

“ layerPoint实际上是相对于地图图层(包含图块和标记的div)的一个点,而不是外部地图容器。您需要的是map.layerPointToContainerPoint。但是我同意没有方便的方法可以立即获取它,因此进行调度对于下一个版本。”

长答案

更详细地:

Leaflet中的核心公共转换方法(尽管很少被应用程序开发人员使用)是L.Map.project(latlng [, zoom])L.Map.unproject(point [, zoom])

Web地图被分成多个图块网格,每个图块具有相同数量的像素。在较高的缩放级别下,将地图划分为更多数量的图块,并具有相应更多的像素。因此,地图的像素大小取决于缩放级别。

这意味着如果您在浏览器中弄乱了Leaflet演示窗口,则当您放大和缩小时,给定latlng的L.Map.project`的输出才会改变。

从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()返回当前地图位置与其首次创建时位置之间的偏移量。这在地图平移期间发生变化(而不是在缩放期间发生变化),因此对应于给定latlng的layerPoint和containerPoint之间的区别在于,layerPoint是<div> 地图在其初始位置处的地图容器中latlng的位置,而containerPoint是latlng在地图容器中的当前位置<div>


1
伙计-如果我可以投票,您将被投票100次。
Saad Malik 2014年

0

编辑:原来我错了。容器坐标似乎适用于可见帧,而层坐标适用于比可见帧更大的区域。这个问题需要比我更有知识的人来回答。


1
亚历克斯-我认为那是不对的。容器坐标和层坐标均以像素为单位,从容器的原点(左上角)开始。但是,当我开始平移地图时,标记的图层坐标/点保持不变,而标记的地图坐标/点则分别更新为左上角原点。
2013年

嗨@ SimFox3,您是对的。我应该在测试之前先测试一下!现在,我要说的是,图层点是相对于所保持的某种“窗口”定义的坐标,该“窗口”大于屏幕。这就像一个缓存的视图,比屏幕还慢。这就是图层点坐标改变的原因,但不经常改变,并且仅当“窗口”移动时才改变。容器点坐标似乎总是局限于相对于可见视图的坐标。说了这么多,很明显,我对您的了解不多,因此,如果有Leaflet开发人员,那就太好了。可以加入!
Alex Leith
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.