基本上我无法理解plpgsql的语法,并希望通过以下工作获得一些帮助。 我有一张包含1000个wgs84点的表格。以下SQL将在此表的边界框内检索一组点:
SELECT id, ST_X(wgs_geom), ST_Y(wgs_geom), ST_Z(wgs_geom)
FROM points_table
INNER JOIN
(SELECT ST_Transform(ST_GeomFromText('POLYGON((-1.73576102027 1.5059743629,
-1.73591122397 51.5061067655,-1.73548743495 51.5062838333,-1.73533186682
1.5061514313,-1.73576102027 51.5059743629))', 4326, 27700)
) AS bgeom
) AS t2
ON ST_Within(local_geom, t2.bgeom)
我需要做的是在结果中添加方位/方位角列,以描述返回数据集中每个点的方位。 因此,我尝试实现的方法是构建一个plpgsql函数,该函数可以按上述方式选择数据并计算循环中每组点之间的方位。 然而,我在plpgsql函数中理解基本数据访问和处理的努力正在惨败。
我尝试创建的函数的当前版本的示例如下:
CREATE TYPE bearing_type AS (x numeric, y numeric, z numeric, bearing numeric);
--DROP FUNCTION IF EXISTS get_bearings_from_points();
CREATE OR REPLACE FUNCTION get_bearings_from_points()
RETURNS SETOF bearing_type AS
$BODY$
DECLARE
rowdata points_table%rowtype;
returndata bearing_type;
BEGIN
FOR rowdata IN
SELECT nav_id, wgs_geom
FROM points_table INNER JOIN
(SELECT ST_Transform(ST_GeomFromText('POLYGON((-1.73576102027
3.5059743629,-1.73591122397 53.5061067655,-1.73548743495
53.5062838333,-1.73533186682 53.5061514313,-1.73576102027
53.5059743629))', 4326), 27700)
AS bgeom)
AS t2 ON ST_Within(local_geom, t2.bgeom)
LOOP
returndata.x := ST_X(rowdata.wgs_geom);
returndata.y := ST_Y(rowdata.wgs_geom);
returndata.z := ST_Z(rowdata.wgs_geom);
returndata.bearing := ST_Azimuth(<current_point> , <next_point>)
RETURN NEXT returndata;
END LOOP;
RETURN;
END
$BODY$
LANGUAGE plpgsql;
我想按如下方式调用此函数:
SELECT get_bearings_from_points();
并获得所需的结果。 基本上问题是理解如何正确访问rowdata,以便我可以读取当前和下一个点。
在上面的示例中,我遇到了各种问题,如何调用ST_X等SQL函数,并尝试了具有错误的几何数据类型的EXECUTE select语句。
非常感谢任何见解/帮助。
答案 0 :(得分:2)
在PL / pgSQL中,尽可能在基本SQL查询中尽可能地做到最有效。你可以大大简化。
我没有从您的问题中获得排序顺序的定义,并留下???
为您填写:
CREATE OR REPLACE FUNCTION get_bearings_from_points(_bgeom geometry)
RETURNS TABLE (x numeric, y numeric, z numeric, bearing numeric) AS
$func$
BEGIN
FOR x, y, z, bearing IN
SELECT ST_X(t.wgs_geom), ST_Y(t.wgs_geom), ST_Z(t.wgs_geom)
, ST_Azimuth(t.wgs_geom, lead(t.wgs_geom) OVER (ORDER BY ???))
FROM points_table t
WHERE ST_Within(t.local_geom, _bgeom)
ORDER BY ???
LOOP
RETURN NEXT;
END LOOP;
END
$func$ LANGUAGE plpgsql;
window function lead()
根据排序顺序引用下一行的列。
这可以进一步简化为单个SQL查询 - 可能包含在SQL函数中:
CREATE OR REPLACE FUNCTION get_bearings_from_points(_bgeom geometry)
RETURNS TABLE (x numeric, y numeric, z numeric, bearing numeric) AS
$func$
SELECT ST_X(t.wgs_geom), ST_Y(t.wgs_geom), ST_Z(t.wgs_geom)
, ST_Azimuth(t.wgs_geom, lead(t.wgs_geom) OVER (ORDER BY ???))
FROM points_table t
WHERE ST_Within(t.local_geom, $1) -- use numbers in pg 9.1 or older
ORDER BY ???
$func$ LANGUAGE sql;
参数名称可以在第9.2页或更高版本中引用。 Per release notes of pg 9.2:
允许SQL语言函数按名称引用参数(Matthew 带式输送器)