2014-09-10 193 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不同),但仍然比使用循环结构或辅助表更清晰。