1

我有一组 GeoJSON 功能,如 Polygon 和 MultiPolygon。其中许多是长方形或正方形,而另一些则是奇形怪状。如果该特征是矩形或正方形,是否有任何算法/第 3 方库来查找所有四个角坐标?

我首先尝试过滤那些只有五个坐标的特征,以便这些点本质上是角坐标。但是它们中的一些具有五个以上的坐标,但它们的形状是矩形或正方形。检查下面给出的功能示例。

{
    "type": "FeatureCollection",
    "features": [{
            "type": "Feature",
            "geometry": {
                "type": "MultiPolygon",
                "coordinates": [
                    [
                        [
                            [
                                -100.89361997899994,
                                32.26379776400006
                            ],
                            [
                                -100.91045627599999,
                                32.26071261200008
                            ],
                            [
                                -100.91412950899996,
                                32.27488019800006
                            ],
                            [
                                -100.89716524599999,
                                32.277952922000054
                            ],
                            [
                                -100.89535669999998,
                                32.270942981000076
                            ],
                            [
                                -100.89361997899994,
                                32.26379776400006
                            ]
                        ]
                    ]
                ]
            },
            "properties": {}
        }, {
            "type": "Feature",
            "geometry": {
                "type": "MultiPolygon",
                "coordinates": [
                    [
                        [
                            [
                                -100.94608104399998,
                                32.26182869300004
                            ],
                            [
                                -100.95445864399994,
                                32.26032213600007
                            ],
                            [
                                -100.95620274599997,
                                32.26742597700007
                            ],
                            [
                                -100.94798489999994,
                                32.26894866500004
                            ],
                            [
                                -100.94608104399998,
                                32.26182869300004
                            ]
                        ]
                    ]
                ]
            },
            "properties": {}
        }
    ]
}
4

1 回答 1

0

一个基本算法将是:

  • 检查点 1 和点 2 之间的线。将其作为参考线并注意其长度和斜率
  • 检查点 2 和点 3 之间的线。如果它与参考线不正交或不平行,则返回 False。它不是一个矩形。
  • 如果它是平行的,那么参考线现在在点 1 和点 3 之间。
  • 如果它是正交的,则参考线现在位于点 2 和点 3 之间。将点 1 和点 2 之间的线保存为边。

像这样找到所有边。如果你能找到 4 条正交边并且两对平行边的长度相同,那么你就有了一个矩形。如果所有边的长度相等,则您有一个正方形。

作为第三方实现,请检查 turf(javascript 库)和/或 geos(带有 Python 绑定的 C++ 库)。如果存在“检查矩形”实现,它必须在这两个之一中。

编辑:更好的算法是:

将几何图形的面积与其 bbox 的面积进行比较。如果面积相等,矩形。如果面积相等且 bbox 是正方形,则正方形。如果面积不相等,则不是矩形。

于 2018-06-20T14:58:49.740 回答