从图层集合中 search/retrieve 原始容器 Leaflet 图层的最佳方法
Best way to search/retrieve the original container Leaflet Layer from a Collection of Layer
这是一个愚蠢的问题,在我的 leaflet/javascript 项目中我有一百层,(我没有创建,但我必须处理它),分为 LayerGroup、FeatureGroup、MarkerCluster 和 GeoJSON,我需要创建一个包含所有信息的单层根目录以进行一些研究,然后一旦找到信息,我想检索包含信息的单层。因此,为了制作合并层,我执行以下代码:
//My 100 Layer....
var library = new L.MarkerClusterGroup(/*some layer options*/);
var restaurant = new L.FeatureGroup(/*some layer options*/);
var house = new L.LayerGroup(/*some layer options*/);
var notClassified = new L.geoJson(content,/*some layer options*/);
//......
所以现在我想将所有这些图层合并到一个独特的图层,L.geoJson 和 L.MarkerClusterGroup 扩展了 L.FeatureGroup,L.FeatureGroup 扩展了 L.LayerGroup , 所以根层必须是 L.LayerGroup 除非有人有更好的建议:
var worldLayer = new L.LayerGroup(/*some layer options*/);
for(var layer in listOfAllLayers){
worldlayer.addLayer(layer);
}
map.addLayer(worldLayer);
可选问题:这是最好的方法吗?
创建我的 worldLayer 后我做了一些研究,例如在世界层的 GeoJson 上跟踪分配给特定 L.Marker 或特定 Json 对象的 ID。所以我认为最好的方法是处理 WorldLayer 的 GeoJson 结果:
//Get json content from the worldlayer Layer
var json = worldLayer.toGeoJSON();
var key =...,
var value = ..-;
for(var i =0; i < json.features.length; i++){
var resulJson = searchJsonByKeyAndValue(json.features[i],key,value);
//now work with resultJson....
}
//key is the id and the value is what i looking for e.g. 456
function searchJsonByKeyAndValue(json,key,value){
for (var i = 0; i < json.length; i++) {
try {
if (json[i].hasOwnProperty(key)) {
if (json[i][key] == value) {
return json[i];
}
}
}catch(e){
alert(e.message);
}
}
return null;
}
可选问题 2:这是最好的方法吗?
我的问题:在其他信息中,有没有办法找到json对象信息的具体原始层?
例如 'worldLayer',我知道 'libraries' 中也存在特定信息,所以我想检索值 "libraries" 或对象层库。
现在我通过在特征 json 对象调用 "originLayers" 中向各个层的每个特征添加更多信息来解决问题,所以当我使用过程恢复 json 对象时我已经说明了,我什至恢复了想要的信息;但为此,我必须去分析所有层(不是很小)的 GeoJSON,并为每个单独的功能添加新信息。有其他方法可以改善一切吗?
提前感谢您的帮助。
我认为 the hasLayer method of layerGroup 是您需要的,而不是您的伪检索器函数来跟踪标记。
例如:
var map = map();
var a = layerGroup().addTo(map);
var b = featureGroup().addTo(a);
var c = featureGroup().addTo(a);
var marker = marker().addTo(b);
a.hasLayer(marker); // true
b.hasLayer(marker); // true
c.hasLayer(marker); // false
这是一个愚蠢的问题,在我的 leaflet/javascript 项目中我有一百层,(我没有创建,但我必须处理它),分为 LayerGroup、FeatureGroup、MarkerCluster 和 GeoJSON,我需要创建一个包含所有信息的单层根目录以进行一些研究,然后一旦找到信息,我想检索包含信息的单层。因此,为了制作合并层,我执行以下代码:
//My 100 Layer....
var library = new L.MarkerClusterGroup(/*some layer options*/);
var restaurant = new L.FeatureGroup(/*some layer options*/);
var house = new L.LayerGroup(/*some layer options*/);
var notClassified = new L.geoJson(content,/*some layer options*/);
//......
所以现在我想将所有这些图层合并到一个独特的图层,L.geoJson 和 L.MarkerClusterGroup 扩展了 L.FeatureGroup,L.FeatureGroup 扩展了 L.LayerGroup , 所以根层必须是 L.LayerGroup 除非有人有更好的建议:
var worldLayer = new L.LayerGroup(/*some layer options*/);
for(var layer in listOfAllLayers){
worldlayer.addLayer(layer);
}
map.addLayer(worldLayer);
可选问题:这是最好的方法吗?
创建我的 worldLayer 后我做了一些研究,例如在世界层的 GeoJson 上跟踪分配给特定 L.Marker 或特定 Json 对象的 ID。所以我认为最好的方法是处理 WorldLayer 的 GeoJson 结果:
//Get json content from the worldlayer Layer
var json = worldLayer.toGeoJSON();
var key =...,
var value = ..-;
for(var i =0; i < json.features.length; i++){
var resulJson = searchJsonByKeyAndValue(json.features[i],key,value);
//now work with resultJson....
}
//key is the id and the value is what i looking for e.g. 456
function searchJsonByKeyAndValue(json,key,value){
for (var i = 0; i < json.length; i++) {
try {
if (json[i].hasOwnProperty(key)) {
if (json[i][key] == value) {
return json[i];
}
}
}catch(e){
alert(e.message);
}
}
return null;
}
可选问题 2:这是最好的方法吗?
我的问题:在其他信息中,有没有办法找到json对象信息的具体原始层?
例如 'worldLayer',我知道 'libraries' 中也存在特定信息,所以我想检索值 "libraries" 或对象层库。
现在我通过在特征 json 对象调用 "originLayers" 中向各个层的每个特征添加更多信息来解决问题,所以当我使用过程恢复 json 对象时我已经说明了,我什至恢复了想要的信息;但为此,我必须去分析所有层(不是很小)的 GeoJSON,并为每个单独的功能添加新信息。有其他方法可以改善一切吗?
提前感谢您的帮助。
我认为 the hasLayer method of layerGroup 是您需要的,而不是您的伪检索器函数来跟踪标记。
例如:
var map = map();
var a = layerGroup().addTo(map);
var b = featureGroup().addTo(a);
var c = featureGroup().addTo(a);
var marker = marker().addTo(b);
a.hasLayer(marker); // true
b.hasLayer(marker); // true
c.hasLayer(marker); // false