openlayers3:中心和缩放范围到 KML 限制

openlayers3 : center and zoom extent to KML limits

使用 openlayer 在平铺背景上显示 kml 文件的基本脚本;我刚从版本 2 切换到 4.65,如何缩放到 kml 几何的极限("vector" 这里)?

        var wmsSource = new ol.source.TileWMS({
            url: "https://sedac.ciesin.columbia.edu/geoserver/wms",
            params: {"LAYERS": "other:wwf-terrestrial-biomes", "TILED": true},
            serverType: "geoserver"
          });

        var wmsLayer = new ol.layer.Tile({
            opacity: 0.15,
            visible: true,
            source: wmsSource
          });

        var vector = new ol.layer.Vector({
            source: new ol.source.Vector({
            url: "kml_file.kml",
            format: new ol.format.KML()
        })
    });

        var map = new ol.Map({
            target: "map-canvas",
            layers: [wmsLayer, vector],
            controls: ol.control.defaults().extend([
                new ol.control.ScaleLine({units: "metric"}), 
                new ol.control.FullScreen()
            ]),
            view: new ol.View({
                center: ol.proj.transform([37.41, 8.82], "EPSG:4326", "EPSG:3857"),
                zoom: 3
            })
        });

我想替换 zoom: 3 并让地图居中并扩展到 kml 限制?

注意:我使用 kmllayer.events.register("loadend", kmllayer, function(evt){map.zoomToExtent(kmllayer.getDataExtent())}); 和 OpenLayers2...

下面应该做你想做的

var vectorSource = vector.getSource();
vectorSource.once('change', function(e){
    if (vectorSource.getState() === 'ready') {
        var extent = vectorSource.getExtent();
        map.getView().fit(extent);
    }
});

解决方案主要改编自(更改了变量名称并删除了map.getView().fit中的第二个参数(过去需要,现在可选,大部分时间不需要,就像这里一样)

好的,我需要将 kml 源声明为单独的 new ol.source.Vector 变量,此处 vectorSource,并从该变量而不是 ol.layer.Vector 中读取 .getExtent() :

        var wmsSource = new ol.source.TileWMS({
            url: "https://sedac.ciesin.columbia.edu/geoserver/wms",
            params: {"LAYERS": "other:wwf-terrestrial-biomes", "TILED": true},
            serverType: "geoserver"
          });

        var wmsLayer = new ol.layer.Tile({
            opacity: 0.15,
            visible: true,
            source: wmsSource
          });

        var vectorSource = new ol.source.Vector({
            url: "'.$kml_f.'",
            format: new ol.format.KML()
        });

        var vector = new ol.layer.Vector({
            source: vectorSource
    });

        var map = new ol.Map({
            target: "map-canvas",
            layers: [wmsLayer, vector],
            controls: ol.control.defaults().extend([
                new ol.control.ScaleLine({units: "metric"}), 
                new ol.control.FullScreen()
            ]),
            view: new ol.View({
                center: ol.proj.transform([37.41, 8.82], "EPSG:4326", "EPSG:3857"),
                zoom: 4,
            })
        });

        vector.once("change", function(e){
                var extent = vectorSource.getExtent();
                map.getView().fit(extent);
        });

感谢您的帮助!