基于Python的地理空间分析(一):地理空间分析代码库

一直很喜欢地理,中学的时候就听说了GIS,阴差阳错之下,今天居然与它打起了交道。毕竟不是专业做这个的,所以找了一本书《Mastering Geospatial Analysis with Python》,按部就班学点新东西。

(地理空间分析Python的书有很多,随手选了这个)

book_cover

地理空间分析

作为地理问题研究的重要手段,空间分析虽然由来已久,但是其真正成为独立概念,还是得益于GIS的发展。发展到今天,空间分析已经成为GIS的核心技术。

那么什么是空间分析呢?根据OSGeo中国的介绍,2003年,美国宾夕法尼亚州立大学的David O’Sullivan和David Unwin在其著作《Geographic InformationAnalysis》中,对这些提法进行了总结,他认为,不同领域的文献中,至少存在4种相互联系的空间分析概念,分别是空间数据操作(Spatial datamanipulation)、空间数据分析(Spatial data analysis)、空间统计分析(Spatial statisticalanalysis)、空间建模(Spatialmodeling)。

因此,空间分析其实也并不神秘,在数据驱动的问题研究中,对数据的操作、分析、统计和建模都是司空见惯的,而空间分析则更多考虑地理空间所带来的特殊性。

(看地图是不是也能算做空间分析呢?)

dariusz-sankowski-56725-unsplash

地理空间分析代码库

我听说,如果你想找XXX的资料,就去Github上搜索:“awesome xxx”,它从不让你失望。果不其然,我发现了Awesome Geospatial,上面琳琅满目罗列着各种语言(Python、Java、C++……)编写的各种代码库(Radar、Lidar、Data Mining……),点到Python的目录下,就可以发现Python环境下的各种包。

(Github上的Awesome Geospatial)

awesome_geospatial

在《空间分析》(全名有点长)书里,主要介绍了一下几个库:

  • GSAL/OGR
  • GEOS
  • Shapely
  • Fiona
  • Python Shapefile Library
  • pyproj
  • Rasterio
  • Geopandas

后续如果用到了其他的包(例如leaflet),到时候再做补充。

GDAL/OGR

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。该项目由Frank Warmerdam教授于1998年发起,2000年6月首次发布,后来转移到Open Source Geospatial
Foundation (OSGeo)下面继续开发。 它利用抽象数据模型来表达所支持的各种文件格式。 它还有一系列命令行工具来进行数据转换和处理。 OGR(OpenGIS Simple Features Reference Implementation)是GDAL项目的一个子项目, 提供对矢量数据的支持。 一般把这两个库合称为GDAL/OGR,或者简称为GDAL。之所以如此介绍的原因是,GDAL 最开始的时候是一个用来处理栅格空间数据的类库,OGR 则是则是来处 理矢量数据的。后来,这两个库合并成为合并成为一个,在下载安装的时候,都是使用GDAL 这一个名字。因为历史的原因,两大类库是用同样一个生成系统进行维护的,最重要的是 GDAL/OGR 的作者是同一人,该人目前也是 OSGeo 的会长 Frank Warmerdam,其在OpenSource Geospatial 领域早已大名鼎鼎。许多程序员都是拜读他的代码理解空间信息软件精髓的。

由于MIT协议的开放性,任何人都可以基于GDAL库来编写自己的软件而不需要原作者的授权, 所以有很多著名的GIS软件都使用了GDAL/OGR库, 包括商业公司ESRI的ArgGIS,Google的Google Earth和开源的GRASS GIS系统。 GDAL/OGR支持多种操作系统,可以同时对Linux和windows下的地理空间数据管理系统提供百余种矢量和栅格文件类型的支持。

GDAL/OGR使用面向对象的C语言编写,具有很高的执行效率。 GDAL/OGR同时还提供多种主流编程语言的绑定,除了C和C语言之外, 用户还可以在Perl、python、VB6、Ruby、Java、C#等语言中调用GDAL, 这令GDAL的应用变得非常广泛。因此,GDAL已经成为了事实上的行业标准,其最新版本(2018年12月GDAL 2.4.0版本发布)可以支持多达200种不同的文件格式,可以说GDAL对于地理空间数据分析而言是必不可少的基石。

GEOS

GEOS是“Geometry Engine, Open Source”的缩写,是一个集合形状的拓扑关系操作实用库,简单得说,就是判断两个几何形状之间关系和对两个几何形状进行操作以形成新的几何形状的库。它提供了Java Toplogy Suite(JTS)的一个子集的C++实现,JTS 是一个Java编写的地理空间计算几何开源库,提供包括几何模型、几何函数、空间结构和算法等各种功能。GEOS的目标是实现JTS的完整功能。

