【问题标题】:Why does ST_MakeValid() strip SRID from already-defined geometries?为什么 ST_MakeValid() 会从已定义的几何图形中去除 SRID?
【发布时间】:2020-02-28 03:47:51
【问题描述】:

我正在尝试在一系列大部分同心等距多面体上使用 PostGIS ST_MakeValid() 函数。 . .

。 . .用明确的几何类型和 SRID 定义(虽然它们可能不是完全有效,但仍然有效到足以在 QGIS 中呈现,如上所示):

trade=# \d tmp1
                           Table "public.tmp1"
  Column   |            Type             | Collation | Nullable | Default 
-----------+-----------------------------+-----------+----------+---------
 the_geom  | geometry(MultiPolygon,4326) |           |          | 

不幸的是,当我使用ST_MakeValid() 函数创建新表时,它会同时剥离 SRID 和几何类型:

trade=# CREATE TABLE tmp2 AS (SELECT ST_MakeValid(the_geom) AS the_geom_valid FROM tmp1);
SELECT 25
trade=# \d tmp2
                    Table "public.tmp2"
     Column     |   Type   | Collation | Nullable | Default 
----------------+----------+-----------+----------+---------
 the_geom_valid | geometry |           |          | 

。 . .而ST_SetSRID() 也无法通过创建新表来解决它:

trade=# CREATE TABLE tmp3 AS (SELECT ST_SetSRID(the_geom_valid,4326) AS the_geom_srid FROM tmp2);
SELECT 25
trade=# \d tmp3
                    Table "public.tmp3"
    Column     |   Type   | Collation | Nullable | Default 
---------------+----------+-----------+----------+---------
 the_geom_srid | geometry |           |          | 

。 . .或通过嵌套函数:

trade=# CREATE TABLE tmp4 AS (SELECT ST_SetSRID(ST_MakeValid(the_geom),4326) AS the_geom_all FROM tmp1);
SELECT 25
trade=# \d tmp4
                    Table "public.tmp4"
     Column    |   Type   | Collation | Nullable | Default 
 --------------+----------+-----------+----------+---------
  the_geom_all | geometry |           |          | 

。 . . 甚至可以使用大家最喜欢的ST_MakeValid()半替代,ST_Buffer()

trade=# CREATE TABLE tmp5 AS (SELECT ST_Buffer(the_geom,0) AS the_geom_buffer FROM tmp1);
SELECT 25
trade=# \d tmp5;
                     Table "public.tmp5"
     Column      |   Type   | Collation | Nullable | Default 
-----------------+----------+-----------+----------+---------
 the_geom_buffer | geometry |           |          | 

我找不到任何文档表明这是使用 ST_MakeValid() 时的预期行为 - 如何在不丢失几何类型和 SRID 的情况下创建有效几何?

【问题讨论】:

  • 你好,邻居。也许给ST_Multi(ST_CollectionExtract(ST_MakeValid(geom), 3))::geometry(MultiPolygon, 4326) 一个机会?
  • @dbaston 就是这样; Darrell 在下面也提到了它。谢谢!
  • 是的,唯一的区别是 ST_CollectionExtract 有效地为您提供安全的演员表。

标签: postgresql postgis


【解决方案1】:

SRID 正在被保留。例如,试试这个:

SELECT st_srid(the_geom_buffer) FROM tmp2 LIMIT 1;

你应该会看到如下内容:

┌─────────┐
│ st_srid │
├─────────┤
│    4326 │
└─────────┘

这样做的原因是 ST_MakeValid() 可以返回多种类型中的任何一种,但无法提前知道它们会是什么。来自documentation

在全部或部分维度崩溃的情况下,输出几何可能是低到等维度几何的集合或低维度几何。

所以唯一的选择是返回一个通用几何。

但是,如果您确信这不会发生,您可以使用强制转换(或事后 ALTER 语句)强制它:

CREATE TABLE tmp2 AS 
  SELECT 
    ST_MakeValid(the_geom)::geometry(MultiPolygon, 4326) AS the_geom_valid
  FROM tmp1;

【讨论】:

  • 做到了!在这种情况下,我绝对愿意承担误判的风险。
猜你喜欢
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2020-07-31
相关资源
最近更新 更多