在 Leaflet 中更改图层的 z 顺序
Changing z-order of layer in Leaflet
我使用以下代码作为基础创建了一个图层示例:
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);
});
这是我代码的最后一部分,但它显示在另一层后面(这种行为会随着页面的一些刷新而改变):
我想知道如何控制它。
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)。然后您可以在任何所需的窗格中插入图层(包括矢量)。
我使用以下代码作为基础创建了一个图层示例:
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);
});
这是我代码的最后一部分,但它显示在另一层后面(这种行为会随着页面的一些刷新而改变):
我想知道如何控制它。
Leaflet 0.x 中的所有向量(我猜你使用的是上一个问题中的 Leaflet v0.7.7)都被添加到 overlayPane
.
这包括您的第一个区域(我认为您没有在当前问题中包含该代码?)以及您的圆圈标记。
它们的堆叠顺序取决于它们的插入顺序。因此,由于您异步加载它们,根据服务器发送数据所花费的时间,您的圆形标记可能低于或高于您的区域。
您可以链接 2 个异步请求以预定义它们的执行顺序。一旦第一个查询完成,您只需开始下一个查询。但是你会延迟数据显示。
或者您可以使用 bringToFront
/ bringToBack
methods 强制将一些矢量置于顶部/底部。您必须遍历功能组并将其应用于每个单独的图层,例如:
all_layers.eachLayer(function (layer) {
layer.bringToFront();
});
Leaflet 1.0 中的情况有所不同,您可以在其中创建自己的窗格并指定它们的 z-index(可能通过 CSS)。然后您可以在任何所需的窗格中插入图层(包括矢量)。