使用pyshp读写Shapefile
Python Shapefile库(pyshp)为Esri Shapefile格式提供读写支持。 Shapefile格式是Esri创建的较为流行的地理信息系统矢量数据格式。
更多信息,请阅读 http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf 的“ESRI Shapefile技术说明 - 1998年7月”。 Esri文档主要讲的是shp和shx文件格式。 但dbf格式其实很常用。 这种格式作为“XBase文件格式描述”常作为网络上记录,dbf格式是在20世纪60年代创建的,是较为简单的基于文件的数据库格式。
shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature Classes),主要包括点(point)、线(polyline)和多边形(polygon)。Python脚本是ArcGIS官方推荐的脚本语言,Python脚本调用ArcGIS中各种工具和函数并且还能批量完成所需操作。本文介绍的Python Shapefile Library是一个Python库,在Python脚本中用于读取对ArcGIS中的Shapefile文件(.shp,.shx,.dbf等格式)。
Esri和XBase文件格式在设计和存储效率方面非常适宜,这是shapefile格式流行的原因之一,尽管当今存储和交换GIS数据的方法众多。
Pyshp与Python 2.4-3.x兼容。本文档提供的是pyshp读写shapefile的示例。 然而,更多的例子在GitHub pyshp wiki中,博客 http://GeospatialPython.com ,还可以通过 http://gis.stackexchange.com 搜索pyshp。
目前,示例中引用的样本人口普查块组shapefile可在GitHub项目网站 https://github.com/GeospatialPython/pyshp 上获得。 这些例子是开箱即用,你也可以轻松地运行它,只需要对你自己的shapefile小小的修改即可。
提示:如果您是GIS新手,您应该阅读有关地图投影的相关信息。 请访问:https://github.com/GeospatialPython/pyshp/wiki/Map-Projections
我真诚地希望这个简单地读取并写入数据,真诚地您日后可关注一些地理空间项目的具有挑战与有趣的部分。
Python Shapefile Library的下载与安装
Python Shapefile Library下载地址:https://code.google.com/p/pyshp/ ,目前已托管到 GitHub 中。
Python Shapefile Library是一个纯 Python 库,使用时无需安装,只需在Python程序中导入该模块文件即可。
In [1]:
import shapefile
在做任何操作之前,您必须导入库。
以下示例将使用美国人口普查局Blockgroups数据集创建的shapefile,(美国人口普查局,位于加利福尼亚州旧金山附近),可在pyshp GitHub站点的github存储库中找到。具体导入方法请参考 Python 教程中模块的导入章节。
读取Shapefile
Python Shapefile Library提供了Reader类功能,可创建Reader类的对象,完成shapefile文件的读操作。
使用的是Python Shapefile Library读取shapefile文件的"几何数据"(Geometry)和"属性数据"(Attribute Record)
"几何数据"一般由多个几何对象组成,比如一个"点文件",每个点就是一个对象;对于一个多边形文件,每个对象可能包含多个多边形,每个多边形又称为"块(parts)",每个 "块"由多个点组成。
每个几何对象包含4个属性:数据类型(shapeType),代表该"几何数据"对象的数据类型(点,shapeType=1,线,shapeType=3,多边形,shapeType=5);数据范围(bbox),只针对多点数据,代表该"几何数据"对象的边界范围;数据块(parts),只针对线或者多边形,代表该"几何数据"对象各个块的第一个点的索引;点集(points),代表该"几何数据"对象的所有点坐标。
"属性数据"即每个"几何数据"对象在属性表中的对应项。
若要读取shapefile,需创建一个新的“Reader”对象,命名为现有shapefile的名称。 shapefile格式可以写成以下三种文件格式:
In [2]:
import shapefile
sf = shapefile.Reader("/gdata/GSHHS_c")
您可以指定shapefile的基本文件名或任何shapefile组件的完整文件名。
或者
In [3]:
sf = shapefile.Reader("/gdata/GSHHS_c.shp")
或者
In [4]:
sf = shapefile.Reader("/gdata/GSHHS_c.dfb")
或任何一种均是shapefile的格式。 库对文件扩展名并无严格限定。
从文件类对象读取shapefile
在任意Python文件对象中您还可以用关键字参数加载shapefile,可以指定三个文件中的任何一个。 此功能非常强大,您可以从url,zip文件,序列化对象或某些情况下的数据库中加载shapefile。
In [5]:
myshp = open("/gdata/GSHHS_c.shp", "rb")
mydbf = open("/gdata/GSHHS_c.dbf", "rb")
r = shapefile.Reader(shp=myshp, dbf=mydbf)
注意在述示例中,shx文件从不使用。 shx文件是shp文件中的可变长度记录的非常简单的固定记录索引。该文件的可读性是可选的。 如果可用pyshp将使用shx文件访问形状记录一点更快,但会做没有它只是没有它。
"几何数据"的读取方法
"几何数据"通过Reader类的shapes( )和shape( )方法读取,二者的区别在于:shapes()方法不需要指定参数,其返回值是一个列表,包含该文件中所有的"几何数据"对象,而shape( )方法需要指定参数,返回的是所需要的"几何数据"对象。
shapefile的几何形状是表示物理位置的隐含弧形的点或形状的集合。 所有类型的shapefile只存储点。
你可以调用shapes()方法获得shapefile的几何列表。
In [6]:
shapes = sf.shapes()