我有两个表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';
答案 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;
...