3

我已经为多边形使用了 2 个 geojson 对象。它太大了,我不能在这里发布。现在我正在使用 TurfJs 来合并这个多边形 geojson 并将其绘制在地图上。但它不能正常工作。

我认为它中间的一点点有点不同。那么有什么办法可以忽略 turfjs union 中间的这些点呢?

请参阅下面的图片以更好地理解。

多边形 1: 在此处输入图像描述

多边形 2:

在此处输入图像描述

现在合并多边形以获取以下代码:

polygons = {
          "type": "FeatureCollection",
          "features": [poly1, poly2]
        };

在此处输入图像描述

现在主要的 UNION 结果:

union = turf.union(poly1,poly2);

在此处输入图像描述

因此,在此,我想忽略边界中间的点积分?

或者是否有任何替代方法可以合并多边形,忽略一些更近的​​点分散并移除中间点?

4

3 回答 3

2

turf.buffer(result, 0, 'kilometers')您可以尝试通过( turf-buffer docs )运行生成的多边形。如果您的结果是无效的 geojson,那么使用 0 的缓冲区应该清理几何图形(删除中间的点/线)。

如果没有看到结果的实际 GeoJSON,很难说什么会起作用。有什么办法可以将它上传到pastebin或其他东西吗?

更新 - 在这种情况下,草皮缓冲区不起作用。我可以开始工作的唯一解决方案是对turf.union(p1, p2).

result.geometry.coordinates = [result.geometry.coordinates[0]]

您要小心使用此解决方案,因为它会从多边形中移除除外环之外的所有内容。

要了解其工作原理/方式,您需要确保了解 geojson 多边形的坐标是如何工作的。来自geojson.org geojson 多边形规范

对于“Polygon”类型,“coordinates”成员必须是 LinearRing 坐标数组的数组。对于具有多个环的多边形,第一个必须是外环,其他必须是内环或孔。

外环本质上是多边形的轮廓。任何内环通常表示为孔。在您的情况下,内环实际上是线条。

查看 geojson 多边形的坐标时,您会注意到所有坐标都包含在外部数组中。这是一个只有一个(外部)环的 geojson 多边形示例。

{"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": **[ [ [1, 1], [1, 2], [1, 3], [1, 1] ] ]**

请注意,环的第一个坐标和最后一个坐标必须始终相同。这确保我们得到一个封闭的形状(即:多边形)。

现在这是一个带有外环和内环的示例

{"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": **[ [ [1, 1], [1, 2], [1, 3], [1, 1] ], [ [1, 2], [1, 3], [1, 1] ] ]**

现在,如果我们将建议的解决方案应用于上述示例,我们将获得与第一个示例相同的坐标,因为我们只从多边形中获取第一组坐标,这始终是外环。坐标数组中的任何后续元素都将表示内部环(这就是线条,即使它们在技术上不是有效的内部环)。

{"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": **[ [ [1, 1], [1, 2], [1, 3], [1, 1] ] ]**

如您所见,我们正在从多边形中移除所有内环。这就是你必须小心使用它的原因。如果你有有效的内环,它实际上会摆脱那些。

我认为发生这种情况的原因是因为您的多边形 (p1p2) 共享一个边界。

于 2017-03-02T12:56:57.987 回答
0

面临同样的问题:尝试缓冲少量的正数和相同的负数后,线条消失了。但这使得多边形的点比原来的多,所以我做了这个解决方法:

inner = [YOUR FEATURE COLLECTION]
var areas = []
for (var i = 0; i < inner.geometry.coordinates.length; i++) {
    let item = inner.geometry.coordinates[i]
    if (item.length > 10) areas.push(item)
}
inner = turf.polygon(areas)

如您所见,我正在删除“非复杂”多边形(假设少于 10 个点的多边形不是真实区域)

于 2021-01-08T16:06:47.290 回答
0

发生这种情况是因为两个多边形的坐标不是 100% 相同,在将它们合并在一起时会产生一个小间隙。

遇到这个问题时,我不得不用草皮的distance方法检查多边形的每个顶点,如果它们之间有细微的差别,我会让它们相同。

实现方法可能因您使用的地图库而异,但应该是这样的:

layers.forEach(layer => {
    layers.forEach(innerLayer => {
        if (layer === innerLayer) return;
    
        // Here you would check if the vertexes are close to each other, using distance.

        // If the vertexes are close, you would make them equal and update the layer.
    })
})

只有在使多边形的顶点相同之后,您才能使用联合方法将它们合并。

由于实现非常独特并且取决于项目,我不会在实际代码上浪费我们的时间,但我相信有了上面的见解,你应该很高兴。

于 2021-01-27T13:25:36.943 回答