Ответ 1
В версии 3.7, ol.View.fitExtent()
и ol.View.fitGeometry()
были объединены в одну функцию: fit
.
Итак, теперь код:
var extent = myLayer.getSource().getExtent();
map.getView().fit(extent, map.getSize());
У меня есть карта 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.
В версии 3.7, ol.View.fitExtent()
и ol.View.fitGeometry()
были объединены в одну функцию: fit
.
Итак, теперь код:
var extent = myLayer.getSource().getExtent();
map.getView().fit(extent, map.getSize());
На основе ответа Тайлера ДеВитта вы должны сделать что-то вроде этого:
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());
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);
Непроверенные.
Должен быть более элегантный способ, но я не уверен сейчас, где его найти.
Так как я еще не могу прокомментировать, мне придется опубликовать еще один ответ: Ответ Danny Hoek больше не подходит, вот обновление:
var view = yourmap.getView();
var extent = yourlayer.getSource().getExtent();
view.fitExtent(extent, yourmap.getSize());
В принципе, кажется, что 2D-прокрутка отсутствует.
Теперь существует функция getExtent()
на ol.source
, поэтому я могу вызвать <layer>.getSource().getExtent()
. Однако я не могу понять, как увеличить мою карту до этого уровня. <map>.zoomToExtent(extent)
больше не существует.