【发布时间】:2016-12-27 17:18:42
【问题描述】:
我从 RGeo 多边形相交函数(Ruby 2.3.0、RGeo 0.5.3)得到奇怪/不正确的结果
示例 1:
我有两个多边形,我认为它们共享一个边界但不共享任何内部空间(即它们touch 但不overlap):
wkt_1 = "POLYGON ((-8226874.27782158 4962626.76394919, -8223358.174520462 4961756.817075645, -8223358.174520462 4960289.557693501, -8224471.369428394 4960289.557693501, -8226874.27782158 4962253.674727506, -8226874.27782158 4962626.76394919))"
wkt_2 = "POLYGON ((-8224757.546680832 4960523.476563589, -8225269.1002275925 4959296.105368667, -8226993.791361805 4959219.668340384, -8226420.900079966 4961883.087589158, -8224757.546680832 4960523.476563589))"
poly_1 = RGeo::Geos.factory(:srid => 3857).parse_wkt(wkt_1)
poly_2 = RGeo::Geos.factory(:srid => 3857).parse_wkt(wkt_2)
当我们检查它们之间的交点时,它会返回一条线,这与仅共享边界的几何图形一样:
poly_1.intersection poly_2
=> #<RGeo::Geos::CAPILineStringImpl:0x3fc0249af168 "LINESTRING (-8224757.546680832 4960523.476563589, -8225598.074380083 4961210.51680879)">
但是,在运行以下检查时,我们得到的结果与预期相反:
poly_1.overlaps? poly_2
=> true
poly_1.touches? poly_2
=> false
示例 2:
我们采用两个合法重叠的多边形:
wkt_3 = "POLYGON ((-8243237.0 4970203.0, -8243237.0 4968735.0, -8242123.0 4968735.0, -8242123.0 4970203.0, -8243237.0 4970203.0))"
wkt_4 = "POLYGON ((-8244765.0 4966076.0, -8244765.0 4964608.0, -8243652.0 4964608.0, -8243652.0 4966076.0, -8242680.0 4969362.0, -8244765.0 4966076.0))"
poly_3 = RGeo::Geos.factory(:srid => 3857).parse_wkt(wkt_3)
poly_4 = RGeo::Geos.factory(:srid => 3857).parse_wkt(wkt_4)
并计算两个方向的差异:
diff_a = poly_3.difference poly_4
=> #<RGeo::Geos::CAPIPolygonImpl:0x3fe3fca26028 "POLYGON ((-8243077.837796713 4968735.0, -8243237.0 4968735.0, -8243237.0 4970203.0, -8242123.0 4970203.0, -8242123.0 4968735.0, -8242865.466828971 4968735.0, -8242680.0 4969362.0, -8243077.837796713 4968735.0))">
diff_b = poly_4.difference poly_3
=> #<RGeo::Geos::CAPIPolygonImpl:0x3fe3fd1dda28 "POLYGON ((-8242865.466828971 4968735.0, -8243652.0 4966076.0, -8243652.0 4964608.0, -8244765.0 4964608.0, -8244765.0 4966076.0, -8243077.837796713 4968735.0, -8242865.466828971 4968735.0))">
现在我们根据减法器检查剩余的多边形:
diff_b.touches? poly_3
=> true
diff_b.overlaps? poly_3
=> false
这很好。
diff_a.touches? poly_4
=> false
diff_a.overlaps? poly_4
=> true
这是不可能的 - 从另一个多边形中减去的多边形的剩余部分不可能与该多边形重叠!
为什么它只发生在一个方向上?
示例 3:
怪事还在继续。现在让我们得到 poly_3 和 poly_4 的交集
intersection_a = poly_3.intersection poly_4
=> #<RGeo::Geos::CAPIPolygonImpl:0x3fd1084ece88 "POLYGON ((-8242865.724520766 4968734.582337743, -8243078.32501591 4968734.582337743, -8242680.062418439 4969362.301390027, -8242865.724520766 4968734.582337743))">
现在既然这是应该从 poly_3 中减去得到 diff_a 的值,因此 diff_a 应该与 intersection_a 相交的方式与它与 poly_4(减法器)相交的方式完全相同。
除非它没有:
diff_a.touches? poly_4
=> false
diff_a.touches? intersection_a
=> true
diff_a.intersection poly_4
=> #<RGeo::Geos::CAPILineStringImpl:0x3fe3f98fb854 "LINESTRING (-8242680.0 4969362.0, -8243077.837796713 4968735.0)">
diff_a.intersection intersection_a
=> #<RGeo::Geos::CAPIMultiLineStringImpl:0x3fe3fca157b4 "MULTILINESTRING ((-8242865.466828971 4968735.0, -8242680.0 4969362.0), (-8242680.0 4969362.0, -8243077.837796713 4968735.0))">
更糟糕的是,这两个交集结果都没有意义。它应该是一条 2 段的线,但两者都不是。
【问题讨论】:
-
很有趣,但我不知道这可能来自哪里。克隆github.com/rgeo/rgeo 并使用
git grep -A5 "overlaps?"没有显示太多信息。你试过用另一个 srid 吗? -
@EricDuminil - 刚刚用 srid 4326 尝试过 - 结果相同。此外,我认为如果交点是一条线,那么无论坐标空间如何,什么是接触而不是重叠的交点?
-
是的。您可能必须计算交点并手动检查结果是否为空、(多)点、(多)线串或(多)多边形。
-
@EricDuminil 有点违背了使用库的目的
-
当然,但是如果库失败...
标签: ruby geometry geospatial rgeo