问题描述
访问单击时的geojson点很容易,但是mapBox似乎不返回对clicked元素的引用,而是返回其副本。可能是因为添加源确实像我所相信的那样实现了JSON.stringify。
我想在单击元素时访问geojson特定功能,对其进行修改/删除/移动并重新呈现。
一种实现方法是将属性“ id”传递给要素,遍历要素,找到具有适当id的要素,对其进行修改并重新渲染,但是在处理大量点(例如100000点)时可能会非常慢他们。这也是为什么我不考虑使用新的Marker()来创建DOM元素的原因,而这对于大量标记是一个过大的杀伤力。
另一种方法可能是制作一个映射geoid特征的地图
const geoJson = { ... }
map.addSource('points',{
type: 'geojson',data: geoJson
});
map.addLayer({
'id': 'points','type': 'symbol','source': 'points','layout': {
'icon-image': 'logger_green','icon-allow-overlap': true
}
});
map.on('mousedown','points',function (e) {
e.preventDefault();
// feature here is a copy,not reference so updating geojson would require looping
// over geojson,finding clicked element by is passed in feature property,editing it and
// rerendering which may be slow for bigger geojson data
console.log(e,e.features,e.features[0]);
});
解决方法
因此,我推荐的是,您可以在此用例中使用高性能的JS库:
如果您有大量的geojson点。您可以使用Rbush在bbox下对其进行排列/分类。以后,每当您单击geojson点时,只需抓住该点所在的bbox并相应地更新数据即可!