¶Ô±ÈÐÂÎļþ |
| | |
| | | ----------------------------------------------------------------------------------------------------- 01.GUIDçæå½æ° |
| | | create or replace function new_guid() |
| | | returns "pg_catalog"."varchar" as $body$ |
| | | declare |
| | | v_seed_value varchar(32); |
| | | begin |
| | | select md5(inet_client_addr()::varchar || timeofday() || inet_server_addr()::varchar || to_hex(inet_client_port())) |
| | | into v_seed_value; |
| | | |
| | | return (substr(v_seed_value,1,8) || '-' || |
| | | substr(v_seed_value,9,4) || '-' || |
| | | substr(v_seed_value,13,4) || '-' || |
| | | substr(v_seed_value,17,4) || '-' || |
| | | substr(v_seed_value,21,12)); |
| | | end; |
| | | $body$ language 'plpgsql' volatile security definer; |
| | | |
| | | select new_guid(); |
| | | ----------------------------------------------------------------------------------------------------- 02.é彿¥è¯¢å½æ° |
| | | -- drop function rec_query_dep(id integer, tab varchar); |
| | | create or replace function fn_rec_query(id integer, tab varchar) |
| | | returns varchar as $$ |
| | | declare |
| | | str varchar = ''; |
| | | rec varchar = ''; |
| | | begin |
| | | if (id is null or tab is null) then |
| | | return ''; |
| | | end if; |
| | | |
| | | for rec in execute 'with recursive rs as(' || |
| | | 'select id,pid,name from lf.sys_' || tab || ' where id=' || id || |
| | | ' union select a.id,a.pid,a.name from lf.sys_' || tab || ' a, rs b where a.id=b.pid '|| |
| | | ') select name from rs order by id' |
| | | loop |
| | | str = str || '\' || rec; |
| | | end loop; |
| | | |
| | | if (char_length(str) > 1) then |
| | | str = substring(str, 2); |
| | | end if; |
| | | |
| | | return str; |
| | | end; |
| | | $$ language plpgsql; |
| | | |
| | | select fn_rec_query(1, 'dep'); |
| | | ----------------------------------------------------------------------------------------------------- 03.æ¥è¯¢ç¨æ·å |
| | | -- execute format('select uname from lf.sys_user where id = %s', id) into str; |
| | | -- drop function fn_uname(id integer); |
| | | create or replace function fn_uname(id integer) |
| | | returns varchar as $$ |
| | | declare |
| | | str varchar; |
| | | begin |
| | | if (id is null) then |
| | | return null; |
| | | end if; |
| | | |
| | | execute 'select uname from lf.sys_user where id = ' || id into str; |
| | | |
| | | return str; |
| | | end; |
| | | $$ language plpgsql; |
| | | |
| | | select fn_uname(1); |
| | | ----------------------------------------------------------------------------------------------------- 04.æ¥è¯¢çæ¬å |
| | | -- drop function fn_ver(id integer); |
| | | create or replace function fn_ver(id integer) |
| | | returns varchar as $$ |
| | | declare |
| | | str varchar; |
| | | begin |
| | | if (id is null) then |
| | | return null; |
| | | end if; |
| | | |
| | | execute 'select name from lf.sys_ver where id = ' || id into str; |
| | | |
| | | return str; |
| | | end; |
| | | $$ language plpgsql; |
| | | |
| | | select fn_ver(0); |
| | | ----------------------------------------------------------------------------------------------------- 05.é彿¥è¯¢IDæ°ç» |
| | | -- drop function fn_rec_array(id integer, tab varchar); |
| | | create or replace function fn_rec_array(id integer, tab varchar) |
| | | returns integer[] as $$ |
| | | declare |
| | | ids integer[]; |
| | | sid integer; |
| | | begin |
| | | for sid in execute 'with recursive rs as(' || |
| | | 'select id,pid from lf.sys_' || tab || ' where id=' || id || |
| | | ' union select a.id,a.pid from lf.sys_' || tab || ' a, rs b where a.pid=b.id '|| |
| | | ') select id from rs order by id' |
| | | loop |
| | | select array_append(ids, sid) into ids; |
| | | end loop; |
| | | |
| | | return ids; |
| | | end; |
| | | $$ language plpgsql; |
| | | |
| | | select fn_rec_array(1, 'dep'); |
| | | select fn_rec_array(10, 'dir'); |
| | | ----------------------------------------------------------------------------------------------------- 06.è·åå®ä½å |
| | | /*create or replace function fn_get_entity(tab varchar) |
| | | returns varchar as $$ |
| | | declare |
| | | str varchar; |
| | | rs varchar = ''; |
| | | begin |
| | | foreach str in array (select string_to_array(tab, '_')) loop |
| | | if (length(rs) = 0 or length(str) = 1) then |
| | | rs = rs || str; |
| | | else |
| | | rs = rs || initcap(str); |
| | | end if; |
| | | end loop; |
| | | |
| | | return rs; |
| | | end; |
| | | $$ language plpgsql;*/ |
| | | |
| | | create or replace function fn_get_entity(tab varchar) |
| | | returns varchar as $$ |
| | | declare |
| | | begin |
| | | if (tab is null) then |
| | | return ''; |
| | | end if; |
| | | |
| | | return replace(tab, '_', ''); |
| | | end; |
| | | $$ language plpgsql; |
| | | |
| | | select fn_get_entity('dlg_25w_boua_s'); |
| | | ----------------------------------------------------------------------------------------------------- 07.FMEæ¥å¿è§¦åå¨ * |
| | | create or replace function fn_meta_insert() returns trigger as $$ |
| | | begin |
| | | update lf.sys_meta set tab = new.pg_ns || '.' || new.tcdm, layer = new.tcmc, rows = new.count where eventid = new.parentid; |
| | | |
| | | return new; |
| | | end; |
| | | $$ language plpgsql; |
| | | |
| | | create or replace trigger fme_log_trigger after insert on lf.sys_fme_log |
| | | for each row execute procedure fn_meta_insert(); |
| | | |
| | | select * from lf.sys_meta; |
| | | ----------------------------------------------------------------------------------------------------- 08.è·¯å¾åæ |
| | | -- å é¤å·²åå¨ç彿° |
| | | drop function pgr_fromAtoB(varchar, double precision, double precision, double precision, double precision); |
| | | |
| | | -- åºäºä»»æä¸¤ç¹ä¹é´çæçè·¯å¾åæ |
| | | create or replace function pgr_fromAtoB ( |
| | | in tbl varchar, -- æ°æ®åºè¡¨å |
| | | in x1 double precision, -- èµ·ç¹xåæ |
| | | in y1 double precision, -- èµ·ç¹yåæ |
| | | in x2 double precision, -- ç»ç¹xåæ |
| | | in y2 double precision, -- ç»ç¹yåæ |
| | | out seq integer, -- éè·¯åºå· |
| | | out gid integer, |
| | | out name text, -- éè·¯å |
| | | out heading double precision, |
| | | out cost double precision, -- æ¶è |
| | | out geom geometry -- éè·¯å ä½éå |
| | | ) returns setof record as $body$ |
| | | declare |
| | | sql text; |
| | | rec record; |
| | | source integer; |
| | | target integer; |
| | | point integer; |
| | | begin |
| | | -- æ¥è¯¢è·ç¦»åºåç¹æè¿çéè·¯èç¹ |
| | | execute 'select id::integer from ' || quote_ident(tbl) |
| | | || '_vertices_pgr order by the_geom <-> st_geometryfromtext(''point(' |
| | | || x1 || ' ' || y1 || ')'',4490) limit 1' into rec; |
| | | source := rec.id; |
| | | |
| | | -- æ¥è¯¢è·ç¦»ç®çå°æè¿çéè·¯èç¹ |
| | | execute 'select id::integer from ' || quote_ident(tbl) |
| | | || '_vertices_pgr order by the_geom <-> st_geometryfromtext(''point(' |
| | | || x2 || ' ' || y2 || ')'',4490) limit 1' into rec; |
| | | target := rec.id; |
| | | |
| | | -- æçè·¯å¾æ¥è¯¢ |
| | | seq := 0; |
| | | sql := 'select gid, geom, node as name, cost, source, target, st_reverse(geom) as flip_geom from ' |
| | | || 'pgr_dijkstra(''select gid as id,source::integer,target::integer,' |
| | | || 'length::float as cost from ' |
| | | || quote_ident(tbl) || ''', ' |
| | | || source || ', ' || target |
| | | || ' ,false) as di, ' |
| | | || quote_ident(tbl) || ' where di.edge = gid order by seq'; |
| | | |
| | | -- remember start point |
| | | point := source; |
| | | for rec in execute sql |
| | | loop |
| | | -- flip geometry (if required) |
| | | if ( point != rec.source ) then |
| | | rec.geom := rec.flip_geom; |
| | | point := rec.source; |
| | | else |
| | | point := rec.target; |
| | | end if; |
| | | |
| | | -- calculate heading (simplified) |
| | | execute 'select degrees( st_azimuth(st_startpoint(''' || rec.geom::text |
| | | || '''),st_endpoint(''' || rec.geom::text || ''') ) )' into heading; |
| | | |
| | | -- return record |
| | | seq := seq + 1; |
| | | gid := rec.gid; |
| | | name := rec.name; |
| | | cost := rec.cost; |
| | | geom := rec.geom; |
| | | return next; |
| | | end loop; |
| | | return; |
| | | end; |
| | | $body$ language 'plpgsql' volatile strict; |
| | | |
| | | select ST_astext(ST_Union(geom)) as route from pgr_fromAtoB('lrdl'::text, 116.78999, 39.9468, 116.80458, 39.94758); |
| | | select st_astext(geom) route from pgr_fromAtoB('lrdl', 116.78999, 39.9468, 116.80458, 39.94758); |
| | | ----------------------------------------------------------------------------------------------------- |
¶Ô±ÈÐÂÎļþ |
| | |
| | | --1ï¼åå»ºæ°æ®è¡¨ï¼ |
| | | --æ·»å èµ·ç¹id |
| | | |
| | | ALTER TABLE public.lrdl ADD COLUMN source integer; |
| | | |
| | | --æ·»å ç»ç¹id |
| | | |
| | | ALTER TABLE public.lrdl ADD COLUMN target integer; |
| | | |
| | | --æ·»å éè·¯æéå¼ |
| | | |
| | | ALTER TABLE public.lrdl ADD COLUMN length double precision; |
| | | |
| | | --为sampledata表å建ææå¸å±ï¼å³ä¸ºsourceåtargetåæ®µèµå¼ |
| | | |
| | | SELECT pgr_createTopology('public.lrdl',0.0001, 'geom', 'gid'); |
| | | |
| | | --为sourceåtargetåæ®µåå»ºç´¢å¼ |
| | | |
| | | CREATE INDEX source_idx ON public.lrdl("source"); |
| | | |
| | | CREATE INDEX target_idx ON public.lrdl("target"); |
| | | |
| | | --为lengthèµå¼ |
| | | |
| | | update public.lrdl set length =st_length(geom); |
| | | |
| | | --为road_xblk表添å reverse_coståæ®µå¹¶ç¨lengthçå¼èµå¼ |
| | | |
| | | ALTER TABLE public.lrdl ADD COLUMN reverse_cost double precision; |
| | | |
| | | UPDATE public.lrdl SET reverse_cost =length; |
| | | |
| | | |
| | | |
| | | --2ï¼å建æçè·¯å¾å½æ°ï¼ |
| | | --å é¤å·²åå¨ç彿° |
| | | DROP FUNCTION pgr_fromAtoB(tbl varchar,startx float, starty float,endx float,endy float); |
| | | |
| | | --DROP FUNCTION pgr_fromAtoB(varchar, double precision, double precision |
| | | -- double precision, double precision); |
| | | --åºäºä»»æä¸¤ç¹ä¹é´çæçè·¯å¾åæ |
| | | CREATE OR REPLACE FUNCTION pgr_fromAtoB( |
| | | IN tbl varchar,--æ°æ®åºè¡¨å |
| | | IN x1 double precision,--èµ·ç¹xåæ |
| | | IN y1 double precision,--èµ·ç¹yåæ |
| | | IN x2 double precision,--ç»ç¹xåæ |
| | | IN y2 double precision,--ç»ç¹yåæ |
| | | OUT seq integer,--éè·¯åºå· |
| | | OUT gid integer, |
| | | OUT name text,--éè·¯å |
| | | OUT heading double precision, |
| | | OUT cost double precision,--æ¶è |
| | | OUT geom geometry--éè·¯å ä½éå |
| | | ) |
| | | RETURNS SETOF record AS |
| | | $BODY$ |
| | | DECLARE |
| | | sql text; |
| | | rec record; |
| | | source integer; |
| | | target integer; |
| | | point integer; |
| | | |
| | | BEGIN |
| | | -- æ¥è¯¢è·ç¦»åºåç¹æè¿çéè·¯èç¹ |
| | | EXECUTE 'SELECT id::integer FROM '|| quote_ident(tbl) ||'_vertices_pgr |
| | | ORDER BY the_geom <-> ST_GeometryFromText(''POINT(' |
| | | || x1 || ' ' || y1 || ')'',4490) LIMIT 1' INTO rec; |
| | | source := rec.id; |
| | | |
| | | -- æ¥è¯¢è·ç¦»ç®çå°æè¿çéè·¯èç¹ |
| | | EXECUTE 'SELECT id::integer FROM '|| quote_ident(tbl) ||'_vertices_pgr |
| | | ORDER BY the_geom <-> ST_GeometryFromText(''POINT(' |
| | | || x2 || ' ' || y2 || ')'',4490) LIMIT 1' INTO rec; |
| | | target := rec.id; |
| | | |
| | | -- æçè·¯å¾æ¥è¯¢ |
| | | seq := 0; |
| | | sql := 'SELECT gid, geom, node as name, cost, source, target, |
| | | ST_Reverse(geom) AS flip_geom FROM ' || |
| | | 'pgr_dijkstra(''SELECT gid as id, |
| | | source::integer,target::integer,' |
| | | || 'length::float AS cost FROM ' |
| | | || quote_ident(tbl) || ''', ' |
| | | || source || ', ' || target |
| | | || ' ,false) as di, ' |
| | | || quote_ident(tbl) || ' WHERE di.edge = gid ORDER BY seq'; |
| | | |
| | | |
| | | -- Remember start point |
| | | point := source; |
| | | |
| | | FOR rec IN EXECUTE sql |
| | | LOOP |
| | | -- Flip geometry (if required) |
| | | IF ( point != rec.source ) THEN |
| | | rec.geom := rec.flip_geom; |
| | | point := rec.source; |
| | | ELSE |
| | | point := rec.target; |
| | | END IF; |
| | | |
| | | -- Calculate heading (simplified) |
| | | EXECUTE 'SELECT degrees( ST_Azimuth( |
| | | ST_StartPoint(''' || rec.geom::text || '''), |
| | | ST_EndPoint(''' || rec.geom::text || ''') ) )' |
| | | INTO heading; |
| | | |
| | | -- Return record |
| | | seq := seq + 1; |
| | | gid := rec.gid; |
| | | name := rec.name; |
| | | cost := rec.cost; |
| | | geom := rec.geom; |
| | | RETURN NEXT; |
| | | END LOOP; |
| | | RETURN; |
| | | END; |
| | | $BODY$ |
| | | LANGUAGE 'plpgsql' VOLATILE STRICT; |
| | | |
| | | --3) å建èç¹è¡¨ï¼ |
| | | select pgr_createTopology('lrdl',0.1,source:='source',id:='gid',target:='target',the_geom:='geom',rows_where:='gid < 50000') |
| | | |
| | | |
| | | --4ï¼æµè¯ï¼ |
| | | --é便éä¸¤ä¸ªç¹æµè¯ä¸ä¸ï¼OKï¼å·²ç»è¿åäºè·¯å¾ç线段åºåã |
| | | |
| | | select * from pgr_fromatob('lrdl',116.78999,39.9468,116.80458,39.94758); |
| | | |
| | | --å 为æç»æä»¬éè¦å°æçè·¯å¾ä¼ å°æ¡é¢ç«¯æ¾ç¤ºï¼ä¸ºäºæ¹ä¾¿ï¼ä½¿ç¨ST_Unionå°è¿äºçº¿æ®µåå¹¶æä¸ä¸ªå®æ´ç线路ãä½¿ç¨æ¹æ³å¦ä¸ |
| | | select ST_Union(geom) as route from pgr_fromAtoB('lrdl'::text,116.78999,39.9468,116.80458,39.94758) ; |
| | | |
| | | --åå¹¶çè·¯å¾æä»¬çä¸åºæ¥æ¯ä»ä¹ï¼ä¸è¿å°ä»è½¬æwktå°±è½çè§£äºï¼ |
| | | |
| | | select ST_astext(ST_Union(geom)) as route from pgr_fromAtoB('lrdl'::text,116.78999,39.9468,116.80458,39.94758) ; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.lf.server.controller.show; |
| | | |
| | | import com.lf.server.annotation.SysLog; |
| | | import com.lf.server.controller.all.BaseController; |
| | | import com.lf.server.entity.all.ResponseMsg; |
| | | import com.lf.server.service.all.BaseQueryService; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiImplicitParam; |
| | | import io.swagger.annotations.ApiImplicitParams; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | /** |
| | | * 综åå±ç¤º |
| | | * @author WWW |
| | | */ |
| | | @Api(tags = "综åå±ç¤º\\综åå±ç¤º") |
| | | @RestController |
| | | @RequestMapping("/comprehensive") |
| | | public class ComprehensiveController extends BaseController { |
| | | @Autowired |
| | | BaseQueryService baseQueryService; |
| | | |
| | | @SysLog() |
| | | @ApiOperation(value = "æ¥è¯¢è·¯ç½") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(name = "x1", value = "X1", dataType = "Double", paramType = "query", example = "116.78999"), |
| | | @ApiImplicitParam(name = "y1", value = "Y1", dataType = "Double", paramType = "query", example = "39.9468"), |
| | | @ApiImplicitParam(name = "x2", value = "X2", dataType = "Double", paramType = "query", example = "116.80458"), |
| | | @ApiImplicitParam(name = "y2", value = "Y2", dataType = "Double", paramType = "query", example = "39.94758") |
| | | }) |
| | | @GetMapping(value = "/selectRoute") |
| | | public ResponseMsg<Object> selectRoute(double x1, double y1, double x2, double y2) { |
| | | try { |
| | | String route = baseQueryService.selectRoute(x1, y1, x2, y2); |
| | | |
| | | return success(route); |
| | | } catch (Exception ex) { |
| | | return fail(ex.getMessage(), null); |
| | | } |
| | | } |
| | | } |
| | |
| | | * @return å®ä½ç±»éå |
| | | */ |
| | | public List<DomainEntity> selectDomains(String ns, String tab); |
| | | |
| | | /** |
| | | * æ¥è¯¢è·¯ç½ |
| | | * |
| | | * @param x1 X1 |
| | | * @param y1 Y1 |
| | | * @param x2 X2 |
| | | * @param y2 Y2 |
| | | * @return å¤çº¿ |
| | | */ |
| | | public String selectRoute(double x1, double y1, double x2, double y2); |
| | | } |
| | |
| | | * @param val å¼ |
| | | */ |
| | | private void addWrapper(QueryWrapper wrapper, String field, String express, Object val) { |
| | | if (StringHelper.isDate(val.toString())){ |
| | | if (StringHelper.isDate(val.toString())) { |
| | | wrapper.apply(String.format("%s %s '%s'", field, express, val)); |
| | | return; |
| | | } |
| | |
| | | public List<DomainEntity> selectDomains(String ns, String tab) { |
| | | return baseQueryMapper.selectDomains(ns, tab); |
| | | } |
| | | |
| | | @Override |
| | | public String selectRoute(double x1, double y1, double x2, double y2) { |
| | | return baseQueryMapper.selectRoute(x1, y1, x2, y2); |
| | | } |
| | | } |
| | |
| | | select a.* from lf.sys_domain a inner join lf.sys_dict b on a.dom_name = b.domain_na |
| | | where b.ns = #{ns} and b.tab = #{tab} and b.domain_na is not null |
| | | </select> |
| | | |
| | | <select id="selectRoute" resultType="java.lang.String"> |
| | | select ST_astext(ST_Union(geom)) as route from pgr_fromAtoB('lrdl'::text, #{x1}, #{y1}, #{x2}, #{y2}); |
| | | </select> |
| | | </mapper> |