leaflet - 传单 panTo 不居中

标签 leaflet

我在 map 上有一条轨迹,用户可以通过将鼠标悬停在图表(时间和速度)上来“跟踪”。如果用户放大很多,则部分轨迹可能不可见。当用户想要查看未显示的轨迹部分时,我使用 panTo 方法...

leaflet的panTo方法目前也是居中。我不想居中,我希望 map 移动足够以显示一个点。 (panTo 的问题是它会导致过度的 map 滚动和恶劣的用户体验。)

我尝试过更改边界,但这会产生有时会缩小的(不需要的)副作用。

有什么办法可以做一个“最小”的 panTo 吗?


这是一个(有效但未经完善的)解决方案; map 是我们自己的 map 包装实用程序类,lmap 是 typescript 中的传单 map 对象,toxy() 是将纬度/经度转换为 x/y 值的方法。

 if (!this.lmap.getBounds().contains(latlng)) {
    let target = this.map.toxy(latlng);

    let nw = this.map.toxy(this.lmap.getBounds().getNorthWest());
    let se = this.map.toxy(this.lmap.getBounds().getSouthEast());
    let x = 0, y = 0;

    let margin = 75;
    if (target.y < nw.y)
       y = (-1 * (nw.y - target.y)) - margin;
    else if (target.y > se.y)
       y = (target.y - se.y) + margin;

    if (target.x < nw.x)
       x = (-1 * (nw.x - target.x)) - margin;
    else if (target.x > se.x)
       x = (target.x - se.x) + margin;

    this.lmap.panBy(new L.Point(x, y));
 }

最佳答案

首先,使用 map.getPixelBounds() 获取 map 的边界(从 CRS 原点以像素为单位测量) 。然后,使用map.project(latlng, map.getZoom())获取您感兴趣的点的坐标(以 CRS 原点为单位的像素)。

如果您对“来自 CRS 原点的像素”感到困惑,请阅读 http://leafletjs.com/examples/extending/extending-2-layers.html 上的“像素原点”部分。 .

一旦获得这些像素坐标,检查该点是否在视口(viewport)内就应该很简单了,如果不在视口(viewport)内,则检查它在每个方向上的距离有多远。

关于leaflet - 传单 panTo 不居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48450191/

相关文章:

javascript - 带传单 js 的动态 PHP geo json 示例

javascript - 在 SVG 标签内使用 leaflet.js

angular - 可以在来自第三方库的 DOM 元素中渲染 Angular 2 组件吗?

json - 将 geojson/json 文件读入 R 以便在 map 上绘制时遇到问题

javascript - 将 csv 加载到传单中并使用 proj4 转换坐标

javascript - 用 D3 图表覆盖的传单 - 需要将图表保留在一个地方

python - 重叠坐标的 folium 弹出文本问题(更新 :HTML source code)

r - 防止缩小传单 R-Map?

r - 在 R 中保存 Leaflet Widget 时出现无效的 UTF-8 错误

javascript - 单张缩放 map 图层