Перепроектировать все геометрии в таблице PostGIS?


39

Я создал пространственную таблицу с SRID: 4326. Теперь я хочу изменить общую проекцию на SRID: 32644 в новую таблицу. Старая таблица должна остаться без изменений.


Я добавляю это как комментарий вместо ответа, потому что должен быть более элегантный метод. Но вы можете скопировать таблицу и выполнить: UPDATE <таблица> SET the_geom = ST_Transform (the_geom, 32644); (Предполагая, что у вас есть полная запись в вашемpace_ref_sys для 32644.)
— L_Holcombe

я пытался, но igot это ошибка обновления abc SET geom = ST_Transform (geom, 32644); новая строка для отношения «abc» нарушает проверочное ограничение «forcece_srid_geom»
— Сатья Чандра

1
отбросьте это ограничение. и его исправили
— симплексио

Ответы:


62

Если вы используете PostGIS 2.0+, вы можете перейти:

ALTER TABLE mytable 
  ALTER COLUMN geom 
  TYPE Geometry(Point, 32644) 
  USING ST_Transform(geom, 32644);

Отметив, конечно, что вы должны заменить «Точка» фактическим типом геометрии вашей геометрии.
— Пол Рэмси

Есть ли простой способ заменить Pointна The same geometry type as it was?
— Mohayemin

Нет, боюсь, что нет.
— Пол Рэмси

18
CREATE TABLE new_table AS 
  SELECT ST_Transform(the_geom,32644) AS the_geom 
  FROM original_table;

В вашей пространственной таблице должно быть поле целочисленного идентификатора, чтобы добавить его в QGIS.


Я попытался, как указано выше, и все получилось, но я не могу экспортировать результирующую таблицу в qgis / udig, даже если она появляется в базе данных?
— Сатья Чандра

В чем ваша проблема?
— Владимир

2
Если вы используете версию PostGIS, более раннюю, чем версия 2.0, вам нужно добавить запись в вашу таблицу Geometry_Columns, указывающую на вашу новую таблицу.
— HeyOverThere

4

следуйте по этому пути:

  1. CREATE TABLE 'new_table' AS SELECT * FROM 'old_table';
  2. ALTER TABLE new_table DROP CONSTRAINT enforce_srid_the_geom;
  3. ALTER TABLE new_table DROP CONSTRAINT enforce_geotype_the_geom;
  4. UPDATE new_table SET the_geom = ST_SetSRID(the_geom, new_srid);
  5. ALTER TABLE new_table ADD CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = (new_srid));
  6. ALTER TABLE new_table ADD CONSTRAINT enforce_geotype_geom CHECK ((geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL);
  7. Вот и все!

Если вы не можете создать новую таблицу в первой строке, пожалуйста, попробуйте 2. и 3. Сначала создайте таблицу с номером 1.

я надеюсь, что это поможет вам ...


3
Это решение не перепроектировать геометрии. Если геометрии хранятся с использованием других SRID, данные будут несогласованны после ограничений изменений. Вам нужно использовать st_trasnform.
— Angelcervera
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.