OpenLayers和GeoJSON,在相同坐标上不要重复放置多个标记。

6

我的代码正在显示来自GeoJSON的标记,当我缩放到10级时,它会加载GeoJSON文件,但是如何避免重复放置相同的标记呢? 有没有办法检查特定位置是否已经存在标记? 代码如下:

map.events.register("zoomend", null, function(){

      if(map.zoom == 10)
      {
        var bounds = map.getExtent();
        console.log(bounds);
        var ne = new OpenLayers.LonLat(bounds.right,bounds.top).transform(map.getProjectionObject(),wgs84);
        var sw = new OpenLayers.LonLat(bounds.left,bounds.bottom).transform(map.getProjectionObject(),wgs84);
        var vectorLayer = new OpenLayers.Layer.Vector();
        map.addLayer(vectorLayer);
        $.getJSON('ajax.php?a=markers&type=json&sw=('+sw.lon+','+sw.lat+')&ne=('+ne.lon+','+ne.lat+')',function(data){
        //$.getJSON('test.json',function(data){
            var geojson_format = new OpenLayers.Format.GeoJSON({
                'externalProjection': wgs84,
                'internalProjection': baseProjection
                });
            vectorLayer.addFeatures(geojson_format.read(data));
        });
        }
    });
2个回答

4
为什么不使用 BBOX 策略 [1] ? 这样做可以满足你的需求,并且肯定会更加高效(它将在 zoomend 上删除现有特征并重新加载新特征)。相比较而言,添加新特征需要进行大量比较,你可能会在地图上拥有过多的特征。请查看示例的 js 源代码。
希望对你有所帮助,
1 - http://openlayers.org/dev/examples/strategy-bbox.html 编辑:如果你想更改的代码较少,则在添加之前调用 vectorLayer.removeAllFeatures() 将解决你的问题... 你真的需要保留超出范围的特征吗?

BBOX策略加1,但缩放级别限制呢?这在策略中是否可用? - Niklas Wulff
缩放级别约束默认不可用。您可以覆盖此类(OpenLayers.Strategy.BBOX)来实现它。删除所有要素(我的第二个解决方案)不会比比较每个要素以确定是否需要添加更多的成本。 - tonio
链接已失效,当前OpenLayers版本的示例:https://openlayers.org/en/latest/examples/vector-wfs.html - rbs

0

首先,您需要使用类似于map.getLayersByName的方法获取地图上的图层。然后,您可以迭代layer.features以查找要添加的要素。

如果您可以修改后端以使用BBOX,则BBOX策略与缩放级别和投影设置将为您处理很多事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接