Leaflet 使用传单从Mapbox中的featureGroup编辑/删除GeoJSON图层

Leaflet 使用传单从Mapbox中的featureGroup编辑/删除GeoJSON图层,leaflet,mapbox,geojson,Leaflet,Mapbox,Geojson,我正在使用Mapbox和传单来绘制、编辑和删除多边形等。每次我创建一个新多边形时,我都会将它们转换为GeoJSON层,然后将其添加到我创建的featureGroup中,因为我想将每个层与一个ID属性相关联,以便以后使用。这就是我所拥有的: var featureGroup = L.featureGroup().addTo(map); var drawControl = new L.Control.Draw({ edit: { featureGroup: featureG

我正在使用Mapbox和传单来绘制、编辑和删除多边形等。每次我创建一个新多边形时,我都会将它们转换为GeoJSON层,然后将其添加到我创建的featureGroup中,因为我想将每个层与一个ID属性相关联,以便以后使用。这就是我所拥有的:

var featureGroup = L.featureGroup().addTo(map);

var drawControl = new L.Control.Draw({
    edit: {
        featureGroup: featureGroup
    },
    draw: {
        polygon: {
            allowIntersection: false
        },
        polyline: false,
        rectangle: false,
        circle: false,
        marker: false
    }
}).addTo(map);

map.on('draw:created', addPolygon);
map.on('draw:edited', editPolygon);
map.on('draw:deleted', deletePolygon);

function deletePolygon(e) {
    featureGroup.removeLayer(e.layer);
}

function editPolygon(e) {
    featureGroup.eachLayer(function (layer) {
        layer.eachLayer(function (layer) {
            addPolygon({ layer: layer });
        });
    });
}

function addPolygon(e) {
    var geojsonstring = e.layer.toGeoJSON();
    var geojson = L.geoJson(geojsonstring);
    featureGroup.addLayer(geojson);
}
当我这样做时,创建多边形不是问题。但是当我试图编辑或删除多边形时,它不能正常工作

当我试图编辑多边形时,它告诉我“TypeError:I.编辑未定义”。它也不允许我取消编辑

当我尝试删除多边形时,它不再显示在地图中,但仍不会从featureGroup中删除

我做错了什么

编辑:我目前的做法与ghybs建议的做法相同。但问题是,一旦完成所有编辑,多边形将保存到数据库中(我将其转换为WKT字符串以保存在SQLServer中)。下次加载页面时,将从数据库中加载多边形,用户可以编辑或删除它们并将其保存回数据库

现在,当用户进行编辑并再次保存它们时,它只会创建重复的多边形。我不知道有什么方法可以将编辑的多边形连接到数据库中的多边形

所以我想,如果我可以将它们转换为GeoJSON,并为每个层分配一个ID属性(如果是新层,则ID=0,如果是从数据库加载的,则为数据库中相应的polygonID)。因此,当它们再次保存时,我可以检查此ID,并基于此,我可以更新可用多边形,或在数据库中创建新多边形


有更好的方法吗

不清楚为什么在
addPolygon
中要遍历一个GeoJSON对象,然后通过
L.GeoJSON
将其转换回传单图层组

您可以直接添加创建的图层,如中所示:

函数addPolygon(e){
var层=e层;
var feature=layer.feature=layer.feature | |{};//初始化layer.feature
//使用feature.id:http://geojson.org/geojson-spec.html#feature-物体
feature.id=0;//一旦创建了数据库id,就可以使用它进行更改。
featureGroup.addLayer(图层);
//记录到数据库中,假设它返回承诺/延迟。
recordToDb(layer.toGeoJSON()).done(函数(结果){
feature.id=result.id;//更新图层id。
});
}
至于您出错的原因,这是因为您向
featureGroup
添加了一个(GeoJSON)图层组,而flipal.draw插件不知道如何处理该图层组。只能添加“非编组”图层


另请参见:

感谢您的回复。我编辑了我的问题,以澄清为什么我要在将图层添加到featureGroup之前将其转换为GeoJSON。这太棒了!这对我来说应该很合适。谢谢!!我刚刚遇到另一个可能的问题。删除图层时是否可以获取ID?我试过这样的方法:
map.on('draw:deleted',deletePolygon);函数deletePolygon(e){var layer=e.layer;var feature=layer.feature | |{};var deletedid=feature.polygonid;featureGroup.removeLayer(layer);}
但这只给了我一个错误,即层未定义。请参阅传单API.draw事件:它提供
(复数)所有删除功能的列表。啊!这就是我错过的。非常感谢你!