我正在使用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
这对大多数情况都有效,但有一种特殊情况会给出错误的答案:
我从 OpenStreetMap 复制了奥地利 Bregenz 和 Mellau 地区的地理坐标。Mellau 包含在 Bregenz 中。但是上面的查询说 Mellau 被包含了但不在 Bregenz 中(这显然是不正确的)。两个形状在左侧使用相同的“路径”作为公共边界,在右侧,Bregenz 比 Mellau 大得多。
在地图上查看: http://www.openstreetmap.org/relation/74231 与 http://www.openstreetmap.org/relation/75097 不幸的是,我无法在此处发布我的坐标数据(stackoverflow 只允许发布 30,000 个字符)。因此问题是:我如何找出 MySQL 为什么说它不包含的原因?
先谢谢!
SELECT b.* FROM tablex as a LEFT JOIN tablex as b ON ST_intersects(b.geoPoly, a.geoPoly) AND NOT ST_touches(b.geoPoly, a.geoPoly) WHERE a.intID = 123
可以返回正确的结果,但需要10倍的时间。(而且这不是最好的方法) - derjan