如何在传单中添加多个图层并动态更新它们

时间:2017-04-26 07:54:42

标签: javascript leaflet geocoding mapbox

我正在使用leaflet绘制图层并在地图中显示Line String数据。但由于我有很多LineString(40000)数据,因此需要花费大量时间才能在一个图层中渲染。所以我决定拆分将数据分成多个层,然后逐个更新图层,这样每个图层的数据量就会减少。

      var map = L.map('map').setView([36.447488,102.463303], 12);

            L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=token', {
                maxZoom: 18,
                attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
                    '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
                    'Imagery © <a href="http://mapbox.com">Mapbox</a>',
                id: 'mapbox.streets'
            }).addTo(map);
    var options = {
                position: 'topleft',
                title: 'Search',
                placeholder: 'enter  id ',
                maxResultLength: 15,
                threshold: 0.5,
                showInvisibleFeatures: true,
                showResultFct: function(feature,container) {
                    props = feature.properties;
                    var name = L.DomUtil.create('b', null, container);
                    name.innerHTML = props.id;

                    container.appendChild(L.DomUtil.create('br', null, container));

                    var cat = props.id
                        info = '' + cat + ', ' + 'th id';
                    container.appendChild(document.createTextNode(info));
                }
            };

        var searchCtrl = L.control.fuseSearch(options);

        searchCtrl.addTo(map);


        var geojson;

        function getColor(d) {


               if(d==10 || d==9 || d==8){
                   return '#ff0000';
               }

               else {

                   return '#00ff65';

               }

        } 


        function style(feature) {

            return {
                weight: 2,
                opacity: 1,

                color: getColor(feature.properties.points),

                fillOpacity: 0.7,

            };
        }


        function highlightFeature(e) {
        var layer = e.target;

        layer.setStyle({
            weight: 2,
            color:'#007d80',
            dashArray: '',
            fillOpacity: 0.7
        });


        if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) {
            layer.bringToFront();
        }

        info.update(layer.feature.properties);

        }
    function resetHighlight(e) {
        geojson.resetStyle(e.target);
        info.update();
    }
    function zoomToFeature(e) {
        map.fitBounds(e.target.getBounds());
        map.doubleClickZoom.disable();
    }
    var info = L.control();


    info.update = function (props) {
        this._div.innerHTML = '<h4><b>Link: <b></h4>' +  (props ?
            '<b>LineString ' + props.id + '</b><br />'  
            : 'Hover over a LineSting');


    };


    function onEachFeature(feature, layer) {
         feature.layer = layer;

        layer.on({
            mouseover: highlightFeature,
            mouseout: resetHighlight,


        });
        var popupContent = 
          '<b>Link ' + feature.properties.id + '</b>';

        layer.bindPopup(popupContent);          
        feature.layer = layer;

    }




    function mapupdatecolor(){




              $.ajax({
                type: "GET",
                async : false,
                url: 'http:dataurl', 
                success: function(data) {

                    console.log("sucess"); 

                    for (i = 0; i<40000; i++) { 



                              links['features'][i]['properties']['points']=data[i].points;





                    }


                    if (geojson) {

                        geojson.remove(); 
                        console.log("removed");

                    }




                    function picnicFilter(feature) {
                          if (feature.properties.points >= 9) return true
                        }




                    geojson = L.geoJson(lines, {
                        filter: picnicFilter,
                        style: style,
                        onEachFeature: onEachFeature

                         }).addTo(map);



                    console.log("update done");

                },
                error: function (xhr, ajaxOptions, thrownError) {

                    alert(thrownError);
                  },
                complete: function() {

                 setTimeout(mapupdatecolor, 5000);
                }
              });


            // schedule the first invocation:








    }

    geojson = L.geoJson(lines, {
        style: style,
        onEachFeature: onEachFeature
    }).addTo(map);


    info.onAdd = function (map) {
        this._div = L.DomUtil.create('div', 'info'); // create a div with a class "info"
        this.update();
        return this._div;
    };




    searchCtrl.indexFeatures(links.features, ['id']);
    info.addTo(map);

    setTimeout( mapupdatecolor, 5000);


So the above code is to render all the LineString initially and then after the update of the points just display the LineStrings which have points >=9.But now I would like to draw multiple layers(say 10) and then draw the whole LineStrings(40000) in those 10 layers.(400 LineStrings per layer). Will increase the speed of rendering the map?

更新

所以我尝试使用Leaflet.VectorGrid并且它正在快速绘制地图,但是当我放大所有线条时都会看不见。

var map = L.map('map');

        var canvasRenderer = L.canvas();

        var cartodbAttribution = '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, &copy; <a href="http://cartodb.com/attributions">CartoDB</a>';

        var positron =L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=token', {
            maxZoom: 18,
            attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
                '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
                'Imagery © <a href="http://mapbox.com">Mapbox</a>',
            id: 'mapbox.streets'
        }).addTo(map);

        function getColor(d) {


               if(d==10 || d==9 || d==8){
                   return '#ff0000';
               }

               else {

                   return '#00ff65';

               }

        } 

        var highlight;
        var clearHighlight = function() {
            if (highlight) {
                vectorGrid.resetFeatureStyle(highlight);
            }
            highlight = null;
        };
        var vectorGrid = L.vectorGrid.slicer(lines, {
            rendererFactory: L.svg.tile,
            vectorTileLayerStyles: {
                sliced: function(properties, zoom) {

                    return {

                        weight: 2,
                        opacity: 1,

                        color: getColor(properties.points),


                        fillOpacity: 0.7
                    }
                }
            },
            interactive: true,
            getFeatureId: function(f) {
                return f.properties.id;
            }
        })
        .on('mouseover', function(e) {
            var properties = e.layer.properties;
            L.popup()
                .setContent(properties.id)
                .setLatLng(e.latlng)
                .openOn(map);

            clearHighlight();
            highlight = properties.id;

            var p = properties.points;
            var style = {
                fillColor: p === 0 ? '#800026' :
                        p === 1 ? '#E31A1C' :
                        p === 2 ? '#FEB24C' :
                        p === 3 ? '#B2FE4C' : '#FFEDA0',
                fillOpacity: 0.5,
                fillOpacity: 1,
                stroke: true,
                fill: true,
                color: 'red',
                opacity: 1,
                weight: 2,
            };

            vectorGrid.setFeatureStyle(properties.points, style);
        })
        .addTo(map);

        map.on('click', clearHighlight);

        map.setView({ lat: 36.447488, lng: 102.463303}, 12);

感谢任何帮助

0 个答案:

没有答案