2016-03-01 310 views
0

我想寫一個plv8函數,它返回一個代表UTM區域值的整數。該功能利用PostGIS功能。這裏是(沒有運作)的想法:從plv8訪問PostGIS函數

CREATE OR REPLACE FUNCTION utm_z(geometry) 
    RETURNS integer AS 
    $$ 
    var geom_geog = st_transform($1, 4326); 
    var utm_zone = Math.floor((st_x(geom_geog)+180)/6)+1; 
    return utm_zone; 
    $$ LANGUAGE plv8; 

當調用這個函數,我得到

ERROR: ReferenceError: st_transform is not defined

我怎麼能夠從裏面plv8訪問這些PostGIS的功能呢?

編輯: PostGIS在此DB中安裝並正常運行。 ​​

回答

0

首先,你需要安裝POSTGIS到Postgres的

http://postgis.net/install/

然後PostGIS的擴展添加到您的分貝

enter image description here

+0

謝謝你,我已經在這個數據庫中安裝了PostGIS。用截圖更新了問題。 – Joebocop

+0

看起來像是plv8的問題。您是否嘗試使用'LANGUAGE plpgsql'創建相同的函數來測試一切正常? –

+0

是的,我實際上試圖將現有plpgsql的函數轉換爲這個新的plv8函數。 plpgsql函數可以正常工作,但我不清楚如何從plv8塊中訪問PostGIS函數。 – Joebocop

1

下面是函數的工作版本。在PLV8中肯定有更好的方法來做到這一點...?

CREATE OR REPLACE FUNCTION utm_z(geometry) RETURNS integer AS $$ var geom_geog_wkt = plv8.execute("SELECT st_transform($1::geometry, 4326);", $1)[0].st_transform; var utm_zone = Math.floor( plv8.execute( "SELECT (st_x($1::geometry)+180)/6+1 AS \"utm_z\"", geom_geog_wkt )[0].utm_z ); return utm_zone; $$ LANGUAGE plv8;

運行plv8.execute()返回對象的數組。在上面的函數中,我抓住第0個數組對象,然後使用鍵來訪問該對象的值,該鍵是語句中調用的第一個函數名稱。