2016-03-01 160 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个数组对象,然后使用键来访问该对象的值,该键是语句中调用的第一个函数名称。