无法访问KML功能

时间:2015-12-30 18:45:56

标签: openlayers-3

我在本地加载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正常运行或任何替代方法的任何指示都会很棒。

2 个答案:

答案 0 :(得分:1)

您的问题中的代码可以正常工作,但功能是异步加载的。大多数情况下,它首先执行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的问题,我认为这又是一个等待更改完成的问题。我在第一个片段中做了修改。

答案 1 :(得分:0)

我找到了一种让它发挥作用的方法。不确定它是否效率最高:

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 );