美文网首页
使用pgRouting生成可达圈(等时圈)

使用pgRouting生成可达圈(等时圈)

作者: 圣瓦伦 | 来源:发表于2019-11-03 17:54 被阅读0次

    pgRouting是地理空间数据库PostGIS的扩展插件,提供了路径规划的功能。

    需求

    输入一个起始点(经纬度坐标)和驾车(步行、骑行)的时间,根据已有的路网,输出能到达的最大范围,并获得范围内的兴趣点。

    思路

    主要使用pgRouting的pgr_drivingDistance + ST_ConcaveHull生成包围圈。

    准备

    1. 安装PostgreSQL/PostGIS/pgRouting
    2. 导入路网数据,生成拓扑

    计算过程

    1.1 计算离目标点最近的节点

    <-> :返回两点之间的距离

    SELECT * FROM shenzhen_vertices_pgr
        ORDER BY the_geom <-> ST_GeometryFromText('POINT(113.954396 22.580677)',4326) 
        LIMIT 1;
    
    

    1.2 以该节点作为起点,给定时间成本,计算可达路网

    pgr_drivingDistance :详情查看pgRouting手册

    with drivingDistance as(
    SELECT
        sz.geom
    FROM
        pgr_drivingDistance (
            'SELECT gid as id, source, target, distance/mean_speed as cost FROM shenzhen',  --路网表
            1034,  --节点的ID
            0.5*3600,    --总成本(时间)
            FALSE
        ) dd,
        shenzhen as sz
    WHERE sz.gid = dd.edge
    )
    
    路网范围

    1.3 根据路网计算可达圈

    SELECT  st_concavehull(st_collect(array(select * from drivingDistance)),0.7)
    

    st_concavehull:返回坐标点的包围圈,详情

    可达圈

    路网和可达圈叠加:

    SELECT  st_concavehull(st_collect(array(select * from drivingDistance)),0.7)
    union
    SELECT * FROM drivingDistance;
    
    叠加

    1.4 根据可达圈计算圈内的POI(兴趣点)

    主要用到的是st_contains函数

    select t.* from 
    (SELECT st_concavehull(st_collect(array(select * from drivingDistance)),0.9)) c 
    left join traffic_facility t 
    on st_contains(c.st_concavehull,t.geom)
    where t.station_type IN ('SUBWAY');
    
    POI和可达圈叠加

    参考资料:

    使用pgRouting可达范围计算
    官网
    PostGIS介绍:https://www.jianshu.com/p/66ea816f6fee

    相关文章

      网友评论

          本文标题:使用pgRouting生成可达圈(等时圈)

          本文链接:https://www.haomeiwen.com/subject/tnclbctx.html