簡體   English   中英

為什么 ST_MakeValid() 會從已定義的幾何圖形中去除 SRID?

[英]Why does ST_MakeValid() strip SRID from already-defined geometries?

我正在嘗試在一系列大部分同心等距多面體上使用 PostGIS ST_MakeValid() function。 . .

在此處輸入圖像描述

. . . 它們是用明確的幾何類型和 SRID 定義的(雖然它們可能不是完全有效,但仍然足夠有效,可以在 QGIS 中呈現,如上所示):

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

不幸的是,當我使用ST_MakeValid() function 來創建新表時,它正在剝離 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() 可以返回多種類型中的任何一種,但無法提前知道它們會是什么。 文檔中:

在全部或部分維度崩潰的情況下,output 幾何可能是較低到等維度幾何的集合或較低維度的幾何。

所以唯一的選擇是返回一個通用幾何。

但是,如果您確信這不會發生,您可以使用強制轉換(或事后 ALTER 語句)強制它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM