【问题标题】:Calc distance Between two tables计算两个表之间的距离
【发布时间】:2021-05-15 06:56:38
【问题描述】:

我的 PostgreSQL 数据库触发器有问题。

我正在尝试使用 PostGIS 工具计算两个地理点之间的距离。 这两个点在不同的表中,这两个表之间的 KEY 是site_id 列。

sites 表结构为:

CREATE TABLE sites(
  site_id INT,
  site_name text,
  latitude float ( 6 ),
  longitude float ( 6 ),
  geom geometry

);

dots 表结构为:

CREATE TABLE dots(
  dot_id INT,
  site_id INT,
  latitude float ( 6 ),
  longitude float ( 6 ),
  rsrp float ( 6 ),
  dist INT,
  project_id INT,
  dist_from_site INT,
  geom geometry,
  dist_from_ref INT;
);

目标是制作一个触发器,在添加新点时自动计算距离。

我创建的触发器是:

CREATE TRIGGER dots_insert_site_dist_trigger
  AFTER UPDATE OF "geom"
  ON "dots"
  FOR EACH ROW
  EXECUTE PROCEDURE dots_insert_site_dist_update();``

函数本身:

  RETURNS trigger 
  AS
$$
BEGIN
        UPDATE dots SET dist_from_site =
  (SELECT ROUND(100*ST_Distance(NEW.geom, sites.geom))
  FROM
  dots,
  sites
  WHERE sites.site_id = NEW.site_id);
  RETURN NEW;
END;
$$
 LANGUAGE 'plpgsql';

错误:

错误:用作表达式的子查询返回多行 上下文:SQL 语句“更新点 SET dist_from_site = (SELECT ROUND(100*ST_Distance(NEW.geom,sites.geom)) 从 点, 网站 WHERE sites.site_id = NEW.site_id)" PL/pgSQL 函数 dots_insert_site_dist_update() SQL 语句第 3 行

站点表:

点表:

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    乍一看,您似乎错过了子查询中的连接条件

    SELECT ROUND(100*ST_Distance(NEW.geom, sites.geom))
    FROM  dots
    INNER JOIN sites on dots site_id = sites.site_id
    WHERE sites.site_id = NEW.site_id
    

    这应该生成一个笛卡尔积(表之间的 m x n 行.. 作为建议,您应该避免使用基于逗号分隔表名称和 where 条件的旧连接语法,并使用带有 on 子句的显式连接语法

    您可以尝试将查询用作更新的子查询

      UPDATE dots 
      SET dist_from_site = t.my_dist
      FROM (
          SELECT dots.site_id, ROUND(100*ST_Distance(dots.geom, sites.geom)) my_dist
          FROM  dots 
          INNER JOIN sites on dots.site_id = sites.site_id 
          WHERE sites.site_id = dots.site_id
      ) t 
      WHERE dots.site_id = t.site_id
    

    【讨论】:

    • 我使用了这个代码:SELECT ROUND(100*ST_Distance(dots.geom, sites.geom)) FROM dots INNER JOIN sites on dots.site_id = sites.site_id WHERE sites.site_id = dots.site_id; 我得到了第一个距离,但是我如何将它插入到正确的 collum 中?
    • 我需要将结果插入到每一行的 dist_from_site 中。
    • 可能我需要循环行并插入每一行?
    • 稍等一下,我试图理解您的评论..
    • 有错误>column t.my_dist 不存在
    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 2021-01-14
    • 2010-10-30
    • 1970-01-01
    • 2018-06-11
    • 2020-02-12
    相关资源
    最近更新 更多