Почему ST_MakeValid () удаляет SRID из уже определенных геометрий? - PullRequest
3 голосов
/ 02 ноября 2019

Я пытаюсь использовать функцию PostGIS ST_MakeValid() для серии в основном концентричных изодистантных мультиполигонов. ,.

enter image description here

. ,,которые определены с чистым типом геометрии и 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() - как я могу создать правильную геометрию без потери типа geom и SRID?

1 Ответ

3 голосов
/ 02 ноября 2019

SRID равен и сохраняется. Например, попробуйте это:

SELECT st_srid(the_geom_buffer) FROM tmp2 LIMIT 1;

, и вы должны увидеть что-то вроде:

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

Причина этого в том, что ST_MakeValid () может возвращать любой из нескольких типов, ноне могу знать, что они будут опережать время. Из документации :

В случае полных или частичных разложений размеров выходная геометрия может быть набором геометрий с меньшим или равным размером или геометрией с меньшим размером.

Таким образом, единственный вариант - вернуть универсальную геометрию.

Однако, если вы уверены, что этого не произойдет, вы можете форсировать ее, используя приведение (или инструкцию ALTERpost hoc):

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