如何合并两个turf.js蒙版以获得带多个孔洞的单一多边形
问题分析与解决方案
为什么turf.union返回null?
- 你的两个输入Polygon不符合GeoJSON规范:外层多边形(第一个坐标环)被完全包含在孔洞(第二个环)内部,这种反向包含的结构是无效的,turf无法处理这类无效几何,因此返回
null。 turf.union的设计目标是合并外层相互重叠或相邻的有效多边形,它不负责处理反向包含的几何结构,也不能直接用来合并孔洞。
正确实现「多孔洞多边形」的方案
如果你的目标是创建一个大外层多边形内部包含两个小孔洞的有效Polygon,直接构造符合GeoJSON规则的结构即可:
GeoJSON Polygon规则:
- 第一个坐标环是外层边界,必须为顺时针方向,代表多边形的整体范围;
- 后续所有坐标环是孔洞,必须为逆时针方向,且完全在外层边界内部。
示例代码
// 符合规范的多孔洞Polygon const multiHolePolygon = { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ // 外层大矩形(顺时针) [[-75.786602,45.296747],[-75.722062,45.296747],[-75.722062,45.329341],[-75.786602,45.329341],[-75.786602,45.296747]], // 第一个小孔洞(逆时针,坐标顺序与原外层反转) [[-75.778706,45.311839],[-75.778706,45.323789],[-75.762915,45.323789],[-75.762915,45.311839],[-75.778706,45.311839]], // 第二个小孔洞(逆时针) [[-75.74575,45.296747],[-75.74575,45.31715],[-75.728928,45.31715],[-75.728928,45.296747],[-75.74575,45.296747]] ] } }; // 验证有效性 console.log(turf.valid(multiHolePolygon)); // 返回true
额外提示
- 可以使用
turf.valid方法检查Polygon是否符合GeoJSON规范,原始输入会返回false,修正后的结构会返回true; - 如果你的需求是合并两个独立的外层多边形(比如两个不重叠的小矩形合并成一个MultiPolygon或单个合并后的Polygon),确保输入的每个Polygon都是外层在外、孔洞在内的有效结构,再使用
turf.union处理。
内容的提问来源于stack exchange,提问作者Vcoss
相关产品推荐
相关产品推荐

