多边形内多边形的表格布局是什么?

时间:2014-09-10 23:18:28

标签: mysql spatial spatial-query

enter image description here

我对空间的东西很新,所以请原谅初学者的问题。如果我希望有许多看起来像图片的多边形,那么最好有一个表格,其列定义为

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; 

第二种情况似乎更干净,但我只是在屠杀我的第一种情况吗?有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分: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(如您的注释中所示)并将contains = 1添加到where子句

使用像这样的计数器表是一种破解,但MySQL缺乏一个动态生成任意长度系列的功能(不像Postgres),但仍然比使用循环结构或辅助表更清晰。