如何在我的代码中使用事件内部生成的变量(Leflet 层数组)later.on

How to use a variable (array of Leflet Layers) generated inside of a Event in my code later.on

我有一个事件,在地图上绘制一个多边形后生成一个 Leaflet 图层数组,其中包含位于多边形上的兴趣点。此事件运行正常。

关键是我想将这个层数组保存在变量中的某个位置,以便稍后在我的代码中使用它。我认为这是一个简单的问题,但我是 Javascript 和 Leaflet 的新手,无法找到解决方案。这是我的代码:

mymap.on('pm:create',function(e){
                    var jsn = e.layer.toGeoJSON().geometry;
                    $.ajax({
                            url:'load_data_testing_osm.php',
                            data: {id:'geojsonpol', geojsonpol:JSON.stringify(jsn)},
                            type:'POST',
                            success: function(response){
                                if (response.substring(0,5)=="ERROR"){
                                    alert(response);
                                } else {
                                    alert(response);
                                    jsnPoi = JSON.parse(response);
                                    var fromProjection = '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs';
                                    var toProjection = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ";
                                    var lyrPoi = L.geoJSON(jsnPoi,{coordsToLatLng:reproject, pointToLayer:returnPoiMarkerOsm});
                                }
                            },  
                            error:function(xhr, status, error){
                                $('#divProjectAffected').html("ERROR: "+error);
                            }
                });
            });

我想稍后在我的代码中使用 var lyrPoi

您可以轻松创建一个全局变量:

var allPOIs = [];
mymap.on('pm:create',function(e){
                    var jsn = e.layer.toGeoJSON().geometry;
                    $.ajax({
                            url:'load_data_testing_osm.php',
                            data: {id:'geojsonpol', geojsonpol:JSON.stringify(jsn)},
                            type:'POST',
                            success: function(response){
                                if (response.substring(0,5)=="ERROR"){
                                    alert(response);
                                } else {
                                    alert(response);
                                    jsnPoi = JSON.parse(response);
                                    var fromProjection = '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs';
                                    var toProjection = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ";
                                    var lyrPoi = L.geoJSON(jsnPoi,{coordsToLatLng:reproject, pointToLayer:returnPoiMarkerOsm});
                                    lyrPoi.getLayers().forEach((layer)=>{
                                        allPOIs.push(layer)
                                    });
                                }
                            },  
                            error:function(xhr, status, error){
                                $('#divProjectAffected').html("ERROR: "+error);
                            }
                });
            });

在 ajax 调用之后,您有一个包含所有层的填充 allPOIs 数组。

编辑

  1. 在地图上直接显示图层:
var lyrPoi = L.geoJSON(jsnPoi,{coordsToLatLng:reproject, pointToLayer:returnPoiMarkerOsm}).addTo(map);
  1. 遍历数组并将其添加到地图中:
allPOIs.forEach((layer)=>{
     layer.addTo(map);
});

图层加两次没问题