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