无法访问 KML 地图项

Can't access KML features

我正在本地加载一个 KML 文件,我已经能够成功地将它添加到地图中。但是,我想对这些功能进行交互,但似乎无法正常工作。我目前的代码:

var myLayer = new ol.layer.Vector({
    source: new ol.source.Vector({
        url: '/kml/sample.kml',
        format: new ol.format.KML()
    })
});

// Iterate over features *NOT WORKING*
myLayer.getSource().forEachFeature(function(e) {
    console.log(e);
})

任何关于如何使 forEachFeature 起作用的指示,或任何替代方法,都会很棒。

我找到了使它起作用的方法。但是不确定它是否最有效:

var featProj = map.getView().getProjection();
var kmlFormat = new ol.format.KML();
var myLayer = new ol.layer.Vector();

var vectorSource = new ol.source.Vector({
    loader: function() {
        $.ajax( {
            url: '/kml/my.kml',
            success: function( data ) {
                var features = kmlFormat.readFeatures( data, { featureProjection: featProj } ); 
                vectorSource.addFeatures( features );

                // iterate over features
                vectorSource.forEachFeature( function( feature ) {
                    //do something
                    console.log( feature );
                });
            }
        }); 
    },
    strategy: ol.loadingstrategy.bbox
});
myLayer.setSource( vectorSource );

你问题中的代码工作正常,除了功能是异步加载的。大多数时候它会首先执行 forEachFeature,它会找到 0 个要循环的特征,然后再加载这些特征。

您可能会发现通过侦听源的 addfeature 事件加载了单个功能,也许您可​​以在那里分别为每个功能进行所需的更改:

var id = 1;
myLayer.getSource().on('addfeature', function (ev_add) {
    console.log(ev_add.feature);
    ev_add.feature.once('change', function (ev_change) {
        console.log(ev_change.target.getId());
    });
    ev_add.feature.setId(x);
    x += 1;
});

如果必须等到所有功能都加载完毕,层的更改事件可以提供帮助:

myLayer.once('change', function () {
    myLayer.getSource().forEachFeature(function (feature) {
        console.log(feature);
    });
});

编辑:你是对的,addfeature 事件处理程序将事件对象作为参数。对于您关于在添加功能时设置 ID 的问题,我认为这又是一个等待更改完成的问题。我在第一个片段中进行了修改。