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 :

clone layer et feature


Sujet :

IGN API Géoportail

  1. #1
    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 clone layer et feature
    Sur ma page de test, la couche Commune du viewer2 est obtenue par clonage de la couche Commune de viewer1.
    Si on clique sur les feature de la couche Commune de viewer1, on affiche un popup.
    Par contre, le clic sur les feature de la couche Commune de viewer2 ne déclenche aucune action. Pourquoi? Et comment rendre "sensibles" ces feature?

  2. #2
    Membre confirmé Avatar de acarme
    Femme Profil pro
    Ingénieur d'études en Géomatique
    Inscrit en
    Avril 2013
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études en Géomatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 237
    Points : 522
    Points
    522
    Par défaut
    Bonjour,

    le "pourquoi" de ça ne marche pas est difficile à expliquer, mais ce n'est pas vraiment la bonne façon de faire dans la mesure où la couche a été créée pour un viewer donné (viewer1) et clonée dans un autre viewer..

    La bonne façon de faire serait :
    1. créer le layer dans le viewer1
    2. créer un layer vector "vide" dans le viewer2
    3. peupler ce layer vector avec des feature créés à partir des feature du layer du viewer1

  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
    En suivant (je crois) tes conseils, j'obtiens cette nouvelle page de test.

    Mais le constat est le même, il me semble.

  4. #4
    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
    Christian,

    tu as bien saisi l'idée d'Anaïs, mais tu n'as pas poussé sa logique jusqu'au bout : il ne faut pas non plus cloner les features, mais les recréer à la main.

    Je remplacerais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var feature = this.features[i].clone();
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var feature= new OpenLayers.Feature.Vector({
      geometry: this.features[i].geometry.clone(), // on s'autorise quand même à cloner la Géométrie
      attributes : this.features[i].attributes.clone(), // idem pour les attributs
      style: this.features[i].style.clone()                  // idem pour le style
    }) ;

    on ne clone donc plus que la partie relative aux informations utilisateurs portées par les objets (qui doit être copiée).

  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
    Sur ma page de test reprenant tes directives, j'ai un retour erreur : "this.features[i].attributes.clone is not a function".
    Je ne vois pas de faute primaire de syntaxe????

  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
    En fait, je me suis emballé sur l'existence d'un méthode clone pour n'importe quel objet javascript, ce qui n'est pas le cas.
    Du coup, il faut cloner l'objet représenté par la propriété attributes "à la main".
    en remplaçant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    attributes : this.features[i].attributes.clone()
    style: this.features[i].style.clone()
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    attributes : JSON.parse(JSON.stringify(this.features[i].attributes)),
    style: JSON.parse(JSON.stringify(this.features[i].style))

  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
    J'ai fait le changement sur ma page de test... Mais cela déclenche une erreur : c.geometry.getBounds is not a function sur l'API... Dans ces cas d'erreur, je suis assez perdu pour m'en sortir...

  8. #8
    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
    Christian,

    visiblement le clone sur la geometry des features est aussi déficient. Du coup, essaye en faisant le clone à la main aussi sur celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    geometry: JSON.parse(JSON.stringify(this.features[i].geometry));

  9. #9
    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
    Avant d'envoyer ma réponse précédente, j'avais bien essayé ce "geometry: JSON.parse(JSON.stringify(this.features[i].geometry)), " mais j'avais l'erreur: "cyclic object value" sur cette même ligne.... Alors je m'étais dit que j'allais trop loin avec mon petit velo...
    Mais puisque tu me le demandes, je viens de réécrire cette ligne à la place de "geometry: this.features[i].geometry.clone()," pour que tu voyes ce que cela donne...

  10. #10
    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
    Bon, visiblement, cloner avec JSON ne marche pas non plus, et la methode clone de OpenLayers.Geometry.XXX est bugguée.

    On va essayer ceci pour faire disparaître le message "this.features[i].attributes.clone is not a function" :

    1. tu remets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    geometry: this.features[i].geometry.clone(),
    2. tu rajoutes ce code :

    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
    OpenLayers.Geometry.Collection.calculateBounds= function() {
            this.bounds = null;
            var bounds = new OpenLayers.Bounds();
            var components = this.components;
            if (components) {
                for (var i=0, len=components.length; i<len; i++) {
                    if (components[i].getBounds) bounds.extend(components[i].getBounds());
                }
            }
            // to preserve old behavior, we only set bounds if non-null
            // in the future, we could add bounds.isEmpty()
            if (bounds.left != null && bounds.bottom != null &&
                bounds.right != null && bounds.top != null) {
                this.setBounds(bounds);
            }
        },
    au début de ta balise script.

    3. tu me tiens au courant

  11. #11
    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
    Résultat toujours sur ma page de test.
    Erreur : c.geometry.getBounds is not a function dans /GeoportalExtended.js

    Mais je ne sais si j'ai bien compris ce que tu me demandais de faire car la virgule en fin de ton code 2 me laisse perplexe....

  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
    Et mes clones?

  13. #13
    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
    Bonjour Christian,

    un long moment de silence qui débouche sur des bonnes nouvelles :

    1. le problème de l'erreur "getBounds is not a function" :

    cela vient du fait que l'on n'appelle pas correctement le constructeur de OpenLayers.Feature.Vector quand on recopie les features. Il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var feature= new OpenLayers.Feature.Vector(
             this.features[i].geometry.clone(), // on s'autorise quand même à cloner la Géométrie
            JSON.parse(JSON.stringify(this.features[i].attributes)),
            JSON.parse(JSON.stringify(this.features[i].style))
    ) ;
    La différence est qu'on passe trois paramètres au constructeur et non pas un seul objet qui contient 3 propriétés comme on faisait avant.
    (Ah, si je tenais celui qui t'avais dit d'écrire ça... )

    Du coup, tu peux supprimer la surcharge de OpenLayers.Geometry.Collection.calculateBounds que je t'avais fait rajouter dans mon dernier message.

    Une fois tout cela corrigé, on a enfin la couche qui s'affiche sur le deuxième viewer (), mais toujours pas de popups ().

    2. L'affichage des popups dans le deuxième viewer !

    Il faut en fait rajouter les options qui vont bien après la création de couche viewer2Layer. En effet, celles-ci ne sont pas intégrées lorsqu'on fait un simple appel au constructeur de OpenLayers.Layer.Vector. Il faut donc écrire le code suivant après lorsqu'on ajoute la couche dans le deuxième viewer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
          viewer2Layer = new OpenLayers.Layer.Vector("Commune sur viewer2", {
              opacity:1.0,
              onFeatureInsert: Geoportal.Popup.Anchored.createPopUpForKMLFeature
          });
          viewer2.map.addLayer(viewer2Layer);
    
          // popup activation :
          var xmlDefaults= viewer2.map.getPopupDefaults("KML");
          var select= new OpenLayers.Control.SelectFeature(viewer2Layer, xmlDefaults);
          viewer2.map.addControl(select);
          select.activate();
    Et les popups devraient s'afficher...

  14. #14
    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
    OK! Maintenant, je vais essayer d'adapter cela à mon projet.

    Mais avant de me lancer, sur le principe, j'aimerais bien avoir ton sentiment:
    J'ai 3 viewers qui gèrent n couches identiques. Donc au lieu de charger 3xn couches avec des délais de réponse en conséquence, j'envisage seulement de télécharger n couches puis de les cloner dans mes deux autres viewers. Vois-tu quelques problèmes à venir?

  15. #15
    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
    Christian,

    le fait de cloner les couches te fait économiser le temps de chargement du fichier puis celui de parsing du format KML pour créer les features des couches vecteur.
    Dans l'absolu et d'un point de vue intellectuel, c'est mieux.

    Dans la pratique, je pense que cela n'améliorera que très légèrement le temps de chargement de la page dans la mesure où ton KML est sur le même serveur que ta page et qu'il n'est pas énorme (environ 125 Ko) comparé aux autres éléments chargés (API JS notamment : environ 2 Mo)...

    Le mieux est de tester les deux méthodes pour te faire une idée.

    Ce que je peux te dire est que la méthode préconisée dans cette discussion est "saine" : je ne pense pas que tu rencontreras une impossibilité théorique si tu la poursuis.
    Pour info, il y a encore un problème de curseur à régler après les corrections que je t'ai fournies ce matin, mais je pense que c'est solvable...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déplacement d'un form transparent (LAYERED)
    Par Darkspace dans le forum Composants VCL
    Réponses: 26
    Dernier message: 03/04/2009, 06h09
  2. [VB.NET] DataTable.Clone ne veut rien savoir
    Par anthony70 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/12/2004, 20h57
  3. Besoin d'aide : afficher / cacher des layers
    Par mickeliette dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/10/2004, 12h03
  4. [Layer] Probleme de superposition avec les JMenuItem
    Par azdruyel dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 21/07/2004, 12h24

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