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
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : septembre 2013
    Messages : 452
    Points : 886
    Points
    886
    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
    333
    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 : 333
    Points : 657
    Points
    657
    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
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : septembre 2013
    Messages : 452
    Points : 886
    Points
    886
    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
    185
    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 : 185
    Points : 401
    Points
    401
    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
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : septembre 2013
    Messages : 452
    Points : 886
    Points
    886
    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 : 39
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
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : septembre 2013
    Messages : 452
    Points : 886
    Points
    886
    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 : 33
Taille : 119,2 Ko Nom : bad.png
Affichages : 32
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
    185
    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 : 185
    Points : 401
    Points
    401
    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
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : septembre 2013
    Messages : 452
    Points : 886
    Points
    886
    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
    185
    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 : 185
    Points : 401
    Points
    401
    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
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : septembre 2013
    Messages : 452
    Points : 886
    Points
    886
    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

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