2011-10-12 43 views
6

我的代码显示来自GeoJSON的标记,当我放大到缩放级别10时,它加载GeoJSON文件,但是如何避免声明输出相同的标记? 有没有办法检查某个特定地点是否已经存在标记? 代码OpenLayers和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)); 
     }); 
     } 
    }); 

回答

4

为什么不使用BBOXStrategy [1]?

这将做你所需要的,并且肯定会有更高的性能(它将删除现有功能并在zoomend上重新加载新功能)。比较要添加新功能的功能需要很多的比较,并且您可以在地图上以太多功能结束。

查看示例的js源代码。

HTH,

1 - http://openlayers.org/dev/examples/strategy-bbox.html

编辑:如果你想增加将解决您的问题...你真的需要保留的功能超出界限之前更换更少的代码,以vectorLayer.removeAllFeatures()打个电话?

+0

嗯,很好的问题 - 但不要额外的权力? –

+0

BBOX策略中的+1,但缩放级别约束如何?这是否可用于战略? –

+0

默认情况下缩放级别约束不可用。您可以重写此类('OpenLayers.Strategy.BBOX')来执行此操作。删除所有功能(我的第二个解决方案)不会花费比比较每个功能以了解它们是否必须添加。 – tonio

0

首先,您需要使用诸如map.getLayersByName之类的地图将图层从地图上取下。然后,您可以迭代layer.features以查找要添加的功能。

如果您可以修改后端以使用BBOX,那么带有缩放级别和投影设置的BBOX策略会为您处理很多。