管道基础大数据平台系统开发-【后端】-Server
1
13693261870
2023-01-08 c9c8797cd6c731a58d95d3adb045428f04ba597e
1
已添加1个文件
已修改1个文件
180 ■■■■■ 文件已修改
data/road.sql 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/lf/server/entity/ctrl/FmeReqEntity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
data/road.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,176 @@
-----------------------------------------------------------------------------------------------------------------------------
CREATE EXTENSION PostGIS;
CREATE EXTENSION pgRouting;
create extension postgis_raster;
create extension postgis_topology;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION address_standardizer;
-----------------------------------------------------------------------------------------------------------------------------
--删除已存在的函数
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 || ')'',4326) 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 || ')'',4326) 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;
-----------------------------------------------------------------------------------------------------------------------------
--删除已存在的函数
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 || ')'',4326) 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 || ')'',4326) 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 pgr_fromAtoB('public.lrdl', 116.78999, 39.9468, 116.80458, 39.94758);
-- pgr_kdijkstraPath,pgr_dijkstra
select pgr_shortestpath('public.lrdl', 116.78999, 39.9468, 116.80458, 39.94758);
select * from public.lrdl limit 10;
-----------------------------------------------------------------------------------------------------------------------------
src/main/java/com/lf/server/entity/ctrl/FmeReqEntity.java
@@ -34,12 +34,12 @@
    public String wbsPath;
    /**
     * æ˜¯/否为地灾数据:YES|NO
     * æ˜¯/否为地灾数据:YES | NO
     */
    public String isDiZai;
    /**
     * åœ°ç¾æ•°æ®ç±»åž‹ï¼šå´©å¡Œæ²»ç† | ä¸ç¨³å®šæ–œå¡æ²»ç† | åœ°é¢å¡Œé™·æ²»ç† | é«˜é™¡è¾¹å¡æ²»ç† | æ³¥çŸ³æµæ²»ç† | æ°´æ¯æ²»ç† | æ»‘坡治理 | NO
     * åœ°ç¾æ•°æ®ç±»åž‹ï¼šï¼ˆå´©å¡Œæ²»ç† | ä¸ç¨³å®šæ–œå¡æ²»ç† | åœ°é¢å¡Œé™·æ²»ç† | é«˜é™¡è¾¹å¡æ²»ç† | æ³¥çŸ³æµæ²»ç† | æ°´æ¯æ²»ç† | æ»‘坡治理) | NO
     */
    public String diZaiType;