【问题标题】:ST_SRID data type in PostgresPostgres 中的 ST_SRID 数据类型
【发布时间】:2015-07-17 23:35:42
【问题描述】:

什么数据类型应该是包含 ST_SRID 的变量?我有如下函数,需要使用像 srid := ST_SetSRID(ST_MakePoint(start_long, start_lat),4326); 这样的表达式。 'srid' 的数据类型应该是什么?我用整数、点等进行了测试。

create function ATest3(start_lat double precision, start_long double precision) returns setof int as $$
declare
  r record;
  srid ?????????????????????????????
begin
  srid := ST_SetSRID(ST_MakePoint(start_long, start_lat), 4326);

  for r in select DISTINCT journey_id, ST_DWithin(srid, geom, 2/111.325), break_id from journey_break_points loop
    return next r.break_id;
  end loop;
  return;
end;
$$ language plpgsql;

【问题讨论】:

    标签: postgresql postgis plpgsql


    【解决方案1】:

    当您在 PostGIS 或任何其他几何图形中提出一个点时,它会返回一个 geometry。这就是你的变量的类型。

    create function ATest3(start_lat double precision, start_long double precision) returns setof int as $$
    declare
      r   record;
      pnt geometry;
    begin
      pnt := ST_SetSRID(ST_MakePoint(start_long, start_lat), 4326);
    
      for r in select distinct journey_id, ST_DWithin(pnt, geom, 2/111.325), break_id
               from journey_break_points
        loop
          return next r.break_id;
        end loop;
      return;
    end;
    $$ language plpgsql;
    

    但是您可以通过一个简单的存储 SQL 函数大大简化和加快整个过程:

    create function ATest4(start_lat double precision, start_long double precision) returns setof int as $$
      select break_id
      from journey_break_points
      where ST_DWithin(ST_SetSRID(ST_MakePoint($2, $1), 4326), geom, 2/111.325);
    $$ language sql;
    

    在上面,ST_SetSRID()ST_MakePoint() 都被定义为IMMUTABLE,所以给定恒定输入它们总是产生相同的输出。查询优化器仅对 ($2, $1) 上的函数求值一次,并将该函数用于计算 ST_DWithin() 和列 geom 的表的所有行。

    【讨论】:

    • 第二个表达式将如何加速? ST_SetSRID(ST_MakePoint($2, $1), 4326) 需要为“journey_break_points”表中的每条记录计算。我认为初始化变量会减少 ST_DWithin 的负载。
    • ST_SetSRID(ST_MakePoint($2,$1), 4326) 实际上只执行一次。 PostgreSQL 足够聪明,可以将其优化为一次调用。查看更新的答案。
    • 感谢您的详细信息!
    • @prasadkatankot 如果这回答了您的问题,您应该通过勾选我的答案左侧投票按钮下的灰色复选标记来接受它。这就是 SO 跟踪问题的正确答案的方式,以帮助其他人寻找与您面临的相同问题的解决方案。
    【解决方案2】:

    documentation,st_setsrid 返回类型geometry

    概要

    geometry ST_SetSRID(geometry geom, integer srid);

    说明

    将几何图形上的 SRID 设置为特定的整数值。有用的 为查询构建边界框。

    那么,你的台词:

    srid := ST_SetSRID(ST_MakePoint(start_long, start_lat),4326);
    

    正在为空间参考系统 4326 中的变量 srid 分配 geometry

    有一个函数 st_srid,但它做了一些不同的事情:

    概要

    整数 ST_SRID(几何 g1);

    说明

    将 ST_Geometry 的空间参考标识符返回为 在 spatial_ref_sys 表中定义。第 4.3.1 节,“SPATIAL_REF_SYS 表和空间参考系统”

    如果您只在一个语句中使用您的变量,我很想不要打扰该变量,只需将该语句放在您的选择查询中。如果您想坚持使用该变量,我建议您使用不同的名称(例如“startpoint_geometry”),因为“srid”表示 PostGIS 中的特定内容,您以后可能会混淆......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-09
      • 2017-09-27
      • 1970-01-01
      • 2012-11-20
      • 2016-07-19
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多