哪种数据类型应该是包含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;
答案 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中的特定内容,您可能会在以后出现混淆......