我正在尝试在一系列大多数同心等距的多边形上使用 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 的情况下创建有效的几何图形? 最佳答案
正在保留 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;
关于postgresql - 为什么 ST_MakeValid() 从已定义的几何图形中剥离 SRID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58666130/