簡體   English   中英

MySQL ST_Contains結果錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM