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 :

SDK - Styler une couche GeoJSON depuis la lib OpenLayers


Sujet :

IGN API Géoportail

  1. #1
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut SDK - Styler une couche GeoJSON depuis la lib OpenLayers
    C'est encore moi,

    Suite de mes investigations de mise à jour du SDK, j'ai relevé un comportement étrange quand il s'agit de styler après coup une couche GeoJSON.

    Test à faire depuis une ancienne version du SDK à l'url https://www.agglo-larochelle.fr/carto/embed

    En console, exécuter le code suivant qui va ajouter une couche de ponctuels, définir une fonction de style, et appliquer cette fonction de style à la couche OpenLayers sous-jacente => Ca marche parfaitement

    Code javascript : 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
    var layerOptions = {
        'conteneur' : {
            title: 'Conteneurs textiles',
            picto: '',
            format: 'geojson',
            url: 'https://www.agglo-larochelle.fr/documents/10839/10998519/Conteneur+textile+-+couche.json/ac244d0b-ffab-4e48-8fe3-c252a72c9e6a',
            projection: 'EPSG:3857'
        }
    }
    map.addLayers(layerOptions)
     
    var gpStyleFunction = function(feature) {
        return new ol.style.Style({
            image: new ol.style.Icon({
                src: 'https://www.agglo-larochelle.fr/documents/10839/10998534/picto-oap-autres.png/d5adbc41-7487-4a22-937e-91336d7f71f7',
                size: [28,41],
                anchor:[0.5,1]
            })
        });
    }
    var olLayer = map.getLibMap().getLayers().item(map.getLibMap().getLayers().getLength()-1);
    olLayer.setStyle(gpStyleFunction);

    Même code exécuté en console depuis la version actuelle du SDK à l'url https://www.agglo-larochelle.fr/cart...d-nouvelle-api => le style n'est pas appliqué

    Encore plus étrange : si je modifie le code ci-dessus pour définir du clustering sur la couche (même du "faux clustering" avec une distance de 0) en redéfinissant la source de données => cette fois-ci le style est bien appliqué

    Code javascript : 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
    var layerOptions = {
        'conteneur' : {
            title: 'Conteneurs textiles',
            picto: '',
            format: 'geojson',
            url: 'https://www.agglo-larochelle.fr/documents/10839/10998519/Conteneur+textile+-+couche.json/ac244d0b-ffab-4e48-8fe3-c252a72c9e6a',
            projection: 'EPSG:3857'
        }
    }
    map.addLayers(layerOptions)
     
    var gpStyleFunction = function(feature) {
        return new ol.style.Style({
            image: new ol.style.Icon({
                src: 'https://www.agglo-larochelle.fr/documents/10839/10998534/picto-oap-autres.png/d5adbc41-7487-4a22-937e-91336d7f71f7',
                size: [28,41],
                anchor:[0.5,1]
            })
        });
    }
    var olLayer = map.getLibMap().getLayers().item(map.getLibMap().getLayers().getLength()-1);
    var clusterSource = new ol.source.Cluster({
      distance: 0,
      source: olLayer.getSource()
    });
    olLayer.setSource(clusterSource);
    olLayer.setStyle(gpStyleFunction);

    Une idée de ce qui se passe ? C'est très étrange.

    Je précise que pour ce cas précis (un seule picto identique pour tous les points) j'aurais pu passer par les styleOptions de la couche de la map Géoportail directement. Mais l'idée derrière c'est de profiter de la mécanique de la couche OpenLayers pour définir une styleFunction dépendant des propriétés des points, chose qui sauf erreur de ma part n'est pas permise par le couche Géoportail directement.
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  2. #2
    Membre éclairé Avatar de elias couppe
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 408
    Points : 787
    Points
    787
    Par défaut
    Re bonjour,

    Je n'ai pas encore regardé en détail, mais je constate bien le problème, merci pour ta description détaillée. C'est effectivement une partie du code à laquelle on a touché dernièrement...j'ai l'impression qu'on a cassé la hiérarchie des priorités sur les styles appliqués aux couches, et qu'un style appliqué à une couche vectorielle directement via OpenLayers n'est plus pris en compte par le SDK et semble sortir du workflow...

    On essaye de regarder dès que possible pour corriger ça.

    Merci pour ta remontée,

    Elias

  3. #3
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    Hello !

    J'up le sujet, juste pour savoir si vous avez des pistes de résolution de ce problème.

    Merci
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  4. #4
    Membre averti Avatar de lowzonenose
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 196
    Points : 407
    Points
    407
    Par défaut
    Hello Jeremy,

    Il faut que tu utilises ce code pour surcharger les styles :
    Citation Envoyé par javascript
    ]
    olLayer.getSource().getFeatures().forEach((feature) => {
    feature.setStyle(gpStyleFunction);
    });
    Explication :
    Les styles sont ajoutés au niveau des features afin d'avoir la possibilité de serialiser les styles lors d'un export.
    Du coup, il n'est donc plus possible de surcharger les styles via l'appel setStyle() du layer, car les styles au niveau du feature sont prioritaire au layer !

    Si pas assez claire, appelle nous

    @+JP

  5. #5
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    Salut JP !

    Merci pour le tip. J'essaye ça avant la fin de semaine et je te dis.

    Sinon, j'espère que t'as pensé à moi au mois de mai ces deux dernières années. Y a probablement ma tronche quelque part sur cette photo

    Nom : Fwq0uiyX0AAdzJ8.jpg
