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

如何在TypeScript中通过turf的booleanValid检测环闭合并完成几何全验证?

如何完整验证GeoJSON Geometry对象的有效性(包括环闭合检查)

turf的booleanValid方法仅验证右手定则等基础拓扑规则,不会检查Polygon/MultiPolygon的环是否闭合,这会导致未闭合的环被误判为有效。要实现完整的Geometry验证,需要结合turf.booleanValid和自定义的环闭合检查逻辑。

步骤1:自定义环闭合检查函数

针对Polygon和MultiPolygon类型,遍历所有环,验证每个环的首尾坐标是否完全一致:

import { Geometry, Polygon, MultiPolygon } from 'geojson';

/**
 * 检查GeoJSON环是否闭合(首尾坐标完全相同)
 */
function isRingClosed(ring: number[][]): boolean {
  if (ring.length < 4) return false; // 有效LinearRing至少需要4个点(首尾重复)
  const first = ring[0];
  const last = ring[ring.length - 1];
  // 严格检查经纬度是否完全相等
  return first[0] === last[0] && first[1] === last[1];
}

/**
 * 检查Geometry中所有环是否闭合
 */
function areAllRingsClosed(geometry: Geometry): boolean {
  switch (geometry.type) {
    case 'Polygon':
      const polygon = geometry as Polygon;
      return polygon.coordinates.every(isRingClosed);
    case 'MultiPolygon':
      const multiPolygon = geometry as MultiPolygon;
      return multiPolygon.coordinates.every(polygon => polygon.every(isRingClosed));
    // Point/LineString等类型无需检查环闭合
    default:
      return true;
  }
}

步骤2:整合完整验证逻辑

将turf.booleanValid的基础验证和环闭合检查结合,得到完整的有效性判断:

import { booleanValid } from '@turf/turf';

/**
 * 完整验证GeoJSON Geometry的有效性
 */
function isFullyValidGeometry(geometry: unknown): boolean {
  const geo = geometry as Geometry;
  // 先通过turf的基础拓扑验证
  const isTurfValid = booleanValid(geo);
  if (!isTurfValid) return false;

  // 再检查所有环的闭合性
  return areAllRingsClosed(geo);
}

测试示例

针对你提供的未闭合Polygon:

const invalidPolygon = {
  type: 'Polygon',
  coordinates: [[[0,0], [10,0], [10,10], [0,10], [0,8]]]
};

console.log(isFullyValidGeometry(invalidPolygon)); // 输出: false

补充说明

  • 对于Point、LineString等非面类型的Geometry,仅通过turf.booleanValid验证即可满足需求
  • 环闭合检查严格遵循GeoJSON规范:LinearRing必须是闭合的(首尾坐标完全一致)

内容的提问来源于stack exchange,提问作者Karim Fayed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:57:08