用于计算轴承的PLPGSQL函数

用于计算轴承的PLPGSQL函数,sql,gis,postgis,plpgsql,postgresql-9.1,Sql,Gis,Postgis,Plpgsql,Postgresql 9.1,基本上,我无法理解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,

基本上,我无法理解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();
并得到了预期的结果。 基本上,问题在于理解如何正确访问行数据,以便读取当前点和下一点

在上面的例子中,我遇到了各种各样的问题,比如如何调用ST_X etc SQL函数,并尝试执行select语句,但错误与数据类型有关


任何见解/帮助都将不胜感激。

在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;
根据排序顺序,从下一行引用列

这可以进一步简化为单个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页或更高版本中引用

允许SQL语言函数按名称引用参数(Matthew 德雷珀)


现在还不清楚wgs_geom在您的过程中应该指的是什么,我很确定rowtype应该是轴承_类型。不管怎样,抛开这一点,您完全可以不用使用plpgsql来完成所有这些。我很乐意写出来,除非你有一些要求在一个循环中完成这一切。谢谢你的回答,让它按照我的要求基于你的plpgsql解决方案工作,第二个选项是在“没有名为_bgeom的列”上给我一个错误。@Diplonics:对不起,这是第9.1页的限制。由于第9.2页,您也可以在SQL函数的函数体中引用参数名称。相应地调整。