MySQL ST_Contains结果错误

时间:2014-08-07 12:41:41

标签: mysql polygon contains spatial

我使用MySQL ST_Contains来查明某个区域是否包含在其他区域中。因此,我有一个这样的表:

CREATE TABLE tablex (id int, geoPoly MULTIPOLYGON NOT NULL, SPATIAL INDEX(geoPoly))

为了找出某个区域中包含哪些区域,我使用以下查询:

SELECT b.* FROM tablex as a 
LEFT JOIN tablex as b  ON ST_CONTAINS(b.geoPoly, a.geoPoly) 
WHERE a.intID = 123 

这适用于大多数情况,但有一个特殊情况,它给出了错误的答案:

我从openstreetmaps复制了奥地利地区Bregenz和Mellau的地理坐标。 Mellau被列入布雷根茨。但是上面的查询说Mellau被包括但不包括在Bregenz中(这根本不是真的)。两种形状都使用相同的方式"作为左侧和右侧的共同边界,布雷根茨比梅劳大得多。

在地图上看到它: http://www.openstreetmap.org/relation/74231http://www.openstreetmap.org/relation/75097

不幸的是我不能在这里发布我的coord-data(stackoverflow只允许发布30.000个字符)。所以问题是:我怎样才能找到为什么 mysql说它不包括在内?

提前感谢!

2 个答案:

答案 0 :(得分:1)

您可以使用距离非常小的ST_Buffer(0.0000001)(但不能太小,要小心)并且它可以正常工作。 一个例子:

SELECT st_within(g1.shape, ST_buffer(geometrycollection(g1.shape, g2.shape), 0.0000001))
FROM (SELECT * FROM geoflas WHERE id = 1) as g1, 
    (SELECT * FROM geoflas WHERE id = 2) as g2;

答案 1 :(得分:0)

我建议您的多边形坐标沿共享线可能略有不同,因此较小的区域不会完全包含在较大的区域内。

如果只有较小多边形的一个坐标落在较大区域之外(即使是在眼睛看不到的第8个小数点!)小区域的某些部分将不包含在更大的区域,因此,您得到正确的答案,但不一定是您正在寻找的答案。

您应该能够使用“交点”和“差异”空间函数的组合来查找问题 - 您需要能够将结果投影到地图上以查看问题所在。见http://dev.mysql.com/doc/refman/5.7/en/spatial-operator-functions.html