OpenLayers 3 Объем всех функций на векторном слое?

У меня есть карта OpenLayers 3 с базовым слоем и векторным слоем.

this.topoLayer = new ol.layer.Vector({
  source: new ol.source.Vector(),
  style: style
});

var baseLayer = new ol.layer.Tile({
    source: new ol.source.XYZ({
        url: 'http://[…]/{z}/{x}/{y}.png',
        crossOrigin: 'null'
    })
});

this.map = new ol.Map({
    target: 'map',
    layers: [baseLayer, this.topoLayer],
    view: new ol.View2D({
        center: ol.proj.transform([11.38,  48.54], this.options.markerEPSG, this.options.mapEPSG),
        zoom: 5,
    }),
});

После взаимодействия с пользователем я добавляю и удаляю несколько функций векторного слоя. Вот функция, которая добавляет новую функцию:

  var feature = new ol.Feature({
        topo: topo,
        selected: false,
        geometry: new ol.geom.Point(ol.proj.transform(location, this.options.markerEPSG, this.options.mapEPSG)),
  });

  this.topoLayer.getSource().addFeatures([feature]);

После добавления / удаления новой функции я хотел бы автоматически масштабировать и панорамировать карту, чтобы она соответствовала моим функциям. В старом API OpenLayers на векторных слоях была функция getDataExtent для извлечения «ограничивающей рамки» вокруг всех показанных функций. Но мне интересно, как это сделать с новым API.


person SomeBdyElse    schedule 28.12.2013    source источник
comment
Прямо сейчас я храню все активные функции в отдельном массиве и вычисляю оттуда экстент. var coordinates = features.map(function(feature) {return feature.getGeometry().getCoordinates();}); var extent = ol.extent.boundingExtent(coordinates);   -  person SomeBdyElse    schedule 29.12.2013
comment
ваше решение в комментарии работает. Можно позвонить map.getView().fit(extent, map.getSize()), чтобы настроить карту.   -  person philk    schedule 08.12.2015


Ответы (5)


В версии 3.7 ol.View.fitExtent() и ol.View.fitGeometry() были объединены в одну функцию: fit.

Итак, теперь код:

 var extent = myLayer.getSource().getExtent();
 map.getView().fit(extent, map.getSize());
person Mister Smith    schedule 08.07.2015

Основываясь на ответе Тайлера ДеВитта, вы сможете сделать что-то вроде этого:

var view = yourmap.getView();
var view2D = view.getView2D();
var extent = yourlayer.getSource().getExtent();

view2D.fitExtent(extent, yourmap.getSize());

Изменить: Как сказали Тим и Стюарт, вышеизложенное больше не работает. Вместо этого должно помочь следующее:

 var extent = yourlayer.getSource().getExtent();
 map.getView().fitExtent(extent, map.getSize());
person Danny Hoek    schedule 17.06.2014
comment
Обратите внимание, что view.getView2D() сейчас нет. Это должно быть обновлено, чтобы читать map.getView().fitExtent(extent, map.getSize()). - person Tim Schaub; 11.11.2014
comment
fitExtent удален в v3.7. проверьте мой ответ о новом решении - person Mister Smith; 08.07.2015

var source = layer.getSource();
goog.events.listen(source, ol.source.VectorEventType.ADD, function(evt) {
     // taken from ol/source/vectorsource.js
     var extent = ol.extent.createEmpty();
     var geometry = null;
     var feature;
     var features = source.getFeatures().getArray();
     for (var i = 0, ii = features.length; i < ii; ++i) {
         feature = features[i];
         geometry = feature.getGeometry();
         if (!goog.isNull(geometry)) {
               ol.extent.extend(extent, geometry.getExtent());
     }
     // here you should have your extent
    }
}, false, this);

Не проверено.

Должен быть более элегантный способ, но сейчас я не уверен, где его найти.

person Jachym    schedule 02.01.2014
comment
Я пытался использовать этот код, но получаю TypeError: ol.source.VectorEventType is undefined. Я использую ol3js.org/en/master/build/ol.js - есть ли место получше? - person Tim T; 11.01.2014

Поскольку я еще не могу комментировать, мне придется опубликовать еще один ответ: ответ Дэнни Хука больше не правильный, вот обновление:

var view = yourmap.getView();
var extent = yourlayer.getSource().getExtent();

view.fitExtent(extent, yourmap.getSize());

По сути, такой 2D-опоры, похоже, больше нет.

person Stuart Allen    schedule 13.10.2014

Сейчас есть getExtent() функция на ol.source, поэтому я могу вызвать <layer>.getSource().getExtent(). Однако я не могу понять, как увеличить масштаб моей карты до этого уровня. <map>.zoomToExtent(extent) больше не существует.

person Tyler DeWitt    schedule 15.05.2014