PostGIS:多边形集合的边界框

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

在这个例子中,表格“mytable”包含两列:“id”是行的唯一标识号,“areas”是一个包含每行一个MULTIPOLYGONgeometry字段。


对于只包含一个多边形的多边形来说,这样做很好,但有些行的多边形分散得很开,因此当多边形在欧洲和加拿大各有一个时,边界框就不相关了。
所以我需要一种方法来获取每个多边形每个多边形的一个box2d,但我还没有找到如何做到这一点。
更确切地说,我的目标是返回每行一个MULTIPOLYGON,其中包含每个多边形的一个box2d。
第一个例子
  • id: 123
  • area: 包含澳大利亚仅有的一个椭圆形多边形的MULTIPOLYGON
  • 因此bbox应该返回一个包含澳大利亚仅有的一个矩形(边界框)的MULTIPOLYGON

第二个例子
  • id: 321
  • area: 包含巴黎一个圆形和多伦多一个圆形的MULTIPOLYGON
  • 因此bbox应该返回一个包含巴黎一个矩形和多伦多一个矩形的MULTIPOLYGON
2个回答

5
你应该使用 ST_Dump,详情请见 https://postgis.net/docs/ST_Dump.html。使用这个函数可以让每个多边形对应一行数据,同时几何信息在分裂时也将被复制。类似于聚合函数但是反过来的效果。由于输出的数据类型是复合型的,所以语法需要特殊处理,你需要像这样提取其中的几何信息:
SELECT (ST_Dump(the_geom)).geom from mytable;

由于这将给您的表提供更多的行,因此您应该根据查询创建一个新表。

然后,您可以在新表中的新几何列上创建索引,并且它将建立在每个单独多边形的包围盒上。

希望对您有所帮助。

/Nicklas

您还想让每个多边形都放在同一行吗?我原本是这么想的,但如果您只需要一个表格,其中每一行都有一个bbox,并且一个id用于引用原始多边形(当然,对于多边形的每个部分,您将获得相同的id),那么您可以通过提取bbox来实现类似的效果:

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

很抱歉我不太明白你想要什么,但在这种情况下,使用ST_Dump有很多可能性。


(ST_Dump()).geom 正是我所需要的(我敢肯定我在一百万年内都找不到它)。谢谢 :) - wildpeaks

1

您需要分别对相关部分(比如加拿大和法国)进行盒装。在PostGIS中,用于此的最佳工具是几何访问器ST_GeometryN(geometry,int)(参考:http://postgis.refractions.net/docs/ST_GeometryN.html)。该链接给出了一个很好的将访问器与ST_NumGeometries相结合的示例。

根据评论更新:

这里有一个来自旧金山的简单示例--这个表包含一个名为the_geom的几何字段,记录1的gid是一个具有两个多边形的字段,如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)

1
我之前也尝试过这个方法: SELECT numgeometries(areas) AS count, geometryn(areas, generate_series(1, numgeometries(areas))) AS bbox FROM mytable;然而,我不知道在语句中应该插入st_box2d指令的位置,也不知道如何按行聚合它们(st_collect可能是我的第一个想法,但很棘手),并且不确定自己是否朝着正确的方向前进。 - wildpeaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接