2011-12-08 22 views
2

我有兩個表src_pos和dest_pos。從plpgsql腳本中的行變量插入PostGIS對象(例如ST_GeomFromText)

src_pos存儲具有經度,緯度和高度的位置,而dest_pos存儲PosGIS幾何對象。

現在我想從src_pos移動一堆數據到dest_pos與以下plpgsql腳本。 但它失敗了,因爲row 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

發現了一個可能的解決方案 ST_GeomFromText( 'POINT(' || row_data.longitude || '' || row_data.latitude || '' || || row_data.altitude ')',4326) – elgcom

+2

你的解決方案很好... ST_GeomFromText從你給出的字符串中讀取,並且不會理解腳本其餘部分的變量。使用||構建出包含變量的ST_GeomFromText語句是您的解決方案 – Twelfth

回答

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; 
... 
1

在評論你給自己的解決方案:

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

這是一個非常好的解決方案。實際上,在某些情況下,我在postgresql的其他地方做了一些相似的事情。

事實是,每個PostgreSQL類型都可以表示爲文本。如果你願意操縱這些,你可以按照普通類型轉換系統不允許的方式在類型之間轉換。