Je charge un fichier KML localement et j'ai pu l'ajouter à la carte avec succès. Cependant, je veux m'intéresser aux fonctionnalités et je n'arrive pas à faire fonctionner quoi que ce soit. Mon code actuellement:

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

Tout pointeur sur la façon dont je peux faire fonctionner le forEachFeature, ou toute autre méthode alternative, serait génial.

-1
MoreScratch 30 déc. 2015 à 21:45

2 réponses

Meilleure réponse

Le code de votre question fonctionne correctement, sauf que les fonctionnalités sont chargées de manière asynchrone. La plupart du temps, il exécutera d'abord forEachFeature, qui trouve 0 fonctionnalités à parcourir, puis les fonctionnalités sont chargées.

Vous pouvez découvrir qu'une seule fonctionnalité est chargée en écoutant l'événement addfeature de la source et peut-être pouvez-vous y apporter les modifications souhaitées pour chaque fonctionnalité séparément:

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

Si vous devez attendre que toutes les entités soient chargées, l'événement de modification de la couche peut vous aider:

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

Edit: Vous avez raison, le gestionnaire d'événements addfeature a l'objet événement comme paramètre. À votre question sur la définition de l'ID lors de l'ajout de fonctionnalités, je pense que c'est encore un problème d'attendre que les modifications soient effectuées. J'ai apporté les modifications dans le premier extrait.

1
E. Nerv 8 janv. 2016 à 22:00

J'ai trouvé un moyen de faire fonctionner cela. Je ne sais pas si c'est le plus efficace cependant:

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 );
0
MoreScratch 30 déc. 2015 à 20:45