最近在学习使用postgis查询两点之间最近路径,将整理的问题记录提供需要的人参考使用,接下来我以北京为例。
1.数据下载
https://www.openstreetmap.org,这个网站下载的数据没有特定某个城市,是全国的数据文件,需要某一个的只能去网上搜索(度娘);
2.数据导入
需要的数据下载成功后,有多个格式文件,dbf、shp.....其他省略号代替;
可以用命令将shp文件转换成sql文件直接使用navicat导入sql文件
转换文件命令:cmd进入到PostgreSQL\10目录,
shp2pgsql -W UTF-8 -s 4326 -g geom_data C:/Users/vis/Desktop/lw/bjluw/市区道路_polyline 改成你的文件名>C:/Users/vis/Desktop/你的文件名.sql
到此sql文件转换完成。
需要注意:
使用PostGIS PostGIS Bundle 3 for PostgreSQL x64 10 Shapefile and DBF Loader Exporter 导入的时候需要改一下编码格式,文件可能是utf8或者gbk。(navicat 可以直接导入多种格式,但是不支持shp文件,需要用上述插件来导入shp文件);至此数据文件导入完成。
3.添加字段
https://github.com/cytggit/Map-openlayers/wiki/%E8%B7%AF%E5%BE%84%E8%A7%84%E5%88%92%E7%9A%84%E5%BA%94%E7%94%A8 可以跟着网址给的步骤操作。
需要注意:
1、道路权重值字段可能在你导入的文件中存在了,如果存在可以忽略;
2、为source和target字段创建索引,和上一步一样,可能会存在索引不需要再次创建;
3.为length赋值,同上;
字段添加结束.
4.使用pgr_dijkstra算法查询
SELECT seq, node, edge, cost FROM pgr_dijkstra('
SELECT gid as id,
source::integer,
target::integer,
length::double precision AS cost,
x1,y1,x2,y2
FROM _polyline',
103, 128,directed:=false)
5.将查询结果存表
insert into line2 (the_geom) select ST_MakeLine(ARRAY (select the_geom
from (SELECT seq, node FROM pgr_dijkstra(
'SELECT gid AS id,
source::integer,
target::integer,
length::double precision AS cost
FROM _polyline', 103, 128,directed:=false))path, _polyline_vertices_pgr p
where path.node = p.id order by seq));
6.使用qgis展示
打开QGIS Desktop 3.12.3 左侧postgis连接自己的库可以看自己的查询数据了。
到此全部完成。