PostGIS:多边形的边界框

时间:2010-10-11 01:04:37

标签: sql postgresql geospatial postgis

SELECT id, ST_Box2D(areas) AS bbox FROM mytable;

在此示例中,“mytable”包含两列:“ id ”是行的唯一ID号和“区域“是一个 geometry 字段,每行包含一个 MULTIPOLYGON


这适用于仅包含一个多边形的多边形,但有些行的多边形非常分散,因此当多边形在欧洲包含一个多边形而在加拿大包含一个多边形时,边界框不相关。

所以我需要一种方法来获得每个多边形每个多边形一个box2d,但我还没有找到。 更准确地说,我的目标是每行返回一个多面,每个多边形包含一个box2d。


第一个例子

  • id :123
  • 区域:澳大利亚只包含一个椭圆形多边形的多边形
  • 因此 bbox 应该返回一个只包含一个矩形(边界框)的多边形在澳大利亚

第二个例子

  • id :321
  • 区域:包含巴黎一个圆圈,多伦多圆圈的多边形
  • 因此 bbox 应返回包含巴黎一个矩形的多边形,多伦多的一个矩形

2 个答案:

答案 0 :(得分:5)

您应该使用ST_Dump http://postgis.org/documentation/manual-1.5/ST_Dump.html

然后你会得到每个多边形一行。拆分几何体时,其他字段将重复。它就像一个聚合函数,但另一种方式。

语法有点特殊,因为它输出一个复合数据类型,所以你必须像这样提取几何部分:

SELECT (ST_Dump(the_geom)).geom from mytable;

因为这会在表格中为您提供更多行,您只需从查询中创建一个新表。

然后你可以在新表中的新几何列上创建一个索引,它将构建在每个单个多边形的边界框上。

HTH

/尼克拉斯

您是否希望每个多边形的多边形?这就是我的想法,但是如果你只想要一个带有bbox的表,每行一个带有id的引用原始的multipolygon(你将cource获得为多边形的每个部分重复的相同id)然后你可以做同样的byt只是提取像:

这样的bbox
CREATE TABLE newTable AS
SELECT id, BOX2D((ST_Dump(the_geom)).geom) AS myBox FROM originamTable

恐怕我没有真正得到你想要的东西,但在这种情况下,ST_Dump有很多可能性。

答案 1 :(得分:1)

您必须分别打包相关位(比如加拿大和法国组件)。 PostGIS中最好的工具是几何访问器ST_GeometryN(geometry,int)(参考:http://postgis.refractions.net/docs/ST_GeometryN.html)。该链接有一个很好的例子,可以将访问者与ST_NumGeometries结合起来。

更新评论:

以下是旧金山的一个简单示例 - 此表包含名为the_geom的几何字段,gid记录1是st_numgeometries报告的具有两个多面的字段(注意序数索引为1而不是0):

=> select st_box2d(st_geometryn(the_geom, 1)) from tl_2009_06075_cousub00 \
 where gid = 1;

                                st_box2d                                 
-------------------------------------------------------------------------
 BOX(-123.173828125 37.6398277282715,-122.935707092285 37.8230590820312)
(1 row)

=> select st_box2d(st_geometryn(the_geom, 2)) from tl_2009_06075_cousub00 \
 where gid = 1;

                                  st_box2d                                  
----------------------------------------------------------------------------
 BOX(-122.612289428711 37.7067184448242,-122.281776428223 37.9298248291016)
(1 row)