banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 29 March 2016 14:30

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

[LeafLet] [Javascript] Condition if dans pour une popup

Bonjour à tous,

(je pose beaucoup de question chez les voisins du Forum SIG, alors pour changer je viens un peu par ici :-) )

Sur une carte Leaflet, je tente d'adapter le contenu d'une infobulle générée d'après un GeoJson.
Je souhaiterais, si possible, poser des conditions dans cette popup.

Actuellement, avec quelques properties, ça marche comme ça :

Code:

layer.bindPopup('nom : ' + feature.properties.name + '<br>adresse : ' + feature.properties.adress)

Comme, pour certaines entités, le GeoJson n'a pas tous ces attributs, je souhaiterais poser une condition du style (3 essais infructueux ci-dessous) :

Code:

layer.bindPopup(if (feature.properties.name == undefined) { 'Pas de nom ' ;} else {'nom : ' + feature.properties.name ;} ;))
ou
layer.bindPopup(if (feature.properties.name is null) { 'Pas de nom ' ;} else {'nom : ' + feature.properties.name ;} ;))
ou
layer.bindPopup(if (typeof feature.properties.name != "undefined") { 'Pas de nom ' ;} else {'nom : ' + feature.properties.name ;} ;))

Une idée de la syntaxe pour cela ?

Merci à vous.

Sylvain M.

Dernière modification par Sylvain M. (Tue 29 March 2016 14:31)


Sylvain M.

Hors ligne

 

#2 Tue 29 March 2016 14:42

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Re: [LeafLet] [Javascript] Condition if dans pour une popup

Comme souvent, c'est en posant la question qu'on trouve la réponse...
Bref, la solution était de créer une variable pour stocker cette valeur :

Code:

            onEachFeature: function (feature, layer) {
            
            var popupname = '';

        if (feature.properties.name == undefined) {popupname = 'Pas de nom';} else {popupname = feature.properties.name ;}
        layer.bindPopup(popupname);        
            }

Du coup, on doit pouvoir faire ça pour chaque propriété. Voire, construire le contenu entier de sa popup dans une variable, ce sera plus simple je pense.

Au cas où ce soit utile à d'autres !

A+

Sylvain M.


Sylvain M.

Hors ligne

 

#3 Tue 29 March 2016 14:47

Dof
Participant assidu
Lieu: Grenoble
Date d'inscription: 28 Oct 2009
Messages: 317
Site web

Re: [LeafLet] [Javascript] Condition if dans pour une popup

Bonjour,
Pour plus de clareté, il serait preférable de sortir le text dans une variable, ex :

Code:

var le_text = '';

if (!feature.properties.name){
le_text = 'Pas de nom'
}
else {
le_text = 'nom : ' + feature.properties.name
}

layer.bindPopup(le_text);

Ou de manière plus concise en utilisant l'opérateur ternaire :

Code:

var le_text = (!feature.properties.name) ?  'Pas de nom'  : 'nom : ' + feature.properties.name;
layer.bindPopup(le_text);

Hors ligne

 

#4 Tue 29 March 2016 15:03

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Re: [LeafLet] [Javascript] Condition if dans pour une popup

Merci Dof !
Je crois que nous étions arrivé à la même solution dans ta première proposition ;-) Mais la 2e est encore plus fun et me fait découvrir les "opérateurs ternaires" ! smile
De manière clean, comment ferais-tu pour créer une popup basée sur plusieurs properties, avec des conditions pour plusieurs d’entre-elles ?
Ferais-tu une variable par properties ? Ou une fonction qui "concatène" le résultat de plusieurs conditions à la suite ?
(suis-je clair dans mes propos ... :-$ )

Merci encore !

Sylvain M.


Sylvain M.

Hors ligne

 

#5 Tue 29 March 2016 15:22

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Re: [LeafLet] [Javascript] Condition if dans pour une popup

Désolé, je rajoute une dernière question bonus sur ce sujet :
Comment faire avec les properties dont le nom contient des caractères spéciaux ?
(en l'occurence : "@timestamp", puisque mon GeoJson est issu d'une requête sur Overpass)
Bien sûr, je peux renommer le champ dans le GeoJson, mais ça rajoute des étapes dans le processus : si je peux le gérer via une fonction JS, ce serait plus sympa.

Code:

layer.bindPopup(feature.properties.@timestamp)

Ne marche pas...

Merci !!!

Sylvain M.


Sylvain M.

Hors ligne

 

#6 Tue 29 March 2016 16:39

Dof
Participant assidu
Lieu: Grenoble
Date d'inscription: 28 Oct 2009
Messages: 317
Site web

Re: [LeafLet] [Javascript] Condition if dans pour une popup

Pour la deuxieme question avec les caractères spéciaux, on peut utiliser la notation entre crochet qui devrait résoudre le problème:

Code:

layer.bindPopup(feature.properties['@timestamp'])

Pour la question précédente, je ferais un petit tableau d'objet et une petite boucle. Le tableau aura le libélé (ex : Nom) et la valeur de la propriété (name)

Code:

var attributs = [
{label: 'Nom', value: 'name'},
{label: 'Timestamp', value:'@timestamp'},
{label: 'Utilisateur', value: '@user'}
]


onEachFeature: function (feature, layer) {
    var popupname = '';
    for (var i = 0; i <attributs.length; i++){
       var current_attribut =   (!feature.properties[attributs[i].value]) ?  'Pas de ' + attributs[i].label +'<br>' : attributs[i].label+' : ' + feature.properties[attributs[i].value] +'<br>';
        popupname = popupname + current_attribut; // ou popupname += current_attribut (c'est pareil)
    }

        layer.bindPopup(popupname);  
}

Je n'ai pas testé, il est possible qu'il y ait une erreur...

Hors ligne

 

#7 Tue 29 March 2016 16:58

Sylvain M.
Participant assidu
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 995

Re: [LeafLet] [Javascript] Condition if dans pour une popup

Dof a écrit:

Je n'ai pas testé, il est possible qu'il y ait une erreur...


Pas de souci : merci beaucoup ! Je planche là dessus et je reviens si j'ai des questions !

Dof a écrit:

Pour la deuxieme question avec les caractères spéciaux, on peut utiliser la notation entre crochet qui devrait résoudre le problème:


Testé et approuvé : MERCI !!!

A+

Sylvain M.


Sylvain M.

Hors ligne

 

Pied de page des forums

Powered by FluxBB