使用Python Shapefile Library创建和编辑Shapefile文件
2013-05-07 21:23阅读:
shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature
Classes),主要包括点(point)、线(polyline)和多边形(polygon)。Python脚本是ArcGIS官方推荐的脚本语言,通过Python脚本能够很方便的调用ArcGIS中的各种工具和函数批量完成所需操作。本文所介绍的这个库(Python
Shapefile
Library)是一个Python库,用于在Python脚本中对ArcGIS中的Shapefile文件(.shp,.shx,.dbf等格式)进行读写操作。
1、Python Shapefile
Library的下载与安装:
Python Shapefile Library
下载地址:https://code.google.com/p/pyshp/
Python Shapefile
Library使用时无需安装,只需在Python程序中导入该模块文件即可(import
shapefile,具体导入方法参考Python教程中模块的导入部分)
2、Shapefile文件的读操作
2.1 Python Shapefile
Library提供了Reader类,通过创建Reader类的对象(如下面的sf)进行shapefile文件的读操作:
sf = shapefile . Reader ('shapefile
name')
2.2 使用Python Shapefile
Library读取shapefile文件的'几何数据'(Geometry)和'属性数据'(Attribute
Record)
'几何数据'一般有多个几何对象组成,比如一个'点文件',每个点就是一个对象;对于一个多边形文件,每个对象可能包含有多个多边形,每个多边形又称为'块(parts)',每个
'块'由多个点组成。
每个几何对象包含有4个属性:数据类型(shapeType),代表该'几何数据'对象的数据类型(点,shapeType=1,线,shapeType=3,多边形,shapeType=5);数据范围(bbox),只针对多点数据,代表该'几何数据'对象的边界范围;数据块(parts),只针对线或者多边形,代表该'几何数据'对象各个块的第一个点的索引;点集(points),代表该'几何数据'对象的所有点坐标。
'属性数据'即每个'几何数据'对象在属性表中的对应项。
2.2.1'几何数据'的读取方法
'几何数据'通过Reader类的shapes(
)和shape(
)方法来读取,二者的区别在于:shapes()方法不需要指定参数,其返回值是一个列表,包含该文件中所有的'几何数据'对象,而shape(
)方法则需要通过指定参数返回所需要的'几何数据'对象。
Shapes = sf.shapes(
),Shapes是一个列表(相当于一维数组),存放着该文件中所有的'几何数据'对象
Shape =
sf.shape(0),Shape是第1个'几何数据'对象
通过shapeType,bbox,points,parts返回每个'几何数据'对象的属性信息:
Shapes(0).shapeType,返回第1个对象的数据类型属性(或者Shape.shapeType)
Shapes(2).bbox,返回第3个对象的数据范围(左下角的x,y坐标和右上角的x,y坐标)
Shape(3).points,返回第4个对象的所有点坐标
Shape(1).parts,返回第2个对象的每个'块'的第一个点坐标
2.2.2 '属性数据'的读取方法
'属性数据'通过Reader类的records(
)和record(
)方法来读取,其区别和使用方法同shapes(
)和shape(
)。
'属性数据'的fields通过Reader类的fields方法来获取,其返回值为包括属性表每个字段的名称、数据类型、数据长度等的一个列表。
2.2.3
'几何数据'和'属性数据'同时读取的方法
通过Reader类的shapeRecords(
)和shapeRecord(
)方法可以同时读取shapefile文件的'几何数据'和'属性数据'。
ShapeRecords = sf.shapeRecords(
).
ShapeRecords[0].shape.shapeType,返回第1个对象的'几何数据'的数据类型属性
ShapeRecords[0].record[1:3],返回第1个对象的'属性数据'的第2和第3个属性值
3 shapefile文件的写操作
3.1 Python Shapefile
Library提供了Writer类,通过创建Writer类的对象(如下面的sf)进行shapefile文件的写操作:
sf = shapefile .Writer (shapeType =
1)
3.2 文件类型的确定
写shapefile文件时,首先要确定shapeType,可以通过以下两种方法确定:
1、在创建Writer类对象时直接确定shapeType,如上所示
2、通过为Writer类对象的shapeType属性赋值,如sf.shapeType
= 1
3.3 '几何数据'与'属性数据'的自动平衡
shapefile文件要求'几何数据'与'属性数据'要有一一对应的关系,如果有'几何数据'而没有相应的属性值存在,那么在使用ArcGIS软件打开所创建的shapefile文件时会出错。为了避免这种情况的发生,可以设置
sf.autoBalance =
1,以确保每创建一个'几何数据',该库会自动创建一个属性值(空的属性值)来进行对应。autoBalance默认为0。
3.4 shapefile文件的创建
shapefile文件的创建分为2步:
1、创建'几何数据',通过Writer类的point(x,y,z,m)方法创建点数据,通过poly(parts
= [ [ [1,5], [5,5], [5,1], [3,3], [1,1] ]
])方法创建线(parts有2个点)或多边形数据(parts
>
2个点)。
2、创建'属性数据',首先通过field()方法创建属性表字段,然后通过record()方法为每个几何数据添加相应的属性值。
(field的创建可以参见http://gis.stackexchange.com/questions/35593/using-the-python-shape-library-pyshp-how-to-convert-csv-file-to-shp
)
例1:
>>>w = shapefile.Writer()
>>>w.autoBalance = 1
>>>w =
shapefile.Writer(shapefile.POINT)
>>>w.point(1,1)
>>>w.point(3,1)
>>>w.point(4,3)
>>>w.point(2,2)
>>>w.field('FIRST_FLD')
>>>w.field('SECOND_FLD','C','40')
#'SECOND_FLD'为字段名称,C代表数据类型为字符串,长度为40
>>>w.record('First','Point')
>>>w.record('Second','Point')
>>>w.record('Third','Point')
>>>w.record('Fourth','Point')
>>>w.save('shapefiles/test/point')
例2:
>>>w = shapefile.Writer()
>>>w.autoBalance = 1
>>>w =
shapefile.Writer(shapefile.POLYGON)
>>>w.poly(parts=[[[1,5],[5,5],[5,1],[3,3],[1,1]]])
>>>w.field('FIRST_FLD','C','40')
>>>w.field('SECOND_FLD','C','40')
>>>w.record('First','Polygon')
>>>w.save('shapefiles/test/polygon')
例3:
>>>w = shapefile.Writer()
>>>w.autoBalance = 1
>>>w =
shapefile.Writer(shapefile.POLYLINE)
>>>w.line(parts=[[[1,5],[5,5],[5,1],[3,3],[1,1]]])
>>>w.poly(parts=[[[1,3],[5,3]]],
shapeType=shapefi