如何在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
相关产品推荐
相关产品推荐

