2015-08-04 3 views
0

Я добавляю маркер на карте, используя Ol3, вызвав следующую функциюИзменения значения существующего слоя в OpenLayers 3

function addmarker(lat, long, flag) { 

      iconFeature = new ol.Feature({ 
       geometry: new ol.geom.Point(ol.proj.transform([+long, +lat], 'EPSG:4326', 'EPSG:3857')), 
       name: 'NULL' 
      }); 

      iconStyle = new ol.style.Style({ 

       fill: new ol.style.Fill({ 
        color: '#008000' 
       }), 
       stroke: new ol.style.Stroke({ 
        color: '#008000', 
        width: 3 
       }), 
       image: new ol.style.Circle({ 
        radius: 6, 
        fill: new ol.style.Fill({ 
         color: '#008000' 
        }) 
       }) 

      }); 

      iconFeature.setStyle(iconStyle); 

      vectorSource[flag] = new ol.source.Vector({ 
       features: [iconFeature] 
      }); 

      vectorLayer[flag] = new ol.layer.Vector({ 
       source: vectorSource[flag] 
      }); 

      map.addLayer(vectorLayer[flag]); 

     } 

И изменить положение маркеров, я удаление слоя и добавление нового слоя снова

function changemarker(lat, long, flag) { 

      vectorSource[flag].clear(); 

      map.removeLayer(vectorLayer[flag]); 

      addmarker(lat, long, flag); 

     } 

Я сталкиваюсь с проблемами производительности, как я меняюсь маркер, который вызывает метод changemarker каждые 500 миллисекунд. Можно ли изменить слой, не удаляя его, или есть лучший подход, который может быть применен.

Пожалуйста, помогите.

+0

Почему это помечено как C# и WPF? –

+0

Я реализую его с помощью приложения WPF в элементе управления веб-браузером на основе Chromium. Возможно, проблема связана с проблемой производительности, поэтому я отметил ее. – Akansha

ответ

1

Если установить идентификатор на функцию ol.Feature.setId(<your id>) вы можете изменить его непосредственно следующим образом: -

//Setting up your feature 
iconFeature = new ol.Feature({ 
    geometry: new ol.geom.Point(ol.proj.transform([+long, +lat], 'EPSG:4326', 'EPSG:3857')), 
    name: 'NULL' 
}); 

iconFeature.setId('feature1'); 

Тогда

var myFeature = vectorSource.getFeatureById('feature1'); 

myFeature.getGeometry().setCoordinates(ol.proj.transform([lon, lat], 'EPSG:4326', 'EPSG:3857')); 

Это должно обновить функцию сразу остроумие hout any redraw calls - OL перерисовывает слой при обновлении функции. Используя этот подход, я показываю несколько сотен функций со сложными геометриями на экране без существенного ограничения скорости.

+0

Этот фрагмент кода работал как шарм. Спасибо, много. :) – Akansha

0

Если у вас есть только одна особенность в вашем слое, можно изменить непосредственно геометрию вашей функции:

function changemarker(lat, long, flag) { 

    vectorSource[flag].getFeatures()[0].getGeometry().setCoordinates(ol.proj.transform([+long, +lat], 'EPSG:4326', 'EPSG:3857')); 
} 
+0

Согласовано. Если вы установили идентификатор в функции 'ol.Feature.setId()', вы можете напрямую изменить его. – pconnell99

Смежные вопросы