如何将Turf.js的intersect相交多边形转换为Leaflet多边形?
如何将Turf.js的intersect相交多边形转换为Leaflet多边形?
这个问题我之前踩过坑!Turf.js的intersect返回的相交多边形,坐标嵌套层级忽上忽下确实挺闹心的,一会要取coordinates[0],一会又得用coordinates[0][0],手动判断太麻烦了。其实这背后是有原因的,而且有两个简单的通用解法:
先说说为啥会有这个问题
Turf.js的intersect根据相交的结果,可能返回Polygon(普通多边形,坐标是三层嵌套:[[[lon, lat], ...]]),也可能返回MultiPolygon(多面集合,坐标是四层嵌套:[[[[lon, lat], ...]]])。而Leaflet的L.polygon只认最内层那一层的坐标数组(就是一堆[lon, lat]的集合),所以咱们得把坐标统一“拆”到这个层级。
解法一:写个小工具函数自动扁平化坐标
自己写个递归函数,自动找到最内层的坐标数组,不用管原来的嵌套层数:
function getLeafletCoords(coords) { // 检查当前数组的第一个元素是不是经纬度对(长度为2的数组) if (coords[0] && coords[0].length === 2) { return coords; } // 不是的话就递归往下找 return getLeafletCoords(coords[0]); }
用的时候超简单:
const targetCoords = getLeafletCoords(intersection.geometry.coordinates); const leafletPolygon = L.polygon(targetCoords).addTo(map);
不管原来的坐标是三层还是四层嵌套,这个函数都会自动找到Leaflet需要的那一层。
解法二:用Turf.js自带的flatten方法
Turf.js有个专门处理这类问题的方法turf.flatten,它能把MultiPolygon转换成单个Polygon的集合,普通Polygon也不会被改变:
// 先把要素扁平化 const flattenedFeature = turf.flatten(intersection); // 取第一个要素的坐标(不管原来是什么类型,这里都能拿到正确的层级) const leafletCoords = flattenedFeature.features[0].geometry.coordinates[0]; // 生成Leaflet多边形 const leafletPolygon = L.polygon(leafletCoords).addTo(map);
这个方法更“正规”,毕竟是官方提供的工具,不用自己写递归逻辑,稳定性更高。
对了,你之前试的turf.getCoords确实没用,因为它只是原样返回原始坐标,不会处理层级差异,所以得用上面这两种方法来统一格式。
备注:内容来源于stack exchange,提问作者Alasdair
相关产品推荐
相关产品推荐