Affichages : 117
Taille : 546,2 Ko
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  6. #6
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    Salut,

    J'ai donc essayé le code suivant sur l'url https://www.agglo-larochelle.fr/cart...d-nouvelle-api :

    Code javascript : 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
     
    var layerOptions = {
        'conteneur' : {
            title: 'Conteneurs textiles',
            picto: '',
            format: 'geojson',
            url: 'https://www.agglo-larochelle.fr/documents/10839/10998519/Conteneur+textile+-+couche.json/ac244d0b-ffab-4e48-8fe3-c252a72c9e6a',
            projection: 'EPSG:3857'
        }
    }
    map.addLayers(layerOptions)
     
    var gpStyleFunction = function(feature) {
        return new ol.style.Style({
            image: new ol.style.Icon({
                src: 'https://www.agglo-larochelle.fr/documents/10839/10998534/picto-oap-autres.png/d5adbc41-7487-4a22-937e-91336d7f71f7',
                size: [28,41],
                anchor:[0.5,1]
            })
        });
    }
    var olLayer = map.getLibMap().getLayers().item(map.getLibMap().getLayers().getLength()-1);
    olLayer.getSource().getFeatures().forEach((feature) => {
        feature.setStyle(gpStyleFunction);
    });

    Verdict : ça n'a rien changé, le style n'est toujours pas appliqué...

    Je devrais avoir le style de gauche, et j'ai toujours un style par défaut comme à droite. Mais peut-être y a-t-il quelque chose que je n'ai pas compris ?

    Nom : good.png
