Leaflet 获取传单中单击的所有图层的所有功能

Leaflet 获取传单中单击的所有图层的所有功能,leaflet,Leaflet,我在用传单。有没有人建议使用一个函数来返回用户单击的所有层的所有特性 例如,我有一个点图层和一个多边形图层。当用户单击某个点时,我希望显示该点的属性以及该点下方的多边形。如果用户仅单击多边形,则应仅显示多边形的属性 提前感谢您提供的任何帮助 从传递到click处理程序的事件中单击的捕获点 创建点的边界框(L.latLngBounds) 在地图中的每个可见层中循环。\u层 查找要素图层:如果图层是要素图层,则它具有\u layers属性;每个要素一个图层 循环遍历每个要素图层中的每个要素,并获取或

我在用传单。有没有人建议使用一个函数来返回用户单击的所有层的所有特性

例如,我有一个点图层和一个多边形图层。当用户单击某个点时,我希望显示该点的属性以及该点下方的多边形。如果用户仅单击多边形,则应仅显示多边形的属性

提前感谢您提供的任何帮助

  • 从传递到
    click
    处理程序的事件中单击的捕获点
  • 创建点的边界框(
    L.latLngBounds
  • 地图中的每个可见层中循环。\u层
  • 查找要素图层:如果图层是要素图层,则它具有
    \u layers
    属性;每个要素一个图层
  • 循环遍历每个要素图层中的每个要素,并获取或创建每个要素的边界框
  • 测试特征边界框与在步骤1中创建的单击边界框的交点,并将其添加到阵列中
  • 向用户显示阵列内容,以显示单击点后的所有功能
  • (注意:如果您在一个单独的阵列中跟踪自己的功能,则更容易、更可靠。如果您这样做,您可以跳过步骤3和4。)

    //创建映射
    var map=L.map('map').setView([39.5,-0.5],5);
    //设置OSM层
    var baseLayer1=L.tileLayer(
    'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'{
    maxZoom:18,
    名称:“基层1”
    }).addTo(地图);
    函数clickHandler(e){
    var clickBounds=L.latLngBounds(e.latlng,e.latlng);
    var intersectingFeatures=[];
    用于(地图中的变量l.\u图层){
    var overlay=地图。_层[l];
    如果(覆盖层){
    用于(覆盖层中的变量f.\u层){
    var feature=叠加层[f];
    var界;
    if(feature.getBounds)bounds=feature.getBounds();
    否则,如果(特征){
    边界=L.latLngBounds(特征。_latlng,特征。_latlng);
    }
    如果(边界&&单击边界。相交(边界)){
    相交特征。推(特征);
    }
    }
    }
    }
    //如果至少找到一个功能,请显示它
    if(相交特征.长度){
    var html=“Found features:“+intersectingFeatures.length+”
    “+intersectingFeatures.map(函数(o)){ 返回o.properties.type }).join(“
    ”); map.openPopup(html,e.latlng{ 偏移量:L点(0,-24) }); } } map.on(“单击”,clickHandler); //添加一些标记 功能createMarker(纬度、液化天然气){ var标记=L.标记([lat,lng]); marker.on(“单击”,clickHandler); marker.properties={ 类型:“点” };//添加一些伪属性;通常是geojson 返回标记; } var markers=[createMarker(36.9,-2.45),createMarker(36.9,-2.659),createMarker(36.83711,-2.464459)]; //创建组以保留标记,它将作为覆盖添加 var overlay=L.featureGroup(标记).addTo(地图); //显示特征 map.fitBounds(overlay.getBounds(){ 最大缩放:11 }); //为形状或任何东西创建另一层 var circle=L.circle([36.9,-2.45],2250{ 颜色:“红色”, 填充颜色:“#f03”, 填充不透明度:0.5 }); 在('click',clickHandler'上画圆圈); circle.properties={ 类型:“圆” }; var overlay2=L.featureGroup([圆圈]).addTo(地图)
    #地图{
    高度:400px;
    }
    
    
    除了@nothing是必要的响应外,请参阅(多边形中的点)了解传单

    顺便说一句,这也是一个非常有用的技巧,用于在不使用标记群集插件时解决功能之间的歧义(如果多个匹配项而不是一个匹配项)。好的,因此解决方案并不完美。虽然JSFIDLE场景可行,但多边形(cirlce)非常小。此过程不测量“在多边形中单击”,而是测量“在多边形的方形边界框中单击”。它可能适用于多边形中的点函数。是的,你是对的,这可能不像非正方形几何体那样理想。我使用这种技术进行自己的自定义搜索(在搜索栏中键入一些数据,然后在可见层中搜索属性与搜索匹配的记录,然后显示“功能结果”列表)。但是,如果您使用Toni BCN发布的内容(多边形中的点插件)来扩充我的解决方案,您可以验证该点是否位于与边界框相交的多边形之一中-这仍然可以减少问题空间(需要测试的多边形更少)。在第6步之后,测试多边形中的点(或任何形状)。您是否有机会尝试在要素层中循环的技巧?