2014-09-10 100 views
0

enter image description here什麼是多邊形內部多邊形

到空間的東西好表的佈局我很新,所以原諒初學者問題。如果我希望有很多的多邊形,看起來像圖片,是它最好有1臺與一個具有外多邊形和一個具有內部多邊形和類似

POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10),(20 30, 35 35, 30 20, 20 30),(20 30, 35 35, 30 20, 20 30),(20 30, 35 35, 30 20, 20 30),(20 30, 35 35, 30 20, 20 30)) 

或兩個表定義的列,第一個表中包含的多邊形的ID?

我的用例通常會詢問「這個點是否在外部多邊形?」和「哪個多邊形包含這一點?」。對於後者,如果可能的話,我只想返回最內側的多邊形。

因此,對於我的第一個案例(1表),我想sudo代碼看起來像。

len = SELECT NumInteriorRings(g1) 

,然後遍歷每個內部多邊形使用類似

for(i = 1; i < len; ++i){ 
    SELECT ST_CONTAINS(InteriorRingN(poly,i),point) 
} 

我的第二種情況(2個表)看起來更像

SELECT sub_poly_id, ST_CONTAINS(poly, point) as contains 
FROM sub_poly_table WHERE parent_poly_id = 23; 

第二種情況似乎更乾淨,但我我只是屠殺我的第一個案件?有沒有更好的方法來完成這一點?

+0

綠色位應該是藍色多邊形的內環還是它們是分開的多邊形? – 2014-09-19 13:18:44

+0

他們是子多邊形。較大的兒童。 – 2014-09-25 21:38:27

+0

我還是不明白。它們是內環還是單獨的多邊形,恰好位於其他多邊形內部,兒童多邊形的概念對我而言是新的。 – 2014-09-26 08:22:41

回答

0

沒有必要創建第二個表來完成你所需要的。它增加了額外的複雜性,沒有額外的收益,因爲您可以隨時測試整個多邊形,只是外圈或任何內部。它也會使更新變得更加混亂,因爲您需要更新兩個表中的幾何圖形,而不是單個幾何圖形。

您可以使用一個計數器表(僅包含數字1,2,3,4,...)來提取每個內環,以測試任何內環與某個輸入點的交點並避免使用任何循環結構。例如,

insert into test (geom) values (geomfromtext('POLYGON 
    ((0 0, 100 0, 100 100, 0 100, 0 0), 
    (10 10, 10 20, 20 20, 20 10, 10 10), 
    (80 80, 80 90, 90 90, 90 80, 80 80), 
    (50 50, 50 60, 60 60, 60 50, 50 50), 
    (20 30, 35 35, 30 20, 20 30)) ')); 

create table counter (id int primary key); 

把一些數字放在櫃檯,實際上,你可能會想要更多。

insert into counter values (1), (2), (3), (4), (5); 

select x.id as ring_num, 
     contains(interiorringn(geom, x.id), geomfromtext('POINT(15 15)')) as contains 
from test, 
    (select id from counter where id <= 
     (select numinteriorrings(geom) from test) 
    ) x ; 

返回:

ring_num contains 
1  1 
2  0 
3  0 
4  0 

在這個例子中,在那裏我已經改變了你的多邊形的內環所以他們實際上是不同的。 顯然,一旦確定外部多邊形包含該點,就可以將parent_poly_id添加回查詢的where子句。您還需要將1添加到x.id中,以便內環1對應於2,內環2對應於3(如您的註釋中所示),並在where子句中添加contains = 1

使用計數器像這樣的表是一種黑客攻擊,但MySQL缺乏一種即時生成任意長度系列的函數(與Postgres不同),但仍然比使用循環結構或輔助表更清晰。