我有这样的东西,但对于大集合来说,速度非常慢:
let unionize = (triangles) => {
if(triangles.length == 0) {
return null
}
let ret = triangles[0].feature
triangles.forEach((t, index) => {
if(index > 0) {
ret = turf.union(t, t)
}
})
return ret
}
瓶颈在于联合。它必须将每个多边形的所有坐标与所有坐标进行比较,以避免重复条目。
正在接听@Fergals https://stackoverflow.com/questions/66590054/quickly-merge-many-contiguous-polygons-in-javascript/75974925#75974925想法,这是用 JS 实现的这种方法。而且速度更快
allGeometries
是有效的 GeoJSON 多边形几何体的数组。该函数也考虑内环。
function fasterUnion(allGeometries) {
const mid = Math.floor(allGeometries.length / 2);
let group1 = allGeometries.slice(0, mid);
let group2 = allGeometries.slice(mid);
while (group1.length > 1) {
group1 = unionGroup(group1);
}
while (group2.length > 1) {
group2 = unionGroup(group2);
}
let result;
if (group1.length === 1 && group2.length === 1) {
result = turf.union(group1[0], group2[0]);
} else if (group1.length === 1) {
result = group1[0];
} else {
result = group2[0];
}
return result;
}
function unionGroup(group) {
let newGroup = [];
for (let i = 0; i < group.length; i += 2) {
let a = group[i];
let b = i + 1 < group.length ? group[i + 1] : null;
if (b) {
newGroup.push(turf.union(a, b));
} else {
newGroup.push(a);
}
}
return newGroup;
}
另一种可能的方法是创建一个空间索引,如 R-Tree 和类似的库RBush https://github.com/mourner/rbush。由于联合的昂贵部分是将所有坐标相互比较并消除重复项,因此加快速度的一种方法是排除坐标比较,我们可以安全地假设这些坐标的多边形不重叠。可以使用 R 树来快速(粗略)地找出哪些多边形重叠、哪些多边形不重叠。 RBush提供了两种方法,search()
and collide()
可以用于此目的。一旦我们知道哪些多边形不重叠,就不需要为它们执行昂贵的并集操作。我们只需比较重叠的多边形的坐标即可。最后,我们只需要将并集的结果(一个Polygon)与RBush识别出的不重叠的多边形(可能有多个多边形)放入一个多边形中,这就是数组理解,因为a中的几何体GeoJSON https://geojson.org/无非就是以某种方式组合在一起的奇特数组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)