2016-08-11 19 views
1

我使用Mapbox与单张绘图,编辑和删除多边形等。每次我创建一个新的多边形Mapbox一个featureGroup删除GeoJSON的图层,我将其转换为以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); 
} 

当我做到这一点,创建多边形是没有问题的。但是,当我尝试编辑或删除多边形时,它无法正常工作。

当我尝试编辑多边形,它告诉我:“类型错误:i.Editing是不确定的”。它也不允许我取消编辑。

当我尝试删除多边形,它在地图上不显示了,但它仍然没有从featureGroup删除。

我在这里做错了什么?

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

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

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

有没有更好的方法来做到这一点?

回答

1

不确定为什么在addPolygon中您经历了一个GeoJSON对象,您可以通过L.geoJson转换回Leaflet图层组?

你本来可以直接加入已创建的层,如Leaflet.draw "draw:created" example

function addPolygon(e) { 
    var layer = e.layer; 
    var feature = layer.feature = layer.feature || {}; // Initialize layer.feature 
    // use the feature.id: http://geojson.org/geojson-spec.html#feature-objects 
    feature.id = 0; // you can change it with your DB id once created. 
    featureGroup.addLayer(layer); 

    // record into DB, assuming it returns a Promise/Deferred. 
    recordToDb(layer.toGeoJSON()).done(function (result) { 
    feature.id = result.id; // Update the layer id. 
    }); 
} 

至于你错误的原因,这是由于您添加(以GeoJSON)图层组到您的featureGroup事实,Leaflet.draw插件不知道如何处理。您必须只添加“非组”图层。

另请参阅:https://gis.stackexchange.com/questions/203540/how-to-edit-an-existing-layer-using-leaflet

+0

谢谢您的回应。我编辑了我的问题,以澄清为什么我想在将图层添加到featureGroup之前将图层转换为GeoJSON。 – Raj

+0

添加了一些处理ID的代码。 – ghybs

+0

太棒了!这应该完全适合我。非常感谢!! – Raj