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