WebGIS最佳实践4 使用pgRouting实现最佳路径搜索

  下载代码

  我在WebGIS最佳实践-2 在WebGIS程序中实现路径分析中提到过pgRouting,现在来看看这头小象能给我们带来些什么。

image

先上效果图给大家鼓鼓劲。:》

  为了实现以上效果我用jsp和openlayers编写了服务端和客户端,但是本文的重点是介绍pgRouting所以不在这里详细介绍这些这些代码了,大家可以从下载包中找到这两个文件。要使用pgRouting得先安装,我假设大家已经安装了Postgresql和PostGIS。

  从这里下载合适的二进制包,我下的是Windows版本,解压缩后把Lib下面的动态库复制到Postgresql的bin目录下,把Share\Contrib下面的sql文件复制到Postgresql的share\contrib目录下,然后重新启动Postgresql(这一步我不确定是否必要)。然后就可以进行路径搜素了,下面我们从数据准备开始,一步步得创建出完整可用的路网数据表。Let·s rock!

  我们先要创建一个新数据库,就叫routing吧,我们会先让它支持pgRouting的函数然后给他增加一张表,一张路网表。随后我们会需要执行一些sql脚本,你可以用postgresql提供的小程序psql.exe来执行也可以用图形化工具pgAdmin来完成。我选择用psql。postgresql提供的程序createdb.exe可以帮助我们创建数据库,我们假设用户是postgres:

?
1
createdb -U postgres routing

  然后让数据库支持PostGIS和pgRouting的函数和基础表

?
1
2
3
4
5
psql –U postgres –d routing –f postgis.sql
psql –U postgres –d routing –f spatial_ref_sys.sql
psql –U postgres –d routing –f routing_core.sql
psql –U postgres –d routing –f routing_core_wrappers.sql
psql –U postgres –d routing –f routing_topology.sql

其中,“postgis.sql,spatial_ref_sys.sql”可以在“<Postgresql的安装路径>\<version>\share\contrib\postgis<-1.4>”下面找到,到此数据库创建完成。

  为了创建路网表,我们需要一些道路数据。可以从OpenStreetMap上免费获得XML格式的道路数据。由于我们平时更容易获得Shapefile格式的数据,所以我决定用shp来完成数据导入。从Geobase下载道路数据。这个网站提供加拿大全国的道路数据,选择British Columbia , Edition 8.0的Shapefile格式(nrn_rrn_bc_shp_en.zip)。解压缩,我们要使用的数据就在“NRN_BC_8_0_ROADSEG”中。这个表的字段很多,大家可以用熟悉的GIS数据处理工具删掉一些字段,当然不处理也没关系。

  先用shp2psql.exe程序把shp文件装换成sql脚本

?
1
shp2pgsql -s 4326 NRN_BC_8_0_ROADSEG public.street_bc > street_bc.sql

 

 

如果一切顺利的话,我们会得到文件“street_bc.sql”,这是一个很大的文件。然后我们执行这个文件:

?
1
psql -U postgres -d routing -f street_bc.sql

下面创建路网的拓扑结构

?
1
2
3
4
5
psql –U postgres –d routing –c “alter table street_bc add “ source ” integer”
psql –U postgres –d routing –c “alter table street_bc add “target” integer”
psql –U postgres –d routing –c “ select assign_vertex_id(“street_bc”,0.001,”the_geom”,”gid”)”
psql –U postgres –d routing –c “alter table street_bc add “length” double precision”
psql –U postgres –d routing –c “update routing set length=st_length(the_geom)”

到这里路网数据就做好了。来测试一下:

?
1
SELECT astext(st_transform(the_geom,900913)),l_stname_c as name FROM shortest_path( 'SELECT gid as id,source::integer,target::integer,length::double precision as cost FROM street_bc' ,158390, 63634, false , false ),street_bc where edge_id = gid;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebGIS查询和路径规划功能实现源代码涉及的技术和工具比较复杂,这里无法提供完整的代码实现。但是,我可以为你提供一些实现功能所需的基本步骤和示例代码: 1. 查询功能实现步骤: - 创建查询表单,包括输入框、下拉框等控件,用于用户输入查询条件。 - 根据用户输入的条件,构造查询语句,向WebGIS中的数据源发起查询请求。 - 解析查询结果,将符合条件的数据在地图上进行标注或高亮显示。 下面是一个使用ArcGIS API for JavaScript实现查询功能的示例代码: ```javascript var queryTask = new QueryTask("http://yourserver/yourmapserver/0"); var query = new Query(); query.returnGeometry = true; query.outFields = ["*"]; query.where = "name LIKE '%" + searchTerm + "%'"; queryTask.execute(query, showResults); function showResults(results) { var featureSet = results.featureSet; for (var i = 0; i < featureSet.features.length; i++) { var feature = featureSet.features[i]; // 在地图上标注或高亮显示查询结果 } } ``` 2. 路径规划功能实现步骤: - 获取起点和终点的位置信息。 - 调用路径规划API,将起点和终点的位置信息作为参数发起请求。 - 解析路径规划结果,将路径在地图上进行绘制或高亮显示。 下面是一个使用百度地图API实现路径规划功能的示例代码: ```javascript var startPoint = new BMap.Point(116.404, 39.915); var endPoint = new BMap.Point(116.426, 39.915); var transit = new BMap.TransitRoute(map, { renderOptions: { map: map, panel: "results" } }); transit.search(startPoint, endPoint); ``` 以上示例代码仅供参考,具体实现方式需要根据具体的应用场景和技术选型进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值