使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
基础准备工作
1.PostGIS 的安装
在安装PostGIS前首先必须安装PostgreSQL,然后再安装好的Stack Builder中选择安装PostGIS组件。具体安装步骤可参照PostGIS的安装与初步使用
2.加载Post GIS扩展
选中指定数据库,执行加载扩展语句
CREATE EXTENSION postgis; –添加postgis扩展
CREATE EXTENSION pgrouting; –添加pgrouting扩展
CREATE EXTENSION postgis_topology;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
在做两点间河流轨迹及流经长度计算过程中,需要加载postgis和pgrouting两个扩展
可以通过查看加载扩展的版本验证扩展加载是否成功
show server_version;
–查看postgis版本
SELECT PostGIS_full_version();
–查看pgrouting版本
select pgr_version();
3.河流矢量图层转成单线格式
河流包括各种汇入和汇出,为了实现流经流域的计算,河流水系矢量数据需要一个河流一个ID的方式,可以在河流交汇点处将河流进行打段处理。
4.河流矢量数据导入PostgreSQL数据库
打开位于“开始>所有程序>PostGIS 2.3 bundle for PostgreSQL”之中的PostGIS Shapefile Import/Export Manager。
首先单击"View connection details"按钮,打开"PostGIS connection"对话框,输入用户名"postgres"及其对应的密码,设置连接的数据库,如下图所示:
连接数据库之后,单击"Add file"按钮,加入***.shp文件,并将其SRID设置为"4326",如下图所示。这一步绝对不能省略,否则不能正确导入数据。
5.河流数据拓扑处理
在数据分析过程中,使用到了pgrouting扩展中的 pgr_dijkstra 算法
Dijkstra算法(迪杰斯特拉算法),由荷兰计算机科学家Edsger Dijkstra于1956年提出。它是一种图搜索算法,它解决了非负代价边路径图的最短路径问题,即从起始顶点(start_vid)到结束顶点(end_vid)的最短路径。此算法可以与有向图或无向图一起使用。
函数的签名摘要:
在实际使用中,需要先明确所有的顶点,并为所有顶点分配唯一的编号,函数的 start_vid 和 end_vid 都是整型数值,函数使用edges_sql参数(sql脚本)筛选出和顶点相邻的所有边信息(即河流信息)。
所以,在使用pgr_dijkstra方法前,需要
- 对找到河流的所有顶点信息,并做唯一整型值编号
- 在数据库中为每条河流设置好起始顶点和结束顶点
select st_astext(st_startpoint((ST_Dump(geom)).geom)) from singleriver
union
select st_astext(st_endpoint((ST_Dump(geom)).geom)) from singleriver
将查询结果在Excel中进行整型值编号,再导入到postgresql中的新建表distinctpoint 中,然后关联河流数据表,更新河流的开始顶点(source)和结束顶点编号(target)
update singleriver q
set source=tt.sourcepoint
from singleriver s,
(select gid,p.id as sourcepoint from
(select gid,st_astext(st_startpoint((ST_Dump(geom)).geom)) as startpoint, st_astext(st_endpoint((ST_Dump(geom)).geom)) as endpoint from singleriver )s
left join distinctpoint p
on s.startpoint=p.point) tt
where q.gid=tt.gid
update singleriver q
set target=tt.endpoint
from singleriver s,
(select gid,p.id as endpoint from
(select gid,st_astext(st_startpoint((ST_Dump(geom)).geom)) as startpoint, st_astext(st_endpoint((ST_Dump(geom)).geom)) as endpoint from singleriver )s
left join distinctpoint p
on s.endpoint=p.point) tt
where q.gid=tt.gid
至此,河流拓扑数据处理完成
PG分析处理函数
1.函数编写
2.参数说明
输入参数:开始点和结束点的经纬度坐标
输出结果:river_name:河流名称;v_shppath:流经的河流路径; cost:河流流经长度
3.内部调用函数说明
函数调用过程,根据postgis不同版本,函数名称可能会有偏差,有版本展示形式为st_linesubstring ,有版本展示形式为st_line_substring
4.输出结果验证
为了验证河流输出结果是否正确,流经河流路径是否连通,可以通过在线geojson地图(geojson.io)呈现出来验证。
在右侧json-features-geometry 中填充函数输出的v_shppath参数内容(按照行单独输入,可以输入多个,注意需要增加json属性)
到此这篇关于使用PostGIS完成两点间的河流轨迹及流经长度的计算的文章就介绍到这了,更多相关PostGIS两点间的河流轨迹计算内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!