Перепроектировать все геометрии в таблице 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.