La bonne façon de déterminer le type de couche Leaflet?


8

Quelle est l'approche correcte (ou recommandée) pour identifier un "type" de couche dans Leaflet / Javascript?

Je peux utiliser avec succès layer instanceof, mais cela ne fonctionne que lorsque vous connaissez le type au moment de la conception (ce qui, je pense, est généralement le cas).

map.eachLayer(function(layer) {
    console.log('_leaflet_id=' + layer._leaflet_id + ' is layer type= '+ getLayerTypeName(layer));

function getLayerTypeName(layer)
{
    if (layer instanceof L.Marker){
        return 'Marker';
    }
    else if (layer instanceof L.Tooltip){
        return 'Tooltip';
    }
    else if (layer instanceof L.esri.DynamicMapLayer){
        return 'DynamicMapLayer';
    }
    else if (layer instanceof L.esri.BasemapLayer){
        return 'BasemapLayer';
    }   
    else if (layer instanceof L.Layer){
        return 'Layer';
    }        
    else
    {
        return 'Unknown';
    }
}

Existe-t-il une approche différente que je devrais utiliser?

https://jsfiddle.net/CumminsJP/tb28qwpo/

Réponses:


2

Ce n'est pas vraiment un problème de Leaflet, mais un problème général avec Javascript. Et cela concerne spécifiquement quand vous voulez le nom des objets. Pour les comparaisons, il existe de nombreuses façons de le faire en toute sécurité (comme dans votre exemple).

Javascript n'a pas de classes, vous ne pouvez donc vraiment compter que sur

layer.constructor.name

Cependant, si vous utilisez du code minifié, les noms des constructeurs changent souvent (car ils sont également minifiés), ils ne seront donc pas lisibles.

Certaines bibliothèques ajoutent les noms d'objets en tant que propriétés (Leaflet ne le fait pas), mais vous en avez rarement besoin en tant que texte.

Voir https://stackoverflow.com/a/1249554 pour une discussion plus détaillée.

Notez que vous ne devez jamais utiliser ces noms pour quoi que ce soit dans votre code (comparaison / identification) à l'exception de la sortie directe (débogage), car ils ne sont pas fiables.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.