9 votos

Añadir una ventana emergente a la capa GeoJSON en Leaflet

Soy nuevo en el trabajo con la API de Leaflet y estoy teniendo problemas con la creación de ventanas emergentes para una capa GeoJSON. He mirado el siguiente post como referencia y sigo teniendo dificultades: vinculación de matrices anidadas como ventanas emergentes geojson en leaflet

Mis datos GeoJson tienen el siguiente aspecto:

{
    "type": "FeatureCollection",
    "features": [
        {
            "geometry": {
                "type": "Point",
                "coordinates": [
                    -73.97364044189453,
                    40.66893768310547
                ]
            },
            "type": "Feature",
            "properties": {
                "lon": -73.97364044189453,
                "lat": 40.66893768310547,
                "version": "1.1",
                "t": 1381167616,
                "device": "iPhone3,3",
                "alt": 67,
                "os": "6.1.3"
            }
        },
        {
            "geometry": {
                "type": "Point",
                "coordinates": [
                    -73.96121215820312,
                    40.66240692138672
                ]
            },
            "type": "Feature",
            "properties": {
                "lon": -73.96121215820312,
                "lat": 40.66240692138672,
                "version": "1.1",
                "t": 1381171200,
                "device": "iPhone3,3",
                "alt": 45,
                "os": "6.1.3"
            }
        }

    ]
}

Mi folleto js es el siguiente:

// create a variable to load Stamen 'toner' tiles
var layer = new L.StamenTileLayer("toner");

// initialize and set map center and zoom
var map = L.map('map', {
    center: new L.LatLng(40.67, -73.94),
    zoom: 12
});

// create the map 
map.addLayer(layer);

// on each feature use feature data to create a pop-up
function onEachFeature(feature, layer) {

    if (feature.properties) {

        var popupContent;
        popupContent = feature.properties.t;

        console.log(popupContent);    
    }
    layer.bindPopup(popupContent);
}

// grab the processed GeoJSON through ajax call
var geojsonFeature = (function() {
        var json = null;
        $.ajax({
            'async': false,
            'global': false,
            'url': "/data/test_random.json",
            'dataType': "json",
            'success': function (data) {
                json = data;
            }
        });
        return json;
    })();

// create an object to store marker style properties
var geojsonMarkerOptions = {
    radius: 10,
    fillColor: "rgb(255,0,195)",
    color: "#000",
    weight: 0,
    opacity: 1,
    fillOpacity: 1
};

// load the geojson to the map with marker styling
L.geoJson(geojsonFeature, {

    style: function (feature) {
        return feature.properties && feature.properties.style;
    },

    onEachFeature: onEachFeature,

    pointToLayer: function (feature, latlng) {
        return L.circleMarker(latlng, geojsonMarkerOptions)
    }
}).addTo(map);

El console.log(popupContent); llamada dentro de la onEachFeature está devolviendo los datos, sin embargo, cuando hago clic en los puntos GeoJSON en el mapa obtengo el siguiente error: Uncaught NotFoundError: An attempt was made to reference a Node in a context where it does not exist.

He intentado investigar esto sin éxito hasta ahora.

9voto

Ricardo Reyes Puntos 3428

Aquí hay un ejemplo que tengo de cargar geojson desde un servicio WFS: http://maps.gcc.tas.gov.au/dogexerciseareas.html

Este es otro ejemplo de carga de topojson (similar, pero diferente): http://agl.pw/examples/NRM_Regions/map.html

Aquí hay un código simple que uso para cargar una capa:

var myLayer = L.geoJson().addTo(map);
$.getJSON("data/buildings.json", function(json) {
  myLayer.addData(json);
});

Entonces puedes hacer interactividad y estilo con algo como esto:

    success : function (response) {
        DogExerciseAreas = L.geoJson(response, {
            style: function (feature) {
                return {
                    stroke: false,
                    fillColor: 'FFFFFF',
                    fillOpacity: 0
                };
            },
            onEachFeature: function (feature, layer) {
                popupOptions = {maxWidth: 200};
                layer.bindPopup("<b>Site name:</b> " + feature.properties.sitename +
                    "<br><b>Dog Exercise: </b>" + feature.properties.dog_exercise +
                    "<br><br>Please ensure that tidy up after your dog. Dogs must be kept under effective control at all times."
                    ,popupOptions);
            }
        }).addTo(map);
    }

EDIT: un ejemplo del sitio web del folleto sobre los puntos de estilización (de aquí http://leafletjs.com/examples/geojson.html ):

var geojsonMarkerOptions = {
    radius: 8,
    fillColor: "#ff7800",
    color: "#000",
    weight: 1,
    opacity: 1,
    fillOpacity: 0.8
};

L.geoJson(someGeojsonFeature, {
    pointToLayer: function (feature, latlng) {
        return L.circleMarker(latlng, geojsonMarkerOptions);
    }
}).addTo(map);

EDIT2: Se ha añadido una solución a este problema. Ver aquí: https://gist.github.com/alexgleith/7112515

Todo lo que necesitas hacer ahora es editar la parte donde dice 'popupContent' para añadir tu parte y cambiar el código para cargar los datos del archivo.

0 votos

gracias alexgleith, esto parece funcionar y ver tus ejemplos también es útil. Aunque, ¿cómo podría añadir la función pointToLayer que muestra los datos de los puntos como marcadores de círculo?

0 votos

Buena pregunta, he añadido un poco al final de mi post. Creo que básicamente se puede hacer con un estilo para los puntos que se crean.

0 votos

para que pueda conseguir que los marcadores de estilo por defecto tengan ventanas emergentes que funcionen, pero no los marcadores de círculo. Por alguna razón cuando pongo estos juntos no parece funcionar: pastebin.com/T9E9XpQM Si se eliminan las líneas 68-70 las ventanas emergentes funcionan. Por ahora la función pointToLayer no cambia el estilo del punto. ¿Lo tengo en el lugar equivocado en mi código?

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