WebGIS最佳实践2 在WebGIS程序中实现路径分析

案例代码下载

 

问题:如何在WebGIS程序中实现路径(Route)分析。

方案

    先来简单介绍下路径分析,我们经常遇到这样的问题:要去一个什么地方,却不知道怎么走,于是只好问人家,人家会告诉你,向前走多远然后拐弯再走多远,看见个什么建筑过街就到了。这种描述很普遍但是说实话对于空间想象不好的人理解起来实在费劲,所以我往往还要问好几个人才能找到。后来有了Google地图,问题就简单多了,只需点两个点,它就会返回一条很明确的路线,一目了然,虽然有时会有点小错误,但是已经不影响大局了。我们在哪里,该怎么走,这附近有什么我们感兴趣的地方,等等一系列这类问题都是空间位置服务要解决的。路径分析就是空间位置服务的一个大类。顺便提一下,OGC制定了一个空间位置服务的标准OpenLS,有兴趣的朋友可以“烟酒烟酒”。

    下图是Google地图中路径分析的一个很典型的画面

image

想要实现这样一个程序并不如想象中困难,最简单的就是使用Google地图或者其他类似的在线商业地图服务,具体方式可以参看服务API的文档,这里就不深入了。另外,也可以使用商业GIS开发平台,例如ArcGIS就可以很轻松的实现类似的功能,我使用过的感觉就是“一分钱一分货”。但是我的博客重点关注开源工具,所以我们来看看用开源工具都有哪些方法。

    首先介绍一个免费的在线OpenLS服务,http://openrouteservice.org/,它的数据源来自OpenStreetMap,但是OSM的数据国内部分很不全,实用意义不大,我们姑且只能把它当做学习资料。

    开源GIS平台里集成了类似功能的不多(要么就是我没有找到),我只在Grass里见到过。上次一个朋友还提到一个工具pgRouting,是PostGIS的扩展,有兴趣的可以看看,我还没来得及学习。

    实现了图算法的开源库不少,理论上我们也可以利用它们来自行开发,我就使用NetworkX在Python下尝试过,效果还算过得去,其实就代码量而言,整个方案并不算坏,但是涉及太多的库很凌乱,不容易说明。最后我还是转回到GeoServer下面来。

    GeoServer采用GeoTools开发,而GeoTools提供了一个很好的Graph包,只需要把我们的路径分析服务通过GeoServer扩展发布出去就好了,顺便还可以提供演示例程。我们将使用“WebGIS最佳实践-1 为GeoServer增加GP(Geometry Processing)服务”的代码作为基础来开发。代码的安装及使用见附录。下面来介绍下我们自定义的这个路径分析服务。

    我们的要求如下:1)输入两个点的坐标和数据源名称;2)返回一条道路的几何体。根据这个需求我们来设计一个请求:http://[GeoServer Address]/ows?request=GetRoute&service=NA&version=1.0.0&stops=[WKT|WKT|…]&graph=[Layer Name]。返回值是:WKT|WKT|…。如果你已经安装好代码和数据并且已经启动服务,你可以点击下面这个链接看看效果:

http://localhost:8080/geoserver/ows?request=getroute&service=na&version=1.0.0&graph=in101503&stops=POINT%20(%20-105.0037%2039.8227%20)|POINT%20(%20-73.9713%2040.8504%20)

下面是OpenLayers开发的例子效果:

image

有问题欢迎与我联系:QQ 346294202

附录

1 代码安装,首先,本机需要安装JDK1.5及以上版本,Eclipse Helios Release。GeoServer2.1-RC3的源码。下载源码,解压到GeoServer的代码目录下

启动eclipse,打开File\Import菜单导入demos项目。然后把demos增加到web-app项目的依赖项目中

这一步主要是为了让web-app启动时能够加载我们的项目。现在启动web-app的Start类

然后浏览器中敲入:http://localhost:8080/geoserver/web/,会进入登录界面,点击Demos链接打开演示页面

image

2 数据安装,我做测试的路径是从这个链接下载的http://www.nws.noaa.gov/geodata/catalog/transportation/html/interst.htm,由于数据大不想占用博客园的空间,请自行下载。数据下载后可以用GeoServer发布成Layer,名称一定请取成“in101503”,免得影响试运行。注意:如果你的机器上安装了GeoServer,请将它关停,因为从代码启动的GeoServer很可能使用了同一端口。

原文地址:https://www.cnblogs.com/sillyemperor/p/2028863.html