Pgrouting 环境搭建,以及osm.pbf数据处理

Pgrouting 环境搭建,以及osm.pbf数据处理

1.安装所需软件

2.创建数据库,加载扩展

使用pgrouting功能需要以下两个扩展功能,PostGis:pg11/3.1.0 windows中已经包含pgrouting

使用navicat或者postgresql自带的pgAdmin执行以下sql语句

CREATE EXTENSION postgis;
CREATE EXTENSION pgrouting;
复制代码

查询插件是否加载成功,执行以下sql,可以获得postgis和pgrouting版本

SELECT postgis_full_version(),pgr_version();
复制代码

3.准备数据

  • Geofabrik 下载.osm.pbf格式数据

    当前使用的是全国的矢量数据china-latest.osm.pbf

    其他数据源,该数据源可以按城市拆分OpenstreetMap

  • 下载的源数据包括所有的图层,若抽取需要的数据

    需要使用工具osmium-tool Github

    拉取源码后,按照官方文档在linux下编译成功后执行以下语句

./osmium tags-filter /home/cq/gis/pbf/china-latest.osm.pbf  w/highway=motorway w/highway=trunk w/highway=primary w/highway=motorway_link w/highway=trunk_link w/highway=primary_link -o china-osm2pgrouting.osm.pbf
复制代码

​ 成功抽取tag为motorway,trunk,primary,motorway_link,trunk_link,primary_link的路网数据

​ 关于路网(highway)tag的说明, 地址

  • osm.pbf数据转osm(pgrouting不支持osm.pbf格式数据)

    osmconvert 当前使用的是windows支持大文件版本 下载地址

    转换命令

    osmconvert64-0.8.8p.exe --out-osm china-osm2pgrouting.osm.pbf>china-pgrouting.osm
    复制代码
  • 安装osm2pgrouting Github

    拉取源码后,按照官方文档在linux下编译成功后执行以下语句导入数据

    osm2pgrouting -f ./build/china-pgrouting.osm -h 192.168.2.177 -p 5432 -d china_pgrouting -U postgres -W root -c ./mapconfig.xml --clean
    
    #mapconfig.xml 在osm2pgoring目录下
    #-f osm文件路径
    #-h postgresql IP
    #-p postgresql 端口
    #-d postgresql 数据库名
    #-U postgresql 用户名
    #-W posgtresql 密码
    #-c osm2pgrouting 配置文件路径
    #--clean 删除库中原有数据
    复制代码

4.常用查询

​ osm数据使用的是SRID=4326坐标系

  • 查询任意坐标最近顶点位置

    SELECT * FROM ways_vertices_pgr
    WHERE
    	ST_DWithin (
    		the_geom,
    		'SRID=4326;POINT(116.432583 39.910729)',
    		1000
    	)
    ORDER BY
    	ST_Distance (
    		the_geom,
    		'SRID=4326;POINT(116.432583 39.910729)'
    	)
    LIMIT 1;
    复制代码
  • 使用Dijkstra算法计算两个顶点之间的结果

    select * from pgr_dijkstra (
    		'SELECT gid AS id,source, target,cost, reverse_cost FROM ways',
    		153567,
    		927741,
    		directed := FALSE
    	)
    # directed 是否是有向图计算,由于路网数据并不完整,有向图计算往往得不到计算结果	
    复制代码
  • 将Dijkstra计算结果以GeoJson形式展示

    SELECT
    	ST_AsGeoJSON (ST_UNION(b.the_geom)) AS geojson
    FROM
     select * from pgr_dijkstra (
    		'SELECT gid AS id,source, target,cost, reverse_cost FROM ways',
    		153567,
    		927741,
    		directed := FALSE
    	) A,
    	ways b
    WHERE
    	A .edge = b.gid;
    复制代码
  • 使用A*算法

    SELECT * FROM pgr_astar(
        'SELECT gid as id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM ways',
         153567,
         927741,	
    	directed := FALSE);
    复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享