Leaflet-Geoman编辑多边形后pm:edit事件如何获取经纬度坐标(TypeScript)
解决方案
pm:edit 事件的回调参数中自带编辑后的图层实例,你只需要对图层做正确的TypeScript类型收窄,调用Leaflet公开的坐标获取方法即可,不需要访问私有属性 _latlngs。
方法1:确定要素为面时直接类型断言
你当前加载的是Polygon面要素,直接将图层断言为 L.Polygon 类型,调用 getLatLngs() 方法即可拿到坐标,也可以直接调用 toGeoJSON() 方法导出标准GeoJSON格式:
L.geoJSON(featureCollection, { onEachFeature: (feature: any, layer: L.Layer) => { layer.on('pm:edit', (e) => { // 类型断言为Polygon,调用公开API获取坐标 const editedPolygon = e.layer as L.Polygon; // 拿到LatLng格式的坐标数组 const latLngs = editedPolygon.getLatLngs(); console.log('编辑后的坐标:', latLngs); // 直接导出为GeoJSON格式的坐标 const editedGeoJson = editedPolygon.toGeoJSON(); console.log('编辑后的GeoJSON:', editedGeoJson); }); layer.on('pm:rotateend', (e) => { console.log('loaded geojson - pm:rotateend', e.originLatLngs, e.newLatLngs); }); map.addLayer(layer); }, });
方法2:兼容多类型要素的类型判断
如果加载的GeoJSON包含点、线、面多种类型要素,可以先判断图层类型再做对应处理,避免类型报错:
layer.on('pm:edit', (e) => { const targetLayer = e.layer; if (targetLayer instanceof L.Marker) { // 点要素获取坐标 console.log('点坐标:', targetLayer.getLatLng()); } else if (targetLayer instanceof L.Polyline) { // 线/面要素获取坐标(Polygon是Polyline的子类) console.log('线/面坐标:', targetLayer.getLatLngs()); } })
原因说明
之前TypeScript报错是因为你将图层声明为了通用基类 L.Layer,该类本身没有 getLatLngs 这类仅子类才有的方法,只要做正确的类型断言/判断即可正常调用公开API,私有属性 _latlngs 是Leaflet内部存储用的,不建议直接访问。
内容的提问来源于stack exchange,提问作者Huy
相关产品推荐
相关产品推荐

