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 :

Gestion des zooms / visibilité des calques


Sujet :

IGN API Géoportail

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Par défaut Gestion des zooms / visibilité des calques
    Bonjour,

    P'tite remonté de petits trucs énervant existant aussi bien en beta4 que beta5 :

    Pb zooms :
    Si le seul calque visible est GEOGRAPHICALGRIDSYSTEMS.MAPS, le zoom + n'est pas borné (en fait il l'est mais sur le calque ORTHOIMAGERY.ORTHOPHOTOS:WMSC). Du coup, on zoom et rien ne s'affiche.
    Une fois dans cette situation (2ème effet kisscool), la gestion de zoom - par la molette de la souris ne fonctionne plus (j'imagine que si le zoom + était borné le pb n'exciterait pas)

    Pb visibilité des calques :
    Il est dommage que les choix effectués sur la visibilité des calque ne suivent pas même lorsqu'on change de territoire. Je m'explique :
    - sur une partie de la France j'ai choisi de ne pas afficher le calque photo
    - lors du passage en vue "monde" (MILLER) ce choix n'est pas reporté
    - si je me déplace et zoom sur (par exemple) Cayenne => même combat mon choix d'affichage ne suit pas.

    Toutes mes excuses pour vous embêter avec des sujets bénins mais pour l'utilisateur final, ça fait moins d'explications à fournir...

  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
    Par défaut
    Citation Envoyé par shama Voir le message
    Pb zooms :
    Si le seul calque visible est GEOGRAPHICALGRIDSYSTEMS.MAPS, le zoom + n'est pas borné (en fait il l'est mais sur le calque ORTHOIMAGERY.ORTHOPHOTOS:WMSC). Du coup, on zoom et rien ne s'affiche.
    Ce mécanisme n'est pas propre à l'API : si n couches existent avec des min/max zooms différents, le fait d'activer/désactiver l'une d'elles ne change pas globalement que la carte va du min(des min) au max(des max).

    Il faudrait parcourir toutes les couches activées et modifier le min/max de la carte en fonction de l'activation/désactivation ... A regarder

    Citation Envoyé par shama Voir le message
    Une fois dans cette situation (2ème effet kisscool), la gestion de zoom - par la molette de la souris ne fonctionne plus (j'imagine que si le zoom + était borné le pb n'exciterait pas)
    C'est effectivement relié : le zoom molette est lié au div dessinées dans la carte, pas de div, pas d'évènement !

    Globalement, rien n'empêche d'insérer les couches en limitant les min/max zooms.

    Citation Envoyé par shama Voir le message
    Pb visibilité des calques :
    Il est dommage que les choix effectués sur la visibilité des calque ne suivent pas même lorsqu'on change de territoire. Je m'explique :
    - sur une partie de la France j'ai choisi de ne pas afficher le calque photo
    - lors du passage en vue "monde" (MILLER) ce choix n'est pas reporté
    - si je me déplace et zoom sur (par exemple) Cayenne => même combat mon choix d'affichage ne suit pas.
    Certes, quant on utilise les couches par défaut c'est ce qui arrive : le changement de territoire est un changement de baseLayer avec des paramètrages par défaut. Pour ne pas avoir les photos sur les territoires :

    • soit ne pas les insérer par défaut,
    • soit les insérer avec visibility à false.

    Je construirerai un exemple qui montre comment faire ...

    Toute contribution reste bienvenue

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Par défaut
    Bravo et merci pour la réactivité...

    Pour le pb des zoom, j'ai pas encore pu regarder mais je pense qu'un overload de la fonction "isValidZoomLevel" de "Map" pour faire le test sur les calques visibles devrais faire le truc... A suivre.

    Pour le pb des claques actifs/inactifs qui ne suivent pas lorsqu'on change de territoire je m'en suis sorti grosso modo en :
    - initialisant tous les hash "savedStates" des "Layer" avec les valeur par défaut de 'visibility' et 'opacity'
    - ensuite lors du changement de visibilité d'un calque, je remplace tous les 'savedStates' correspondants

    Merci pour les infos, même si il est quand même appréciable d'avoir les sources, car les "savedStates" ne pas décris dans la doc

    Je sens que je vais bientôt vous poser une question épineuse sur les overload effectués au niveau d'OpenLayer

  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
    Par défaut
    Citation Envoyé par shama Voir le message
    Pour le pb des zoom, j'ai pas encore pu regarder mais je pense qu'un overload de la fonction "isValidZoomLevel" de "Map" pour faire le test sur les calques visibles devrais faire le truc... A suivre.
    Voici la surcharge de la méthode Geoportal.Control.LayerSwitcher.updateMap() que j'ai ajouté à la 1.0beta5 :

    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
        /**
         * APIMethod: updateMap
         * Cycles through the loaded data and makes
         * the necessary calls to the Map object such that that the map's
         * visual state corresponds to what the user has selected in the control
         * Does not take into account base layers.
         */
        updateMap: function() {
             var mxz= typeof(this.map.baseLayer.minZoomLevel)=='number'?
                this.map.baseLayer.minZoomLevel
            :   Number.NaN;
            var mnz= typeof(this.map.baseLayer.maxZoomLevel)=='number'?
                this.map.baseLayer.maxZoomLevel
            :   Number.NaN;
            var changeZoom= -1;
            // loop over layers to fix min/max if necessary
            if (!isNaN(mxz) && !isNaN(mnz)) {
                for (var i= 0, len= this.dataLayers.length; i<len; i++) {
                    var layerEntry= this.dataLayers[i];
                    if (layerEntry.inputElem.checked) {
                        if (typeof(layerEntry.layer.minZoomLevel)=='number' &&
                            layerEntry.layer.minZoomLevel<mnz) {
                            mnz= layerEntry.layer.minZoomLevel;
                        }
                        if (typeof(layerEntry.layer.maxZoomLevel)=='number' &&
                            layerEntry.layer.maxZoomLevel>mxz) {
                            mxz= layerEntry.layer.maxZoomLevel;
                        }
                    }
                }
                if (mnz<=mxz) {
                    if (mxz<this.map.baseLayer.maxZoomLevel && this.map.getZoom()>mxz) {
                        changeZoom= mxz;
                    }
                    if (mnz>this.map.baseLayer.minZoomLevel && this.map.getZoom()<mnz) {
                        changeZoom= mnz;
                    }
                    if (this.map.baseLayer.minZoomLevel!=mnz) {
                        this.map.baseLayer.minZoomLevel= mnz;
                        this.map.baseLayer.minResolution= this.map.baseLayer.resolutions[mnz];
                        this.map.baseLayer.minScale= this.map.baseLayer.scales[mnz];
                    }
                    if (this.map.baseLayer.maxZoomLevel!=mxz) {
                        this.map.baseLayer.maxZoomLevel= mxz;
                        this.map.baseLayer.maxResolution= this.map.baseLayer.resolutions[mxz];
                        this.map.baseLayer.maxScale= this.map.baseLayer.scales[mxz];
                    }
                }
            }
             // set the correct visibilities for the overlays
            for (var i= 0, len= this.dataLayers.length; i<len; i++) {
                var layerEntry= this.dataLayers[i];
                layerEntry.layer.setVisibility(layerEntry.inputElem.checked);
            }
             if (changeZoom!=-1) {
                this.map.moveTo(null,changeZoom);
            }
     },
    Globalement si on retire une couche, on recalcule les min/max zooms de la carte. Si nécessaire, on les met à jour et on change de zoom...

    Citation Envoyé par shama Voir le message
    Pour le pb des claques actifs/inactifs qui ne suivent pas lorsqu'on change de territoire je m'en suis sorti grosso modo en :
    - initialisant tous les hash "savedStates" des "Layer" avec les valeur par défaut de 'visibility' et 'opacity'
    - ensuite lors du changement de visibilité d'un calque, je remplace tous les 'savedStates' correspondants
    Voici le code que j'ai rajouté dans la 1.0beta5 (Geoportal.Viewer.addGeoportaLayer) :

    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
    ...
                if (layer) {
                    map.addLayer(layer);
                     // listen to changelayer, visibility change to synchronize
                    // local/world layers :
                    map.events.register('changelayer',layer,function(e) {
                        if (!e) { return; }
                        if (e.property!='visibility') { return; }
                        if (e.layer===this) { return; }
                        if (e.layer.name!=this.name) { return; }
                        var v= e.layer.getVisibility();
                        if (!this.getNativeProjection().isCompatibleWith(this.map.getProjection()) &&
                            v!=this.getVisibility()) {
                            this.setVisibility(v);
                            for (var i= 0, l= this.map.layers.length; i<l; i++) {
                                var lyr= this.map.layers[i];
                                if (!lyr.isBaseLayer) { continue; }
                                if (lyr===this.map.baseLayer) { continue; }
                                if (this.getNativeProjection().isCompatibleWith(lyr.getNativeProjection())) {
                                    if (!this.savedStates[lyr.id]) {
                                        this.savedStates[lyr.id]= {};
                                    }
                                    this.savedStates[lyr.id].visibility= v;
                                    this.savedStates[lyr.id].opacity= this.opacity;
                                }
                            }
                        }
                    });
                }
     ...
    Les savedStates ne sont pas documentés car ils ne sont pas marqués APIProperty (internes à la librairie).

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 94
    Par défaut
    Citation Envoyé par dgrichard Voir le message
    Voici la surcharge de la méthode Geoportal.Control.LayerSwitcher.updateMap() que j'ai ajouté à la 1.0beta5 :
    Globalement si on retire une couche, on recalcule les min/max zooms de la carte. Si nécessaire, on les met à jour et on change de zoom...
    Du coup si on utilise pas le LayerSwitcher de l'API on en profite pas ?


    Citation Envoyé par dgrichard Voir le message
    Voici le code que j'ai rajouté dans la 1.0beta5 (Geoportal.Viewer.addGeoportaLayer) :
    Les savedStates ne sont pas documentés car ils ne sont pas marqués APIProperty (internes à la librairie).
    Oui on fait la même chose, merci d'avoir pris en compte ce besoin

  6. #6
    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
    Par défaut
    Citation Envoyé par shama Voir le message
    Du coup si on utilise pas le LayerSwitcher de l'API on en profite pas ?

    Effectivement, ce POC n'est pas définitif. Je vais écrire un écouteur d'évènements dans la carte pour le rendre plus "générique".

    Merci pour le retour

Discussions similaires

  1. Gestion de projet: encodage des heures sur des tâches
    Par Terminator dans le forum Gestion de projet
    Réponses: 2
    Dernier message: 03/02/2015, 11h10
  2. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 09h44
  3. Réponses: 4
    Dernier message: 02/04/2008, 17h51
  4. Réponses: 3
    Dernier message: 13/09/2007, 18h11
  5. Réponses: 3
    Dernier message: 23/01/2007, 08h14

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