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

#javascript #openlayers #geojson

#javascript #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=markersamp;type=jsonamp;sw=(' sw.lon ',' sw.lat ')amp;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));
        });
        }
    });
  

Ответ №1:

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

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

Ознакомьтесь с исходным кодом js примера.

HTH,

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

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

Комментарии:

1. 1 для стратегии BBOX, но как насчет ограничения уровня масштабирования? Доступно ли это в стратегии?

2. Ограничение уровня масштабирования по умолчанию недоступно. Вы можете переопределить этот класс ( OpenLayers.Strategy.BBOX ), чтобы сделать это. Удаление всех функций (мое второе решение) не будет стоить дороже, чем сравнение каждой функции, чтобы узнать, нужно ли их добавлять.

3. ссылка недоступна, пример для текущей версии openlayers: openlayers.org/en/latest/examples/vector-wfs.html

Ответ №2:

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

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