Affichages : 114
Taille : 119,2 Ko Nom : bad.png
Affichages : 112
Taille : 145,3 Ko
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  7. #7
    Membre averti Avatar de lowzonenose
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 196
    Points : 407
    Points
    407
    Par défaut
    tu peux mettre un setTimeOut sur l'application de la fonction de style sur les features.
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    setTimeOut(function () {
      olLayer.getSource().getFeatures().forEach((feature) => {
          feature.setStyle(gpStyleFunction);
      });
    }, 200);

  8. #8
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    Yes, beaucoup mieux !
    En live console ça marche. J'intègre dans mon code et je checke
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  9. #9
    Membre averti Avatar de lowzonenose
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 196
    Points : 407
    Points
    407
    Par défaut
    Il y'a du download des icônes dans ton style, du coup, l'opération devient asynchrone.
    Faut donc laisser un peu de temps au chargement.

  10. #10
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    J'ai envoyé, dans le code, ça marche vraiment bien ! Merci !
    Ca résout 95% des cas de figure.

    Me reste des soucis en cas de style sur des linéaires :
    - https://www.agglo-larochelle.fr/cart...-lignes-de-b-1
    - https://www.agglo-larochelle.fr/cart...-lignes-de-b-1

    Ou en cas de styles multiples suivant la résolution :
    - https://www.agglo-larochelle.fr/cart...-oap-modifiees
    - https://www.agglo-larochelle.fr/cart...-oap-modifiees

    Je vais me pencher sur ces cas de figure. Je passe pas encore en résolu, je le ferai quand tout sera réglé
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  11. #11
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    Hello,

    J'avais pas trop eu le temps de me repencher sur le sujet ces derniers mois, juste pour dire que tous les cas d'usage fonctionnent.

    Merci encore pour le support, je passe en résolu.

    A une prochaine
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  12. #12
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    J'ai parlé trop vite : il y a un problème qui persiste.

    Exemple sur https://www.agglo-larochelle.fr/cart...neurs-textiles

    Les données sont chargées via un GeoJSON, avec application de style. On voit bien que le picto est correctement appliqué, avec un léger flash dû au setTimeout (le temps de passer du picto par défaut au picto chargé via setStyle). Ce flash est un peu désagréable à l'oeil, mais c'est pas l'essentiel (si vous avez une idée pour le supprimer je prends quant même).

    Mais dès qu'on zoome/dézoome, les pictos par défaut refont leur apparition. Je me vois mal réappliquer le style aux features à chaque zoom/dézoom sur l'ensemble des couches concernées. Comment pourrait-on s'assurer de la persistence du style sur la couche ?
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  13. #13
    Membre averti Avatar de lowzonenose
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 196
    Points : 407
    Points
    407
    Par défaut
    c'est vrai, y'a un truc qui cloche...
    Tu définies ta fonction de style pour chaque feature, mais ensuite, cette fonction est undefined après chaque rendu de la couche !?

    Ne vaudrait il pas appliquer cette fonction au niveau de la couche au lieu de l'appliquer manuellement pour chaque feature ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new ol.layer.Vector({
      style : myFunctionStyle
    });

  14. #14
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    J'ajoute mes couches en utilisant le map.addLayers(layerOptions) du SDK, pas directement en définissant la couche OpenLayers, donc je peux pas faire comme ça non (je suis un peu rouillé) ?

    EDIT : tu m'avais dit ça y a quelques temps : "Du coup, il n'est donc plus possible de surcharger les styles via l'appel setStyle() du layer, car les styles au niveau du feature sont prioritaire au layer !". C'est pour ça que tu m'avais conseillé de styler les features plutôt que le layer de façon globale
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

  15. #15
    Membre éclairé Avatar de jrenard
    Homme Profil pro
    Webdesigner / développeur front-end
    Inscrit en
    Septembre 2013
    Messages
    456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Webdesigner / développeur front-end
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2013
    Messages : 456
    Points : 894
    Points
    894
    Par défaut
    J'ai compris !
    Comme tu l'as dit, les styles du feature prennent le pas sur celles du layer. Donc il suffit d'appliquer le style au layer (comme fait au tout départ), puis de désactiver les styles des features.
    Pour ça la doc OpenLayers dit d'appliquer un setStyle sans argument sur les features

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    olLayer.getSource().getFeatures().forEach((feature) => {
          feature.setStyle();
      });

    Et ça marche !

    Si je reprends le code de mon tout premier message, il suffit donc d'ajouter ces 3 lignes, ce qui donne :

    Code javascript : 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
    var layerOptions = {
        'conteneur' : {
            title: 'Conteneurs textiles',
            picto: '',
            format: 'geojson',
            url: 'https://www.agglo-larochelle.fr/documents/10839/10998519/Conteneur+textile+-+couche.json/ac244d0b-ffab-4e48-8fe3-c252a72c9e6a',
            projection: 'EPSG:3857'
        }
    }
    map.addLayers(layerOptions)
     
    var gpStyleFunction = function(feature) {
        return new ol.style.Style({
            image: new ol.style.Icon({
                src: 'https://www.agglo-larochelle.fr/documents/10839/10998534/picto-oap-autres.png/d5adbc41-7487-4a22-937e-91336d7f71f7',
                size: [28,41],
                anchor:[0.5,1]
            })
        });
    }
    var olLayer = map.getLibMap().getLayers().item(map.getLibMap().getLayers().getLength()-1);
    olLayer.setStyle(gpStyleFunction);
    olLayer.getSource().getFeatures().forEach((feature) => {
          feature.setStyle();
      });

    Testé, déployé, tout est nickel. Merci pour les discussions qui m'ont fait comprendre le truc
    Développeur Web - Agglo La Rochelle
    Anciennement pôle technique Géoportail - IGN
    Twitter : @dje_renard

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

Discussions similaires

  1. [LeafLet] Utiliser bringToBack() sur une couche vectoriel en GeoJSON
    Par Nymphea29 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 03/09/2021, 22h51
  2. Insertion d'une couche à partir d'un fichier GeoJSON
    Par Clement_archeo dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 04/04/2019, 17h27
  3. [LeafLet] Changement de style d'une couche GeoJson au survol de la souris
    Par Marc31 dans le forum Bibliothèques & Frameworks
    Réponses: 11
    Dernier message: 11/12/2015, 11h53
  4. Réponses: 0
    Dernier message: 26/06/2013, 09h30
  5. Charger une couche exportée depuis SIG ArcGis au format .xml
    Par hm7845 dans le forum IGN API Géoportail
    Réponses: 3
    Dernier message: 19/01/2011, 22h12

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