[英]MySQL ST_Contains with wrong result
我正在使用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中(這根本不是真的)。 兩種形狀都使用與左側和右側的共同邊界相同的“方式”Bregenz比Mellau大得多
在地圖上看到: http : //www.openstreetmap.org/relation/74231 vs. http://www.openstreetmap.org/relation/75097
不幸的是我不能在這里發布我的coord-data(stackoverflow只允許發布30.000個字符)。 所以問題是:我怎樣才能找出為什么 mysql說它不包括在內?
提前致謝!
你可以使用距離非常小的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;
我建議您的多邊形坐標沿着共享線可能略有不同,因此較小的區域不會完全包含在較大的區域內。
如果只有較小多邊形的一個坐標落在較大區域之外(即使是在眼睛看不到的第8個小數點!),小區域的某些部分將不會包含在較大區域內,因此,你得到了正確的答案,但不一定是你正在尋找的答案。
您應該能夠使用Intersection和Difference空間函數的組合來查找問題 - 您需要能夠將結果投影到地圖上以查看問題所在。 見http://dev.mysql.com/doc/refman/5.7/en/spatial-operator-functions.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.