You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:24:04