Postgres中的ST_SRID数据类型

时间:2015-05-07 11:55:11

标签: postgresql postgis plpgsql

哪种数据类型应该是包含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;

2 个答案:

答案 0 :(得分: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的表的所有行。

答案 1 :(得分:0)

documentation开始,st_setsrid返回类型geometry

  

<强>概要

     

geometry ST_SetSRID(geometry geom,integer srid);

     

<强>描述

     

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

所以,你的行:

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

geometry分配给空间参考系统4326中的变量srid。

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

  

<强>概要

     

整数ST_SRID(几何g1);

     

<强>描述

     

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

如果你只在一个语句中使用你的变量,我很想不去理解变量,只需将语句放在你的select查询中。如果你想坚持使用变量,我建议使用不同的名称(例如&#39; startpoint_geometry&#39;),因为&#34; srid&#34;是指PostGIS中的特定内容,您可能会在以后出现混淆......