如何在Vega-Lite地图中实现平面(非旋转)平移功能?
实现Vega-Lite地图的平面平移(无环绕旋转)
原代码通过修改投影的rotate和center属性实现平移,这会触发地球投影的环绕旋转效果。要实现平面平移(仅水平/垂直移动,无地图环绕),需要直接调整投影的translate参数(画布像素偏移),而非修改地理投影的旋转或中心参数。
以下是修改后的完整配置:
{ "$schema": "https://vega.github.io/schema/vega-lite/v5.json", "layer": [ { "data": { "url": "data/world-110m.json", "format": {"type": "topojson", "feature": "countries"} }, "mark": {"type": "geoshape", "fill": "#f0f0f0", "stroke": "white"} } ], "params": [ {"name": "tx", "update": "width / 2"}, {"name": "ty", "update": "height / 2"}, { "name": "scale", "value": 150, "on": [ { "events": {"type": "wheel", "consume": true}, "update": "clamp(scale * pow(1.003, -event.deltaY * pow(16, event.deltaMode)), 100, 1200)" } ] }, { "name": "startPos", "value": null, "on": [{"events": "pointerdown", "update": "xy()"}] }, { "name": "dragPos", "value": null, "on": [ { "events": "[pointerdown, window:pointerup] > window:pointermove", "update": "xy()" } ] }, { "name": "deltaPos", "value": null, "on": [ { "events": {"signal": "dragPos"}, "update": "[dragPos[0] - startPos[0], dragPos[1] - startPos[1]]" } ] }, { "name": "prevTx", "value": null, "on": [{"events": "pointerdown", "update": "tx"}] }, { "name": "prevTy", "value": null, "on": [{"events": "pointerdown", "update": "ty"}] } ], "projection": { "type": "equalEarth", "scale": {"signal": "scale"}, "translate": [ {"signal": "prevTx + deltaPos[0]"}, {"signal": "prevTy + deltaPos[1]"} ] }, "height": "container", "width": "container" }
关键改动说明:
- 移除投影旋转/中心相关参数:删除了
rotateX、centerY、angles、cloned等用于操控投影地理属性的参数,避免触发地图环绕逻辑。 - 基于像素偏移的平移逻辑:
- 通过
startPos记录鼠标按下时的像素位置,dragPos记录拖动中的实时位置,计算出像素差值deltaPos - 直接将投影的
translate参数设置为初始偏移量加上拖动差值,实现纯平面的像素级平移
- 通过
- 保留原有缩放功能:缩放逻辑保持不变,仍通过调整
scale参数实现,平移与缩放互不干扰。
这样修改后,地图平移时只会做水平/垂直的像素移动,不会出现地球环绕旋转的效果,和目标的平面平移表现一致。
内容的提问来源于stack exchange,提问作者Raghav Mittal
相关产品推荐
相关产品推荐

