我尝试在PostgreSQL(v9.5.6)+ PostGIS(v2.3.2)数据库上运行以下脚本:
DO $$
DECLARE
runway_area varchar;
runway_area_transformed varchar;
BEGIN
-- calculate runway area from centerline + width + strip --> buffer comes in handy here
SELECT ST_Translate(
ST_Force3D(
ST_Buffer(
ST_GeomFromText(
'LINESTRING(16.553 48.122, 16.575 48.109)'
),
0.0006,
'endcap=square'
)
),
0,
0,
180
)
INTO runway_area;
RAISE NOTICE 'RUNWAY AREA: %', ST_AsGeoJSON(runway_area);
SELECT ST_Extrude(ST_GeomFromText(ST_AsText(runway_area)), 0,0,50)
INTO runway_area_transformed;
RAISE NOTICE 'RUNWAY AREA TRANSFORMED: %', ST_AsGeoJSON(runway_area_transformed);
END
$$ LANGUAGE plpgsql;
然后我收到以下错误:
ERROR: function st_extrude(geometry, integer, integer, integer) does not exist
LINE 1: SELECT ST_Extrude(ST_GeomFromText(ST_AsText(runway_area)), 0...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
QUERY: SELECT ST_Extrude(ST_GeomFromText(ST_AsText(runway_area)), 0,0,50)
CONTEXT: PL/pgSQL function inline_code_block line 24 at SQL statement
********** Error **********
ERROR: function st_extrude(geometry, integer, integer, integer) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Context: PL/pgSQL function inline_code_block line 24 at SQL statement
我很快发现函数st_extrude(geometry, integer, integer, integer)
在我的数据库中不存在(我试图在Schemas> public> Functions中查找它,但它不存在)。
然后我根据这个(https://hub.docker.com/r/mdillon/postgis/)图像(Postgres 9上的一些PostGIS 2.3)启动了一个Docker容器,但我也找不到它的功能。
从PostGIS文档中可以看出,ST_Extrude
函数应该从v2.1.0开始可用(参见https://postgis.net/docs/ST_Extrude.html)。我在这里错过了一些非常基本的问题,为什么我在设置中没有这个功能?
答案 0 :(得分:2)
所以我弄清楚问题是什么:我错过了postgis_sfcgal
扩展名。我运行CREATE EXTENSION postgis_sfcgal;
并在我的数据库中成功安装了扩展程序。然后我就可以运行上面的脚本了!