好吧,这个标题可能有点误导。但我也想不出其他更好的标题了。如果您能提出来合适的,我会立即更改。
本文主要介绍一些开源的GIS开发库和工具,如果大家在生产研究中需要进行相应的处理,使用这些开发库和工具可以节省许多时间和经历。同时,在研究的过程中使用这些“底层”的工具,可以加深大家对基本原理和理论的认识。
本文不是“死”的,我将会一直维护和更新本文。
现在,就让我们开始吧。
一、我的GIS经历
首先,吐槽下我的GIS经历吧。
本科阶段,还是测绘工程专业的。大部分课都是跟着地理信息系统专业的同学一起上。在老师朦胧的介绍中,我们当时粗浅的理解就是:测绘做外业,GIS做内业。
考上研究生后,专业转成了地图学与地理信息系统。做了一些项目,如地名地址、还有最近的两权发证,都与要使用到ArcGIS。不光在生产中需要用到ArcGIS。另外在研究当中,也使用ArcGIS作为研究工具。比如前一阵子,来我校举行讲座的萧世伦(Shih-Lung Shaw)教授就是用ArcGIS作为其研究工具(这么说好像有点。。。哪个从事GIS研究的不用ArcGIS啊。)
的确,谈到GIS就不能不说ESRI,ESRI的影响力之大,以致有人称呼ESRI为GIS界的微软。
聚会时,有高中同学问GIS是做什么的。我反问了他们:在你们眼里GIS是做什么的?得到的答案有许多,其中最有喜感的是一个女同学的答案,她说GIS和PS差不多。。。因为在她眼里,我们也是对着电脑处理一些“照片”。
二、GIS编程实现
在平时我们都是用专业的应用软件来处理相关数据,如ArcGIS等。同时有时候也会通过Arc Engine,使用C#等语言进行二次开发。以定制开发适合自身需要的工具。关于ArcGIS的使用,以及二次开发,网上的资料很多。而这篇文章的侧重点提高自身的GIS编程能力,所以这里介绍一些如何使用一些开源软件和工具来处理GIS数据。使用开源软件的好处之一就是您可以在使用的过程中,遇到不明白的地方,去查看源代码,观察这个软件包的对某个问题的处理方式和实现办法。
下面将要介绍一些GIS开发中可以使用到的开源软件和工具,通过这些工具的使用,大家可以了解在GIS数据在“底层”处理的一些简单的认识。当然,这里的底层和计算机上常说的底层是不同的。希望通过介绍这些工具的使用,来达到抛砖引玉的作用。让大家能学习到更多的知识。
GIS数据的处理,概括来说,有读取/输出、处理、显示三大步骤。不过在下面将要介绍的工具和库中,每个库的作用并不是单一的。比如有的库可以读取/输出,也可以进行部分的处理工作;有些库可以进行显示和渲染,但也可以进行一部分处理工作。下面就通过对shapefile的处理来分别简要介绍这些库。
GIS相关的许多工作,其实都是对shapefile进行处理。除了使用专业的工具之外,我们还可以使用一些开源的工具和编程语言,从底层进行开发和使用。
1、GIS开发的语言
编程语言数目繁多,有专攻科学计算的Matlab;有系统开发语言C/C++;还有人工智能方向的Prolog等。(这里只是说明下,并不是说这些语言只能做这方面的工作)
考虑到GIS专业,与计算机专业还是有一定区别的。那么从学习成本,以及开发效率上来说,对于GIS的开发人员,还是比较推荐Python的。Python是一本简洁易用的语言。ArcGIS也选用其作为内嵌语言之一。关于Python的优势,有许多许多,将其作为非企业级的GIS软件的开发语言,还是比较合适的。
您可以使用本文介绍的Python作为工具,其他开源库作为材料,搭建自己的研究/实验性的程序软件。
更新,关于Python与GIS的使用,有一定英文基础的朋友可以去参考下犹他州立大学的教程和资料,见参考文献4。
2、shapefile的读取
可以通过GDAL/ORG库来进行GIS数据的读取和写入。
GDAL(Geospatial Data Abstraction Library)是一个的开源栅格空间数据读取/转换库。其中还有一系列命令行工具来进行数据转换和处理。 (关于GDAL,李民录老师在CSDN的博客上有详细的介绍,大家可以去参考学习下,见参考文献1。)
而ORG项目是GDAL的一个分支,功能与GDAL类似,但其提供对矢量数据的支持。 也就是说,可以用ORG的库来读取、处理shapefile等矢量数据(如果想显示shapefile,还需要用其他工具)。
注:版权问题
软件的使用,最重要的一点是版权。GDAL/OGR实在MIT许可证下发布的。如果您不太了解开源软件的各个许可证,这里也没关系。MIT许可证是最宽松的。如果您的软件修改自GDAL/ORG,或者在您的软件中包含调用了GDAL/ORG工具,您都对您的软件进行任何处理,包括出售。只需在您的软件及其所有副本中必须包含版权声明和许可声明即可。
关于OGR的安装配置,其与GDAL是同一个软件包,所以安装GDAL后,ORG也安装了。
而关于OGR的详细的使用,由于最近的研究需要使用到,所以有机会我新开一篇或多篇文章来详细介绍。限于篇幅,这里就简要说明下,如果大家有兴趣,可以看下参考文献2和参考文献3。其中参考文献2中有介绍ORG在Python的使用,同时也介绍了一些常见的Python的GIS库。而参考文献3则是介绍OGR在C++下的使用。另外,以前见过一篇文章,其中介绍GDAL/OGR库的C/C++使用时,也介绍了Python的使用,只是现在没找到。有机会我写个系统的介绍吧。
OGR可以读取并处理矢量数据,并且能够处理这些矢量数据的投影。关于OGR处理地图投影,其是通过PROJ4库实现的。
3、数据处理
GIS数据的处理,不可避免的要涉及到投影问题。关于投影,一般是用PROJ库来解决的。PROJ也有Python的接口,也就是pyproj软件包(MIT许可)。下载地址为:https://code.google.com/p/pyproj/downloads/list
除了数据的投影处理,还要对数据进行一般处理,前面介绍的OGR可以进行shapefile文件中的属性和数值处理。而有时候,我们需要进行相关数据的几何处理,如二维的拓扑处理。这时,就可以用到一个名为Sharply的Python软件包。Sharply可以处理和分析二维的几何图形。其是大名鼎鼎的GEOS软件包的Python接口(GEOS是C++写的,其又基于Java Technology Suite,说来话长了)。要使用Sharply,必须先安装GEOS(小心,GEOS是LGPL许可的,不能像MIT许可那样随心所欲)。
- Sharply的下载地址为:https://github.com/sgillies/shapely
- GEOS的下载地址:http://trac.osgeo.org/geos/
4、Shapefile的显示
shapefile的数据处理,可以通过上面的OGR和Sharply库实现,但若要进行显示。就涉及到渲染等问题了。这里就要介绍另一个强大的库——Mapnik。
Mapnik 是一个开源的 Python/C++ 地图渲染引擎,其功能是把包含地理对象的数字地图,如地图、层、数据源、特征和地理几何等,通过一个样式表的定义渲染成位图格式,用来提供 WMS 服务。其核心是一个C++的共享库提供空间数据访问和可视化的算法和模式。 (注意,其还是LGPL下发布的)
Mapnik的例子在净月潭社区有两个。更详细的,我会试图写几篇来介绍的。
- Mapnik下载地址:http://mapnik.org/download/
三、补充
这里只是概括的介绍一些开源软件库的使用。上述介绍的库,不论是其Python的接口,还是其库本身,都是跨平台的,也就是说您可以在Windows、Linux和MacOS下使用这些库。
由于我最近也在研究并使用这些库,而有些库的中文资料相对较少。有机会我会整理下,写一篇或多篇文章发布出来,和大家一起学习。同时,还有许多其他的Python/GIS库,如Fiona、GeoDjango、QGIS等,这里先不一一介绍了。大家可以去Google一下。有机会我也会介绍的。
另外,GIS数据的处理,其本质上是数值处理,在Python中,可以使用numpy、Sympy等软件包。关于Python科学计算和数值处理的资料。建议参阅张若愚老师的《Python科学计算》,清华大学出版社出版。
这篇文章我很早就想写了。虽然本文是参加ESRI的活动。但本文将在后面的时间一直保持更新,文本的不足之处将会得到连续的改进。同时,今后我写的相关的GIS类软件的使用教程,也会链接到本文中。也就是说,本文是“活的”,将会一直得到更新和完善。
希望大家在GIS的道路上一同进步。
四、参考资料
- 李民录老师关于GDAL的一系列文章:http://blog.csdn.net/column/details/gdal.html
- 啄木鸟社区李林老师的一系列文章:http://wiki.woodpecker.org.cn/moin/lilin;
- 柴树杉老师翻译的GDAL官方说明文档:http://osgeo.org.cn/l18n/gdal/ogr_apitut.html
- 犹他州立大学关于Python和OGR的教程:http://www.gis.usu.edu/~chrisg/python/2009/。