【问题标题】:PostGIS: bounding box of a multipolygonPostGIS:多面体的边界框
【发布时间】:2010-10-11 01:04:36
【问题描述】:
SELECT id, ST_Box2D(areas) AS bbox FROM mytable;

在本例中,table“mytable”包含两列:“id”是行的唯一 id 编号,“areas” >" 是一个 geometry 字段,每行包含一个 MULTIPOLYGON


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

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


第一个例子

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

第二个例子

  • id:321
  • 区域:一个多面体,包含一个在巴黎的圆,一个在多伦多的圆
  • 因此 bbox 应该返回一个多面体,其中包含一个在巴黎的矩形,一个在多伦多的矩形

【问题讨论】:

    标签: sql postgresql geospatial postgis


    【解决方案1】:

    你应该使用ST_Dumphttps://postgis.net/docs/ST_Dump.html

    然后你会得到每个多边形一行。分割几何时将复制其他字段。它就像一个聚合函数,但反过来。

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

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

    因为这会在表中为您提供更多行,所以您应该从查询中创建一个新表。

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

    HTH

    /尼克拉斯

    你想让你的多边形也各占一行吗?这就是我的想法,但是如果您只想要一个带有 bboxes 的表,每行一个带有 id 的表引用原始多面体(您当然会为多面体的每个部分重复相同的 id),那么您可以执行相同的字节只是提取 bboxes 之类的:

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

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

    【讨论】:

    • (ST_Dump()).geom 正是我所需要的(而且我敢肯定在一百万年后我不会找到它)。谢谢:)
    【解决方案2】:

    您必须分别装箱相关位(例如加拿大和法国组件)。 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)
    

    【讨论】:

    • 我之前也试过这个: SELECT numgeometries(areas) AS count, geometryn(areas, generate_series(1, numgeometries(areas))) AS bbox FROM mytable;但是我不知道我可以在语句中的哪里插入 st_box2d 指令,也不知道如何在每行聚集它们(st_collect 是我的第一个想法,但它很棘手)并且不确定我是否朝着正确的方向前进完全没有。
    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2021-05-22
    • 2012-11-13
    • 2013-04-30
    相关资源
    最近更新 更多