GEOS可以实现相等、相交、内含(Within)、包含(Contains)等多种空间关系计算和缓冲区分析(buffer)、凸包分析(ConvexHull)等多种空间叠加分析,并且具有十分良好的鲁棒性。还包括Well-known text (WKT)和well-known binary (WKB)。

与GDAL一样,GEOS也可以在包括Python在内的许多平台上编译,例如Shapely库就调用了GEOS的函数。实际上,包括PostGIS、QGIS、GeoDjango等许多项目也使用了GEOS。

Shapely

Shapely是一个基于GEOS和JTS 用于操作和分析平面特征的包,它并不关心数据格式或者坐标系,但是可以很容易地与这些包进行集成。

Shapely由Sean Gillies开发,而他也是Fiona和Rasterio的开发者,可见大牛就是任性。与前面介绍的GDAL或者GEOS相比,Shapely最大的特点是一个更加Pythonic的包,对于Python开发者更加友好,而这也正是大牛开发这些库的重要原因。

Fiona

Fiona是OGR的API,与Shapely类似,Fiona也是为了更加便于Python开发。Fiona使用两种标记语言,WKT和WTB,表示关于向量的空间信息数据,可以用于创建和操作地理空间数据,能够与Shapely等库很好地结合使用。

虽然Fiona比OGR更加可靠也更加友好,但是由于它使用Python进行复制,所以其性能不如OGR。

pyshp

pyshp的全称是Python shapefile library,顾名思义,它只能用来读写shappefiles,而且它只用到了Python的标准库函数。显然,它的功能十分有限,也不能用来做地理几何分析或者操作。我并不认为这个库值得安装和使用。

pyproj

pyproj是一个实现地理坐标变换(cartographic transformation)和大地结算(geodetic computation)的包,实现了PROJ.4的python接口,而PROJ.4则是一个实现不同数据坐标系转换的投影库。虽然这些变换也可以通过GDAL和OGR实现,但是由于PROJ.4支持众多坐标系,而且Rasterio和GeoPandas也都依赖于pyproj,所以PROJ.4仍然被广泛使用。pyproj包提供两个类–Proj类和Geod类,其中Proj类执行坐标转换,Geod类实现大地计算。

Rasterio

Rasterio,顾名思义“raster-io”,是一个基于GDAL和Numpy处理栅格数据的Python包。Rasterio最早是一个处理卫星图像创建地图的项目mapbox Cloudless Atlas的产物。开发Rasterio的初衷,与前面几个包具有类似的原因,就是提高对Python开发者的友好程度。因此,Rasterio顶层采用Python与程序员交互,中间层使用Cython,底层使用GDAL库函数。

GeoPandas

不得不说,这些库的名字都起得很通俗易懂:Geopandas就是基于Pandas做地理空间数据嘛!
没错,GeoPandas刚好提供两个数据对象:GeoSeries和GeoDataFrame,可以理解为就是在Series和DataFrame的基础上增加了一列用来表示空间信息。当然,由于GeoSeries和GeoDataFrame继承自Series和DataFrame,它们也可以用Pandas的哪些函数。

与其他的地理空间数据宝相比,GeoPandas更加“高级”,可以采用更加直观的方法显示和操作数据(例如Jupyter),也更加便于实现数据的可视化。

总结

前面零零散散介绍了八九种地理空间分析的Python包,似乎是瑞士军刀一般具有五花八门甚至乱七八糟的功能,甚至让我这个初学者有些不知所措,不过从我以往的经验来看,对付这些东西不外乎有两个原则:

  1. 了解不同包的定位、特点和相互关系,例如Shapely和Rasterio分别是针对矢量数据和栅格数据的,但是两者都要依赖于GDAL。
  2. 掌握关键概念,选择趁手的坚持用下去。对我这个外行来说,栅格、矢量、大地计算、坐标变换都是需要首先弄明白的事情,这是用好工具的基础。当然,工具有很多,彼此的功能甚至相互交叉,这个时候选择一个用熟了,再考虑其他的也就触类旁通了。

atlas-close-up-dark-592753

参考文献

  1. http://www.osgeo.cn/post/6739g 空间分析的概念剖析
  2. https://www.gdal.org/ GDAL官方主页
  3. http://www.osgeo.cn/python_gdal_utah_tutorial/ch01.html#gdal 地理数据处理软件包GDAL简介
  4. https://trac.osgeo.org/geos/ GEOS主页
  5. https://github.com/sacridini/Awesome-Geospatial Awesome Geospatial项目