从plpgsql脚本中的行变量插入PostGIS对象(例如ST_GeomFromText)

时间:2011-12-08 15:38:50

标签: sql postgresql postgis plpgsql

我有两个表src_pos和dest_pos。

src_pos存储经度,纬度和海拔高度的位置,而dest_pos存储PosGIS Geometry对象。

现在我想用以下plpgsql脚本将一堆数据从src_pos移动到dest_pos。 但它失败了,因为行vaiable(例如row_data.longitude)无法正确解释。 我怎样才能克服这个问题!?

--create language 'plpgsql';
drop function createPosition();
create function createPosition() returns integer AS 
$$
  DECLARE 
    updated INTEGER = 0;
    row_data src_pos%ROWTYPE;       
  BEGIN 
    FOR row_data IN SELECT * FROM src_pos
    LOOP
        INSERT INTO dest_pos (coord) VALUES (ST_GeomFromText('POINT(row_data.longitude row_data.latitude row_data.altitude)', 4326));
        updated := updated + 1;
    END LOOP;
    RETURN updated;
  END;
$$
LANGUAGE 'plpgsql';

2 个答案:

答案 0 :(得分:1)

在评论中,您提供了自己的解决方案:

 ST_GeomFromText('POINT(' || row_data.longitude || ' ' || row_data.latitude || 
     ' ' || row_data.altitude || ')', 4326)

这是一个非常好的解决方案。实际上我在postgresql的其他方面做了一些相对类似的事情。

事实是每个PostgreSQL类型都可以表示为文本。如果您愿意操纵这些,您可以采用普通类型转换系统不允许的方式在类型之间进行转换。

答案 1 :(得分:1)

更好的是,使用ST_MakePoint直接创建几何对象。这不仅比ST_GeomFromText快,而且它是无损的,因为您不需要将数字转换为文本到数字。

...
WITH result AS (
  INSERT INTO dest_pos (coord)
  SELECT ST_SetSRID(ST_MakePoint(longitude, latitude, altitude), 4326)
  FROM src_pos
  RETURNING 1
)
SELECT count(*) INTO updated FROM result;
RETURN updated;
...