重新投影PostGIS表中的所有几何?


39

我用SRID:4326创建了一个空间表。现在,我想将总投影更改为SRID:32644到新表中。旧表应保持不变。


我将其添加为注释而不是答案,因为应该有一个更优雅的方法。但是您可以复制表,然后运行:UPDATE <表> SET the_geom = ST_Transform(the_geom,32644); (假设您在32644中的“ space_ref_sys”中具有完整的条目。)
L_Holcombe

我尝试但忘记了此错误更新abc SET geom = ST_Transform(geom,32644); 关系“ abc”的新行违反了检查约束“ enforce_srid_geom”
Satya Chandra

1
取消该约束。及其固定的
simplexio,2012年

Answers:


62

如果您使用的是PostGIS 2.0+,则可以:

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

当然,应注意将“点”替换为几何的实际几何类型。
保罗·拉姆西

有一个简单的方法来代替PointThe same geometry type as it was
Mohayemin 2015年

不,怕不。
保罗·拉姆西

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

您的空间表中应该有一个整数ID字段,以便将其添加到QGIS。


我如上所述尝试并成功,但即使将其显示在数据库中,也无法将结果表导出到qgis / udig中?
萨蒂亚·钱德拉

您的确切问题是什么?
弗拉基米尔

2
如果您使用的PostGIS版本早于2.0版,则需要在Geometry_Columns表中添加一条指向新表的记录。
HeyOverThere 2012年

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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.