pgr_fromAtoB_Point

本文介绍了一个使用PGRouting实现的从A点到B点的路径查询函数pgr_fromAtoB_Point。该函数通过查找最近节点并利用Dijkstra算法计算最短路径,返回路径上的几何信息和井名等数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--
DROP FUNCTION pgr_fromAtoB_Point(varchar, varchar,double precision, double precision, 
                         double precision, double precision);


CREATE OR REPLACE FUNCTION pgr_fromAtoB_Point(
                IN tbl varchar,
IN tbl2 varchar,
                IN x1 double precision,
                IN y1 double precision,
                IN x2 double precision,
                IN y2 double precision,
               -- OUT seq integer,
                --OUT gid integer,
                --OUT name text,
                --OUT heading double precision,
                --OUT cost double precision,
                --OUT geom geometry,
OUT wellName text,
OUT wellCode text
        )
        RETURNS SETOF record AS
$BODY$
DECLARE
        sql     text;
        rec     record;
        source integer;
        target integer;
        point integer;
        rec2    record;
        seq integer;
gid integer;
                --OUT name text,
heading double precision;
                --OUT cost double precision,
        geom geometry;
        
BEGIN
-- Find nearest node
EXECUTE 'SELECT id::integer FROM wellline_vertices_pgr 
ORDER BY the_geom <-> ST_GeometryFromText(''POINT(' 
|| x1 || ' ' || y1 || ')'',4326) LIMIT 1' INTO rec;
source := rec.id;

EXECUTE 'SELECT id::integer FROM wellline_vertices_pgr 
ORDER BY the_geom <-> ST_GeometryFromText(''POINT(' 
|| x2 || ' ' || y2 || ')'',4326) LIMIT 1' INTO rec;
target := rec.id;


-- Shortest path query (TODO: limit extent by BBOX) 
        seq := 0;
        sql := 'SELECT gid, geom, source, target, 
ST_Reverse(geom) AS flip_geom FROM ' ||
                        'pgr_dijkstra(''SELECT gid as id, source::int, target::int, '
                                        || 'length::float AS cost FROM '
                                        || quote_ident(tbl) || ''', '
                                        || source || ', ' || target 
                                        || ' , false, false), '
                                || quote_ident(tbl) || ' WHERE id2 = 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;
                FOR rec2 IN EXECUTE 'select wellcode from '|| quote_ident(tbl2) || ' t where st_DWithin(t.geom, ''' || geom::text || ''',0.00001)'
                LOOP
   wellcode :=rec2.wellcode;
   return next;
                END LOOP;
                --RETURN NEXT;
        END LOOP;

        RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值