OpenLayers и GeoJSON не умножают маркер на одни и те же координаты

Мой код показывает маркеры из 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));
        });
        }
    });

person Max Allan    schedule 12.10.2011    source источник


Ответы (2)


Почему бы не использовать BBOX Strategy [1] ?

Это сделает то, что вам нужно, и наверняка будет более производительным (он удалит существующие функции и перезагрузит новые на zoomend). Сравнение объектов для добавления новых потребует много сравнений, и вы можете закончить со слишком большим количеством объектов на карте.

Проверьте источник js примера.

ХТХ,

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

РЕДАКТИРОВАТЬ: если вы хотите изменить меньше кода, вызов vectorLayer.removeAllFeatures() перед добавлением решит вашу проблему… Вам действительно нужно держать функции за пределами границ?

person tonio    schedule 21.10.2011

Сначала вам нужно убрать слой с карты, используя что-то вроде map.getLayersByName. Затем вы можете перебрать layer.features, чтобы найти функцию, которую вы добавляете.

Если вы можете изменить серверную часть для использования BBOX, то стратегия BBOX с уровнем масштабирования и настройками проекции позаботится о многом для вас.

person ubiquitousthey    schedule 22.10.2011