在Leaflet中更改层的z顺序

时间:2015-11-25 20:38:24

标签: javascript leaflet layer z-order

我使用此代码作为基础创建了一个图层示例:

http://bl.ocks.org/ragnarheidar/a711faa1a94be4dae48f

负责创建图层的代码如下:

function getColor(d) 
{
    return marker_colors[d];
}   

function marker_style(i) 
{
    return {
        fillColor: getColor(i),
        radius: 5,
        weight: 1,
        opacity: 1,
        color: 'white',
        dashArray: '3',
        fillOpacity: 0.7
    };
}

//data URL variables
var start_date = '2013-08-01'; //YYYY-MM-DD
var end_date = '2013-08-08';   //YYYY-MM-DD
var c_type = 'Noise';          // Complaint Type

// Build the data URL
var URL = "http://data.cityofnewyork.us/resource/erm2-nwe9.json"; 
URL += "?";                                                   
URL += "$where=";                                             
URL += "(latitude IS NOT NULL)";                              
URL += " AND ";
URL += "(complaint_type='" + c_type + "')";                    
URL += " AND ";
URL += "(created_date>='" + start_date + "') AND (created_date<='" + end_date + "')"; 
URL += "&$group=complaint_type,descriptor,latitude,longitude";                        
URL += "&$select=descriptor,latitude,longitude,complaint_type";                       
URL = encodeURI(URL);                                                                 
console.log(URL);                                                                       

var noise_description = ["Air Condition/Ventilation Equipment", 
                        "Alarms",
                        "Banging/Pounding", 
                        "Barking Dog", 
                        "Car/Truck Horn", 
                        "Car/Truck Music", 
                        "Construction Equipment", 
                        "Construction Before/After Hours", 
                        "Engine Idling", 
                        "Ice Cream Truck", 
                        "Jack Hammering", 
                        "Lawn Care Equipment",
                        "Loud Music/Party",
                        "Loud Talking",
                        "Loud Television",
                        "Manufacturing Noise",
                        "Private Carting Noise",
                        "Others"];

var marker_colors = ['#7f3b08',
                    '#a50026',
                    '#d73027',
                    '#f46d43',
                    '#fdae61',
                    '#fee090',
                    '#ffffbf',
                    '#ffffff',
                    '#e0f3f8',
                    '#abd9e9',
                    '#74add1',
                    '#4575b4',
                    '#313695',
                    '#d8daeb',
                    '#b2abd2',
                    '#8073ac',
                    '#542788',
                    '#2d004b'];

//  Load GeoJSON from an external file
$.getJSON(URL, function(data)
{
        var markers = []
        var layers = []
        for (var i = 0; i < noise_description.length; i++) 
        {
            markers[i] = [];
        }

        var all_markers = [];

        $.each(data, function(index, rec)
        {
            var marker;
            for (var i = 0; i < noise_description.length; i++) 
            {
                if (rec.descriptor.indexOf(noise_description[i]) > -1) 
                {
                    marker = L.circleMarker([rec.latitude, rec.longitude], marker_style(i));
                    markers[i].push(marker); 
                    all_markers.push(marker); 
                    break;
                }
            }

        });

        // Create layer of all markers but do not add to map
        var all_layers = L.featureGroup(all_markers);       
        // Create specific layers of markers and add to map
        for (var i = 0; i < markers.length; i++) 
        {
            layers[i] = L.featureGroup(markers[i]).addTo(map);;
        }
        map.fitBounds(all_layers.getBounds());

        // Create object containing all marker layers 
        var overlays = {}; 
        for (var i = 0; i < noise_description.length; i++) 
        {
            overlays[noise_description[i]] = layers[i];
        }

        //add layer control using above object
        L.control.layers(null,overlays).addTo(map);
    });

这是我的代码的最后一部分,但它显示在另一个图层后面(此行为随着页面的一些更新而改变):

enter image description here

我想知道如何控制它。

1 个答案:

答案 0 :(得分:0)

Leaflet 0.x中的所有向量(我猜您使用的是上一个问题中的Leaflet v0.7.7)被添加到overlayPane中的单个SVG容器中。

这包括您的第一个区域(我认为您在当前问题中没有包含该代码?)以及您的圈子标记。

他们的堆叠顺序取决于他们的插入顺序。因此,因为您异步加载它们,具体取决于服务器发送数据所需的时间,您的圆形标记可能低于或高于您的区域。

您可以将2个异步请求链接到预定义它们执行的顺序。第一个查询完成后,您只需启动下一个查询。但是你会延迟数据显示。

或者您可以使用bringToFront / bringToBack methods强制将某些向量置于顶部/底部。您必须遍历您的要素组并将其应用于每个单独的图层,例如:

all_layers.eachLayer(function (layer) {
    layer.bringToFront();
});

Leaflet 1.0中的情况不同,您可以在其中创建自己的窗格并指定其z-index(可能通过CSS)。然后,您可以在任何所需的窗格中插入图层(包括矢量)。