função setStyle () para recursos do GeoJSON - Folheto


23

Ok, já que eu já fiz uma pergunta muito longa sobre isso, mas como ela não recebeu novas respostas por um tempo e não ficou confusa em detalhes, vou manter essa simples da melhor maneira possível.

Se não me engano, uma setStylefunção para um recurso específico nomeado seria a seguinte:

var bounds = [[54.559322, -5.767822], [56.1210604, -3.021240]];
var rect = L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);

rect.setStyle({color: "#4B1BDE"});

... que mudaria a cor de laranja para azul. Também estou ciente da resetStyle()função que reverterá o estilo para o original.

É assim que eu denomino meu GeoJSON:

var everything = L.geoJson(myfile, {
    onEachFeature: function(feature){
        array_of_layers.addLayer(feature);
    },
    style: function(feature){
            switch(feature.properties.name){
            case "belgium": return belgium_style; break;
            case "bosnia": return bosnia_style; break;
            case "denmark": return denmark_style; break;
            case "great_britain": return britain_style; break;
            case "greece": return greece_style; break;
            case "italy": return italy_style; break;
            case "serbia": return serbia_style; break;
            case "spain": return spain_style; break;
            }
    }

});

O que eu quero fazer é tornar apenas um país azul e os outros cinza, posteriormente no código. É uma coisa de duas etapas, pintar todos os países em cinza e depois fazer um azul.

A primeira coisa é que preciso de um loop que itere sobre cada recurso e setStyle()que todos os países fiquem cinzentos. Funciona se eu apenas everything.setStyle({color: "#4B1BDE"})ou algo assim?

A segunda coisa é (que está me dando noites sem dormir) como seleciono apenas um recurso de um grupo de polígonos GeoJSON para trabalhar? Apenas o país que eu preciso pintar de azul.

Se fosse uma questão de passar o mouse, eu poderia colocar um ouvinte de evento, como é feito nos tutoriais do Leaflet. Mas, independentemente da interação do usuário, desejo definir e redefinir o estilo chamando-o com seu nome, como fiz no retângulo acima.


1
Obrigado por apontar a setStyle()função do folheto .
berto

Respostas:


27

Isso funciona sem a necessidade de remover a camada e recriar uma nova, conforme descrito acima:

geojson_layer.eachLayer(function (layer) {  
  if(layer.feature.properties.NAME == 'feature 1') {    
    layer.setStyle({fillColor :'blue'}) 
  }
});

Parece ser um pouco mais eficiente do que remover e recriar a camada geoJson. A partir dos documentos, uma GeoJSONcamada se estendeFeatureGroup e, por sua vez, se estende LayerGroup.
Além disso, parece que cada recurso geoJson possui sua própria camada no FeatureGroup!


Como aciono esse método quando quero alterar o estilo dinamicamente?
quer

3
Eu acho que é equivalente a geojson_layer.setStyle (função ...)
PeterVermont

um problema aqui se você mudar as camadas ou seja, camadas Child Adicionar, eles vão ser criados a partir do estilo original nas opções, não o que você configurá-lo para
miket

19

Eu escrevi um código pequeno para estilizar o recurso geojson específico usando o folheto. você pode experimentá-lo no JSFiddle (Original, não funcional) , JSFiddle funcional 2018-02-17 , ou usar o seguinte teste de código localmente.

Neste exemplo, estou usando arquivos us-states.json, mas pode ser usado para qualquer arquivo geojson.

Eu espero que isso ajude.

Aqui está o código:

<!DOCTYPE html>
<html>
<head>
<title>Leaflet Coloring Geojson Features</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="http://leafletjs.com/dist/leaflet.css" />
<!--[if lte IE 8]><link rel="stylesheet" href="../dist/leaflet.ie.css" /><![endif]-->
<style>
#map {
    width: 800px;
    height: 500px;
}
.info {
    padding: 6px 8px;
    font: 14px/16px Arial, Helvetica, sans-serif;
    background: white;
    background: rgba(255, 255, 255, 0.8);
    box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);
    border-radius: 5px;
}
.info h4 {
    margin: 0 0 5px;
    color: #777;
}
.legend {
    text-align: left;
    line-height: 18px;
    color: #555;
}
.legend i {
    width: 18px;
    height: 18px;
    float: left;
    margin-right: 8px;
    opacity: 0.7;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> 
<script src="http://leafletjs.com/dist/leaflet.js"></script> 
<script type="text/javascript" src="http://leafletjs.com/examples/us-states.js"></script> 
<script type="text/javascript">
    $(document).ready(function () {
        init_map();
        init_geojson();
        $("#btn").on('click', function () {
            var stateName = $('#statename').val();
            console.log(stateName);
            init_geojson(stateName);
        });
    });
    var map, geojson, sn;

    function init_map() {
        map = L.map('map').setView([37.8, -96], 4);
        L.tileLayer('http://{s}.tile.cloudmade.com/{key}/22677/256/{z}/{x}/{y}.png', {
            attribution: 'Map data &copy; 2011 OpenStreetMap contributors, Imagery &copy; 2012 CloudMade',
            key: 'BC9A493B41014CAABB98F0471D759707'
        }).addTo(map);
        geojson = L.geoJson(statesData, {
            style: style
            //onEachFeature: onEachFeature,
        }).addTo(map);
    }

    function init_geojson(n) {
        console.log(geojson.options);
        map.removeLayer(geojson);
        if (n != "") {
            sn = n;
            console.log(sn);
            geojson = L.geoJson(statesData, {
                style: style
            }).addTo(map);
        }
    }

    function style(feature) {
        console.log(sn);
        if (sn == feature.properties.name) {
            return {
                weight: 2,
                opacity: 1,
                color: 'white',
                dashArray: '3',
                fillOpacity: 0.3,
                fillColor: '#ff0000'
            };
        } else {
            return {
                weight: 2,
                opacity: 1,
                color: 'white',
                dashArray: '3',
                fillOpacity: 0.3,
                fillColor: '#666666'
            };
        }
    }
</script>
<input type="text" id="statename" value="Alaska">
<input type="button" id="btn" value="Set Color"/>
</body>
</html>

3
Portanto, tratava-se de fazer uma style(feature)função verificando o feature.properties.namevalor. Obrigado!
Doruk Karınca

@ DorukKarınca Yes :)
Farhat Abbas

Impressionante! Era exatamente isso que eu estava procurando!
Joosthoek #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.