【发布时间】:2018-01-11 17:22:38
【问题描述】:
我有一个 Mapbox GL 地图的实例,在加载我的数据源后,我调用 fitBounds() 来更改地图的中心并缩放以适合我的数据集。我还在此地图上附加了一些事件侦听器,因为我想知道用户何时手动更改了地图的缩放或位置。
Mapbox 还会在 fitBounds() 上触发“movestart”和“zoomstart”,不过我通过检查事件回调中是否存在 originalEvent 属性来解决这个问题。
问题是,我还在地图中添加了NavigationControl,并且通过其缩放或旋转按钮触发的用户交互会在没有originalEvent 属性的情况下触发我的地图事件。我在 Mapbox 文档中找不到任何方法来侦听将事件侦听器附加到 NavigationControl,也找不到区分由 fitBounds 调用发起的缩放/平移与通过该组件进行的用户交互的方法。
我有什么遗漏吗?有没有办法将鼠标/触摸事件侦听器附加到NavigationControl 组件?或者事件对象中是否有一些属性可以告诉我事件的来源?
简化代码示例 -
this._userMoved = false;
this._map = new mapboxgl.Map(options);
// listen for user actions that update the map display
['movestart', 'zoomstart', 'boxzoomstart', 'rotatestart', 'pitchstart'].forEach((action) => {
this._map.on(action, (e) => {
if (e.originalEvent) {
// if this property is set, the event in question was triggered by an actual user ineraction.
// EXCEPT when the user interaction came from the NavigationControl, hence the problem
this._userMoved = true;
}
});
});
this._map.on('load', () => {
// add the control after map load
this._map.addControl(new mapboxgl.NavigationControl(),'top-left');
this._setMapData(); // adds my data source to the map
this._setMapView(); // calls this._map.fitBounds() using my data source
});
【问题讨论】:
标签: mapbox-gl-js