4 votos

Error con .eachLayer en leaflet.js

Estoy tratando de agregar popups para íconos de punto usando Leaflet.js y me encontré con este error: "Uncaught TypeError: points.eachLayer is not a function"

Aquí está mi código:

function addPoints(data){
    for (var feature in data.features){
        if(data.features[feature].properties.activity == "hunting"){   
            points = L.marker([data.features[feature].geometry.coordinates[1],data.features[feature].geometry.coordinates[0]], {
                icon: L.mapbox.marker.icon({
                    'marker-color': '#FF5A5C',
                    'marker-symbol': 'bus'
                })
            }).addTo(map).on({
                mouseover: function(e){
                    this.openPopup();
                }, mouseout: function(e){
                    this.closePopup();
                }   
            });
        } 
    };
    drawPopup(data);
} //end addPoints
function drawPopup(data){
    points.eachLayer(function(layer){
        var popupContent = "Park: " + data.features[feature].properties.name + "" + "Activities: " + data.features[feature].properties.activity; 
        layer.bindPopup(popupContent);
    });
}

He usado código casi idéntico antes y nunca he tenido este problema, ¿qué estoy haciendo mal?

3voto

ghybs Puntos 868

EDITAR 1:

Su código con Layer Group sería así:

var points = L.layerGroup();

addPoints(data);

function addPoints(data) {
    for (var feature in data.features) {
        if (data.features[feature].properties.activity == "hunting") {
            var marker = L.marker([
                data.features[feature].geometry.coordinates[1],
                data.features[feature].geometry.coordinates[0]
            ], {
                icon: L.mapbox.marker.icon({
                    'marker-color': '#FF5A5C',
                        'marker-symbol': 'bus'
                })
            }).addTo(map).on({
                mouseover: function (e) {
                    this.openPopup();
                },
                mouseout: function (e) {
                    this.closePopup();
                }
            });

            // Manteniendo una referencia a la clave de la característica.
            marker.feature = feature;
            // Podría almacenar directamente todos los datos de la característica en el marcador...

            // Finalmente, agregando el marcador construido en el Grupo de Capas `points`.
            points.addLayer(marker);
        }
    };
    drawPopup(data);
} //fin addPoints

function drawPopup(data) {
    points.eachLayer(function (layer) {
        // Probablemente falta una asignación para `feature`?
        var feature = layer.feature;

        var popupContent =
            "Parque: " +
            data.features[feature].properties.name +
            "" + "Actividades: " +
            data.features[feature].properties.activity;
        layer.bindPopup(popupContent);
    });
}    layer.bindPopup(popupContent);
    });
}

Como se menciona en los comentarios, su código probablemente podría simplificarse utilizando la fábrica L.geoJson en lugar de recorrer manualmente data. Pero debería funcionar tal como está.


Su variable points parece ser solo el último marcador creado:

points = L.marker( ...

Probablemente desea crear un Grupo de Capas (que tiene el método eachLayer) y agregar sus marcadores en él:

var points = L.layerGroup();

...
points.addLayer(L.marker(/* ... */));

...
points.eachLayer(function (layer) { /* ... */ })

0 votos

Eso tiene sentido, pero ahora tengo el mismo error para points.addLayer "Uncaught TypeError: points.addLayer is not a function"

0 votos

La razón más probable es que points no esté inicializado correctamente antes de usar addLayer. ¿Hay alguna posibilidad de que puedas reproducir tu problema en línea? (por ejemplo, en jsfiddle). También puede ser de tu interés usar L.geoJson para crear tu grupo con marcadores en lugar de recorrer los datos tú mismo. En particular, tienes el método filter para seleccionar solo las características que deseas mantener.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X