【问题标题】:Using geometry in PL\pgSQL functions?在 PL\pgSQL 函数中使用几何?
【发布时间】:2016-07-07 03:44:31
【问题描述】:

我正在尝试在 PL\pgSQL 过程语言中创建两个几何数据类型的函数,例如多点和多行字符串。我想为所有点选择 30 米距离内的所有线。这是我尝试过的:

Create OR Replace Function get_streets(bar.geom geometry foo.geom geometry)
Returns geometry AS $$
BEGIN
  IF ST_DWithin(bar.geom, foo.geom, 30.0) Then
    Return foo.geom;
  ELSE
    Return null;
  END IF
  Return foo.geom;
END;
$$ Language plpgsql;

由于几何数据类型,该函数返回错误。在 plpgsql 函数中使用/处理几何数据有什么建议吗?

【问题讨论】:

    标签: postgresql postgis plpgsql


    【解决方案1】:

    您的函数中有很多小的语法错误。有关工作功能,请参见以下版本:

    CREATE FUNCTION get_streets(g1 geometry, g2 geometry) RETURNS geometry AS $$
    BEGIN
      IF ST_DWithin(g1, g2, 30.0) THEN
        RETURN g2;
      END IF;
      RETURN NULL;
    END;
    $$ LANGUAGE plpgsql;
    

    最重要的是:不要对参数使用table.field 表示法。而是在调用函数时使用简单的名称并使用适当的字段:

    SELECT get_streets(bar.geom, foo.geom)
    FROM bar
    JOIN foo on ...
    

    顺便说一句,你可以完全不使用函数来获得相同的功能:

    SELECT foo.geom
    FROM foo
    JOIN bar ON ST_DWithin(bar.geom, foo.geom, 30)
    WHERE <other conditions>;
    

    【讨论】:

    • 非常感谢。我根据您的建议更正了语法,并且有效!是的,我知道直接查询的另一种方法。不过,我更感兴趣的是按照“plpgsql”的方式来做。也感谢您提供替代方法。
    猜你喜欢
    • 2017-05-13
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多