【问题标题】:PostGIS - convert multipolygon to single polygonPostGIS - 将多面体转换为单面体
【发布时间】:2014-03-10 07:21:47
【问题描述】:

是否可以将包含多多边形的形状文件导入 PostGIS 中的单个多边形?每当我尝试导入多边形的形状文件时,它都会作为多多边形(而不是单个多边形)存储在 geom 列中。因此,我无法从多面体中将其提取为单个面值。

非常感谢所有有用的建议

【问题讨论】:

    标签: postgresql postgis geoserver


    【解决方案1】:

    我使用ST_DUMP 将 PostgreSQL 中的多多边形几何表转换为包含多边形几何和其他数据列的新表。

    CREATE TABLE poly AS                       --poly will be the new polygon table
    WITH dump AS (
        SELECT id, test,                       --columns from your multipolygon table 
          (ST_DUMP(geometry)).geom AS geometry 
        FROM multi                             --the name of your multipolygon table
    ) 
    SELECT id, test, 
      geometry::geometry(Polygon,4326)         --type cast using SRID from multipolygon
    FROM dump;
    

    更新:我认为使用此查询可以更轻松地完成此操作。

    CREATE TABLE polygon_table AS 
        SELECT id, example_column, (ST_DUMP(geom)).geom::geometry(Polygon,4326) AS geom FROM multipolygon_table
    

    【讨论】:

    • 这是最好的答案
    • .geom::geometry(Polygon,4326) 是干什么用的?
    • @Richard,因为他们正在创建表,他们需要告诉 postgres/postgis 几何列的 SRID
    【解决方案2】:

    您可以将ST_GeometryNST_NumGeometries 和 generate_series 函数一起使用来获得您需要的内容。

    假设您有 Jakub 示例中的表格:

    CREATE TABLE multi AS(
    SELECT 1 as id, 2 as test, ST_GeomFromText('MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)),((1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))') AS geom
    );
    

    这个包含一个多面体、一个 id 和另一列。

    要从包含所有其他属性的表中获取每个多边形,请尝试以下操作:

    SELECT id, test, ST_GeometryN(geom, generate_series(1, ST_NumGeometries(geom))) AS geom 
    FROM multi
    

    “id”和“test”是原始表中每一行的值。 generate_series 创建从 1 到每行几何数的一系列数字。

    因此,您将在其单独的单个几何部分中拆分每个多几何,并且其他列中的值保持不变。

    只需将示例中的列和表格替换为导出的 shapefile 中的列,您将获得包含单个多边形的表格。

    希望这能回答你的问题。

    【讨论】:

      【解决方案3】:

      导入到临时表中,然后使用ST_DUMP 将多几何体分解为单独的部分,并使用它来填充目标表。

      更新

      您将所需的所有数据导入临时表(我们称之为multi),然后使用ST_DUMP 将多重几何分解为单个几何:

      WITH multi AS(
      SELECT 1 as id, 2 as test, ST_GeomFromText('MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)),((1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))') as poli
      )
      ,dump AS(
      SELECT  id
          ,test
          ,ST_DUMP(poli) as d
      FROM    multi)
      SELECT  id
          ,test
          ,(dump.d).path
          ,ST_AsTEXT((dump.d).geom)
      FROM dump 
      

      【讨论】:

      • 你能解释一下吗?我们有一个形状文件并使用 postgis 2.0 形状加载器导出到 postgesql。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多