【发布时间】: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