说明:
遇到个需求:需要查询事发点周围100米内的人和车,这个通过PostGIS的ST_DWithin函数很容易实现。
但是在实现过程中,遇到了三个不同的问题,在此总结一下。
解决方案:
方案一:
这种方式适用于PostGIS库,在库里直接写SQL实现,入参直接可以用PostGIS的geometry格式。
--调用方式(参数:表名,坐标系id,表主键ID,缓冲区半径,中心点)
select * from enc_buffer_bygeom('fm',3857,'gid',100,'0101000020110F0000F2D24D3662CA6841480C02EB46545241');
函数如下:
-- FUNCTION: public.func_buffer_bygeom(character varying, integer, character varying, double precision, character varying)
-- DROP FUNCTION public.func_buffer_bygeom(character varying, integer, character varying, double precision, character varying);
CREATE OR REPLACE FUNCTION public.func_buffer_bygeom(
tb character varying,
qsrid integer,
qid character varying,
qbuffer double precision,
qgeom character varying)
RETURNS TABLE(v_gid integer, v_res geometry, v_dis double precision)
LANGUAGE 'plpgsql'
COST 100
VOLATILE STRICT
ROWS 1000
AS $BODY$
declare
v_gid integer; --主键
v_res geometry; --要素
v_dis double precision; --与目标距离
begin
RETURN QUERY EXECUTE
'select '||qId||',geom, ST_Distance(geom,'''||qGeom||''') from ' ||tb|| ' where ST_DWithin(geom,'''||qGeom||''','||qBuffer||')' ;
end;