IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IGN API Géoportail Discussion :

Comment enlever un "feature"?


Sujet :

IGN API Géoportail

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 27
    Points : 18
    Points
    18
    Par défaut Comment enlever un "feature"?
    Je me sens bête, c'est encore un problème de mon incapacité de lire la doc sans doute. J'ai un morceau ce code qui ajoute une boîte sur la carte, et ça marche. Mais avant d'en dessiner une autre boîte j'aimerais enlever la précédente.
    Voici le code qui marche pour moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        cercleLayer = new OpenLayers.Layer.Vector('cercle');
        viewer.getMap().addLayer(cercleLayer);
        var cercleOrigine = viewer.getMap().center;
        var cercleOrigine = centerPoint;
        var styleCercle = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
        styleCercle.strokeColor = "blue";
        styleCercle.fillColor = "blue";
        styleCercle.fillOpacity = "0.2";
        var cercleFeature = new OpenLayers.Feature.Vector(
            OpenLayers.Geometry.Polygon.createRegularPolygon( cercleOrigine, radius, 4, 0 ),
            null,
            styleCercle
            );
        cercleLayer.addFeatures( [cercleFeature] );
    J'ai regardé dans la doc, et il semblerait qu'il y a une méthode pour faire ce que je veux, mais quand je rajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cercleLayer.removeAllFeatures();
    je récupère un message d'erreur qui dit que "cercleLayer.removeAllFeatures is not a function"
    J'ai même essayé de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cercleLayer.removeAllFeatures(function(){return;});
    mais ça ne va pas mieux
    Désolé de vous poser des questions de néophyte, mais je ne m'en sors pas

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par martink Voir le message
    J'ai regardé dans la doc, et il semblerait qu'il y a une méthode pour faire ce que je veux, mais quand je rajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cercleLayer.removeAllFeatures();
    je récupère un message d'erreur qui dit que "cercleLayer.removeAllFeatures is not a function"
    C'est bien la bonne fonction

    Par contre, si on a pas de page, dur de te dire où il y a un problème (comme un écrasement de ta variable cercleLayer ...)

  3. #3
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Points : 966
    Points
    966
    Par défaut
    De la part d'un autre néophyte... Que penses-tu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cercleLayer.destroyFeatures();

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur cartographe
    Inscrit en
    Avril 2009
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 173
    Points : 4 224
    Points
    4 224
    Par défaut
    Citation Envoyé par cmail Voir le message
    De la part d'un autre néophyte... Que penses-tu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cercleLayer.destroyFeatures();
    destroyFeatures() appelle removeAllFeatures()

  5. #5
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Points : 966
    Points
    966
    Par défaut
    Ma page d'essai

    Par la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    layerCommune.destroyFeatures(layerCommune.getFeaturesByAttribute('COMM','051' )); et d'autres lignes similaires
    J'essaye de supprimer le feature en question... Ce qui ne se matérialise pas sur la carte par un trou sur le fond vert des communes???

    Je contribue sur cette discussion qui aborde le même sujet et qui n'a jamais été résolue. Cela en écho avec cette autre discussion sur le même sujet et aussi non résolue...

    Comment met-on en oeuvre destroyFeatures???

  6. #6
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    Pour se concentrer sur l'essentiel, j'ai repris ton code, que j'ai simplifié avec une seule couche (commune) et une destruction des features sélectionnés qui est faite dans la fonction "efface", appelée au survol (hover) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    ...
    function loadGUI() {    
      var styleCommune = new OpenLayers.StyleMap({
                            "default" : new OpenLayers.Style({
                                    fillColor : '#0f0',
                                    fillOpacity :1,
                                    strokeOpacity : 0.5,
                                    strokeColor: '#333333'
                            })});
                            viewer = new Geoportal.Viewer.Default(
                              "viewerDiv",
                              OpenLayers.Util.extend({
                                    nameInstance : 'viewer',
                                    minZoomLevel : 10,
                                    maxZoomLevel : 10}              
                                    ,
                            gGEOPORTALRIGHTSMANAGEMENT));
            
                    viewer.addGeoportalLayer('GEOGRAPHICALGRIDSYSTEMS.MAPS', {
                    opacity : 1,
                    visibility : true
            });             
            
            layerCommune = viewer.getMap().addLayer(
                            "KML", 
                            "Commune",        
                            "kml/Obs43data.kml", 
                            { 
                              styleMap : styleCommune,
                              visibility : true
                            }, 
                            {
                              formatOptions : {
                                    extractStyles : false // désactivation des styles kml
                              }
                            });
            viewer.setToolsPanelVisibility(false);
            viewer.getMap().setCenterAtLonLat(3.882652, 45.0427233, 10);
     
            var hoverCtrlOpts = OpenLayers.Util.extend(
                        viewer.getMap().getPopupDefaults('KML'), {
                            onSelect : efface,
                            hover : true, 
                            renderIntent: "temporary",
                            autoActivate : true
                        }
             );
             hoverCtrl = new OpenLayers.Control.SelectFeature(layerCommune, hoverCtrlOpts);
             viewer.getMap().addControl(hoverCtrl);
    }
            
    
    function efface(feature) {
            if (feature) {
                    feature.layer.removeFeatures([feature]);
            }
    }
    ...
    Chez moi ça marche : les communes s'effacent lorsqu'on passe la souris dessus.

  7. #7
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Points : 966
    Points
    966
    Par défaut
    Merci Gilles, mais...
    Pour aller plus vite, je reprends souvent de vieilles pages d'essai que je bricole rapidement pour montrer mon problème...
    Et cette fois-ci, cette méthode n'était pas adaptée pour expliquer mon problème qui est le suivant : Je veux effacer certains features de certains layers (par exemple ici sur la couche layerCommune) quand l'attribut du feature (par exemple ici 'COMM') est égal à une certaine valeur (par exemple ici = 051).

    Cela se fait à la fin du chargement (dans le loadend du addLayer). Sans rapport avec la gestion de la souris.

    Demain, je reprends mes essais en essayant d'adapter ta proposition (dont l'écriture me surprend un peu, tout de même) en intégrant layerCommune.getFeaturesByAttribute('COMM','051' ) ...

  8. #8
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Points : 966
    Points
    966
    Par défaut
    J'ai "résolu" mon problème en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    layerCommune.events.register("loadend", this, function(){ 
    		 for (var i= 0, z = layerCommune.features.length; i<z; i++) {
    		if ( layerCommune.features[i].attributes['COMM'].value == '130' ) {
    		var feature = layerCommune.features[i];
    		layerCommune.destroyFeatures(feature);
    		break;
    		}}
    	});
    Ce qui m'embête un peu c'est de faire défiler les feature dans ma boucle pour trouver le bon.... Pas "esthétique" du tout.

    Mais comment diable utiliser getFeaturesByAttribute() ou getFeatureBy() pour trouver le bon feature ????? Mon array de résultat pour getFeaturesByAttribute() est vide, le résultat est NULL pour getFeatureBy()

  9. #9
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    A priori, getFeatureByAttribute devrait fonctionner aussi, car si tu regardes le code de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     /**
     * APIMethod: getFeaturesByAttribute
     * Returns an array of features that have the given attribute key set to the
     * given value. Comparison of attribute values takes care of datatypes, e.g.
     * the string '1234' is not equal to the number 1234.
     *
     * Parameters:
     * attrName - {String}
     * attrValue - {Mixed}
     *
     * Returns:
     * Array({<OpenLayers.Feature.Vector>}) An array of features that have the
     * passed named attribute set to the given value.
     */
     getFeaturesByAttribute: function(attrName, attrValue) {
       var i,
       feature,
       len = this.features.length,
       foundFeatures = [];
       for(i = 0; i < len; i++) {
         feature = this.features[i];
         if(feature && feature.attributes) {
           if (feature.attributes[attrName] === attrValue) {
             foundFeatures.push(feature);
           }
         }
       }
       return foundFeatures;
     },
    c'est la même boucle que toi, avec peut-être le bémol sur le type de la valeur cherchée (cf. le === au lieu du ==).

  10. #10
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Points : 966
    Points
    966
    Par défaut
    En effet, c'est assez simple! Et logique...
    Et pourtant....

  11. #11
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    En fait si :

    toi, tu fais la comparaison :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    layerCommune.features[i].attributes['COMM'].value == '130'
    la fonction getFeaturesByAttribute fait la comparaison :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    layerCommune.features[i].attributes['COMM'] == '130'
    la différence est dans le "value", car dans ton KML, il est écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Data name="COMM"><value>002</value></Data>
    et non pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Data name="COMM">002</Data>
    Donc : soit tu surcharges la fonction getFeaturesByAttribute() en lui faisant comparer la valeur avec layerCommune.features[i].attributes['COMM'].value, soit, tu modifies ton KML en supprimant la balise <value>...

  12. #12
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Points : 966
    Points
    966
    Par défaut
    Je comprends mieux.
    Mais il me semblait que la norme était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Data name="COMM"><value>002</value></Data>
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Data name="COMM">002</Data>
    qui doit introduire des erreurs au validator...
    Je vais regarder de plus près...

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo