Skip to content

SpatialAnalysis 面积叠加分析 ​

getOverlapArea(firstCoordinates, secondCoordinates, options?) 使用 Turf 计算两个多边形的交集,返回重叠面积、交叠比例以及可直接绘制的 GeoJSON 几何。无需传入 Viewer,可配合 PickTools.pickPolygon() 和 SDK 面图层使用。

组件案例 ​

红色为默认区域,绿色为拾取区域,蓝色为交叠部分。在红色区域附近单击添加顶点,双击结束绘制;拖拽顶点后重新计算并更新交集。没有重叠面积时显示提示并清除旧的蓝色区域。

在在线示例中选择“面积叠加分析”,可以编辑默认坐标、面积单位和颜色,查看地图结果、分析面板及 CALLBACK RESULT 返回数据。

使用方法 ​

js
import { SpatialAnalysis } from 'b-map-viewer'

const analysis = new SpatialAnalysis({ areaUnit: 'km2' })
const firstCoordinates = [
  [125.795, 44.142], [125.800, 44.164], [125.816, 44.175],
  [125.835, 44.165], [125.836, 44.142],
]
const secondCoordinates = [
  [125.82, 44.13], [125.85, 44.13],
  [125.85, 44.16], [125.82, 44.16],
]

const result = analysis.getOverlapArea(firstCoordinates, secondCoordinates)
console.log(result.area)         // 约 2.4925
console.log(result.unit)         // 'km2'
console.log(result.hasOverlap)   // true
console.log(result.geometry)     // GeoJSON Polygon 或 MultiPolygon
console.log(result.firstRatio)   // 约 0.2706,即占第一组区域约 27.06%
console.log(result.secondRatio)  // 约 0.3121,即占第二组区域约 31.21%

// 单次覆盖面积单位,不修改实例默认配置
const hectares = analysis.getOverlapArea(firstCoordinates, secondCoordinates, {
  areaUnit: 'ha',
})

参数 ​

参数默认值作用
firstCoordinates必填第一组面顶点 [[经度, 纬度], ...]
secondCoordinates必填第二组面顶点,可直接传入 pickPolygon 返回的坐标组
options.areaUnit实例配置,初始为 'm2'所有返回面积的单位:m2、km2、ha;也支持 m²、km²

两组坐标各自表示单个多边形外环,至少包含三个不共线顶点,按边界顺序排列;支持已闭合或未闭合的坐标,自动合并连续重复点并补齐闭合边。输入数组不会被修改,第三维高度不参与分析。

非法坐标、自相交、退化区域和重复的非相邻顶点会抛出错误。当前方法面向不跨越 ±180° 经线的局部区域,不接受带孔洞、多区域或环绕极点的输入。交集结果可以包含多个不相连的区域。

交集边界按经纬度平面拓扑裁剪,面积由 Turf 按球面计算,不包含地形起伏。unit 距离配置不影响此方法,所有面积使用 areaUnit。

返回结果 ​

字段类型作用
areanumber所有交叠部分的总面积
unit'm2' / 'km2' / 'ha'area、原始区域面积和各分块面积的统一单位
hasOverlapboolean是否存在具有正面积的交集
firstAreanumber第一组区域的面积
secondAreanumber第二组区域的面积
firstRationumber交叠面积占第一组区域的比例,范围 0~1
secondRationumber交叠面积占第二组区域的比例,范围 0~1
centernumber[] / null最大交叠分块上的标签锚点 [经度, 纬度]
geometryobject / null交集的 GeoJSON Polygon 或 MultiPolygon 几何,可直接传给 SDK 面图层
partsobject[]交叠分块列表,每项包含 area、center 和 geometry

parts[].geometry 为单个 Polygon,parts[].area 的单位同返回结果的 unit。每块的 center 优先使用区域质心,若质心在区域外,则回退到区域内或边界上的点,适合放置面积标注,不保证是几何中心。

没有相交或仅接触边、顶点时,返回 area: 0、hasOverlap: false、geometry: null、center: null、parts: [],两项比例均为 0;firstArea 和 secondArea 仍保留有效值。

配合拾取与面图层 ​

js
import { SpatialAnalysis, PickTools, MapLayers } from 'b-map-viewer'

const analysis = new SpatialAnalysis({ areaUnit: 'km2' })
const entitySnapshot = new Set(viewer.entities.values)
const firstCoordinates = [
  [125.795, 44.142], [125.800, 44.164], [125.816, 44.175],
  [125.835, 44.165], [125.836, 44.142],
]
const baseLayer = new MapLayers.PolygonPrimitiveLayer(viewer, {
  color: '#ef534b', opacity: 0.4, height: 2,
})
const overlapLayer = new MapLayers.PolygonPrimitiveLayer(viewer, {
  color: '#4169ff', opacity: 0.85, height: 12,
})
baseLayer.setData([{
  geometry: { type: 'Polygon', coordinates: [analysis.getArea(firstCoordinates).coordinates] },
  properties: { id: 'default-area' },
}])

const tools = new PickTools(viewer, { color: '#36df93', isReserve: true })
tools.pickPolygon((coordinates) => {
  try {
    const result = analysis.getOverlapArea(firstCoordinates, coordinates)
    if (result.hasOverlap) {
      overlapLayer.setData([{
        geometry: result.geometry,
        properties: { id: 'intersection' },
      }])
    } else {
      overlapLayer.clearLayer()
    }
    console.log('SpatialAnalysis.getOverlapArea 返回结果:', result)
  } catch (error) {
    overlapLayer.clearLayer()
    console.error('面积叠加分析失败:', error)
  }
})

// 离开页面或重新绘制前调用;只清理本例资源,保留已有场景数据
function cleanup() {
  tools.destroy()
  overlapLayer.destroy()
  baseLayer.destroy()
  if (!viewer.isDestroyed()) {
    viewer.entities.values
      .filter((entity) => !entitySnapshot.has(entity))
      .forEach((entity) => viewer.entities.remove(entity))
  }
}

在线示例另外使用 TextGroupLayer 在各交叠分块上标注面积,并通过 onResult(result) 更新结果面板;绘制无效区域时通过 onError(error) 展示错误并清空旧交集。

基于 Apache-2.0 许可发布