无法访问 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 的问题,我认为这又是一个等待更改完成的问题。我在第一个片段中进行了修改。
我正在本地加载一个 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 的问题,我认为这又是一个等待更改完成的问题。我在第一个片段中进行了修改。