python: 读取线 的shp文件
- Shape files数据说明
Shape files是ESRI提供的一种矢量数据格式,它没有拓扑信息,一个Shape files由一组文件组成,其中必要的基本文件包括坐标文件(.shp)、索引文件(.shx)和属性文件(.dbf)三个文件。
坐标文件的结构说明
坐标文件(.shp)用于记录空间坐标信息。它由头文件和实体信息两部分构成(如图2.1所示)。
坐标文件的文件头
坐标文件的文件头是一个长度固定(100 bytes)的记录段,一共有9个int型和7个double型数据,主要记录内容见下表
起始位置
|
名称
|
数值
|
类型
|
位序
|
0
|
File Code
|
9994
|
Integer
|
big
|
4
|
Unused
|
0
|
Integer
|
big
|
8
|
Unused
|
0
|
Integer
|
big
|
12
|
Unused
|
0
|
Integer
|
big
|
16
|
Unused
|
0
|
Integer
|
big
|
20
|
Unused
|
0
|
Integer
|
big
|
24
|
文件长度
|
文件的实际长度
|
Integer
|
big
|
28
|
版本号
|
1000
|
Integer
|
Little
|
32
|
几何类型
|
表示这个Shapefile文件所记录的空间数据的几何类型
|
Integer
|
Little
|
36
|
Xmin
|
空间数据所占空间范围的X方向最小值
|
Double
|
Little
|
44
|
Ymin
|
空间数据所占空间范围的Y方向最小值
|
Double
|
Little
|
52
|
Xmax
|
空间数据所占空间范围的X方向最大值
|
Double
|
Little
|
60
|
Ymax
|
空间数据所占空间范围的Y方向最大值
|
Double
|
Little
|
68*
|
Zmin
|
空间数据所占空间范围的Z方向最小值
|
Double
|
Little
|
76*
|
Zmax
|
空间数据所占空间范围的Z方向最大值
|
Double
|
Little
|
84*
|
Mmin
|
最小Measure值
|
Double
|
Little
|
92*
|
Mmax
|
最大Measure值
|
Double
|
Little
|
shapefiles 头文件表
- 实体信息的内容
实体信息负责记录坐标信息,它以记录段为基本单位,每一个记录段记录一个地理实体目标的坐标信息,每个记录段分为记录头和记录内容两部分。
记录头的内容包括记录号(Record Number)和坐标记录长度(Content Length) 两个记录项。它们的位序都是big。记录号(Record Number)和坐标记录长度(Content Length) 两个记录项都是int型,并且shapefile文件中的记录号都是从1开始的。
记录内容包括目标的几何类型(ShapeType)和具体的坐标记录(X、Y) ,记录内容因要素几何类型的不同其具体的内容及格式都有所不同。下面分别介绍点状目标(Point)、线状目标(PolyLine)和面状目标(Polygon)三种几何类型的.shp文件的记录内容:
- 点状目标
shapefile中的点状目标由一对X、Y坐标构成,坐标值为双精度型(double)。点状目标的记录内容如表2.4:
记录项
|
数值
|
数据类型
|
长度
|
个数
|
位序
|
几何类型(ShapeType)
|
1(表示点状目标)
|
int型
|
4
|
1
|
Little
|
X方向坐标
|
X方向坐标值
|
double型
|
8
|
1
|
Little
|
Y方向坐标
|
Y方向坐标值
|
double型
|
8
|
1
|
Little
|
点状目标的记录内容
- 线状目标
shapefile中的线状目标是由一系列点坐标串构成,一个线目标可能包括多个子线段,子线段之间可以是相离的,同时子线段之间也可以相交。Shapefile允许出现多个坐标完全相同的连续点,当读取文件时一定要注意这种情况,但是不允许出现某个退化的、长度为0的子线段出现。线状目标的记录内容如表2.5:
记录项
|
数值
|
数据类型
|
长度
|
个数
|
位序
|
几何类型(ShapeType)
|
3(表示线状目标)
|
int型
|
4
|
1
|
Little
|
坐标范围(Box)
|
表示当前线目标的坐标范围
|
double型
|
32
|
4
|
Little
|
子线段个数(NumParts)
|
表示构成当前线目标的子线段的个数
|
int型
|
4
|
1
|
Little
|
坐标点数(NumPoints)
|
表示构成当前线目标所包含的坐标点个数
|
int型
|
4
|
1
|
Little
|
Parts数组
|
记录了每个子线段的坐标在Points数组中的起始位置
|
int型
|
4×NumParts
|
NumParts
|
Little
|
Points数组
|
记录了所有的坐标信息
|
Point型
|
根据点个数来确定
|
NumPoints
|
Little
|
线状目标的记录内容
- 具体的数据结构如下:
PolyLine
{
Double[4] Box // 当前线状目标的坐标范围
Integer NumParts // 当前线目标所包含的子线段的个数
Integer NumPoints // 当前线目标所包含的顶点个数
Integer[NumParts] Parts // 每个子线段的第一个坐标点在Points的位置
Point[NumPoints] Points // 记录所有坐标点的数组
}
- 面状目标
shapefile中的面状目标是由多个子环构成,每个子环是由至少四个顶点构成的封闭的、无自相交现象的环。对于含有岛的多边形,构成它的环有内外环之分,每个环的顶点的排列顺序或者方向说明了这个环到底是内环还是外环。一个内环的顶点是按照逆时针顺序排列的;而对于外环,它的顶点排列顺序是顺时针方向。如果一个多边形只由一个环构成,那么它的顶点排列顺序肯定是顺时针方向。
每条多边形记录的数据结构与线目标的数据结构完全相同,
Polygon
{
Double[4] Box // 当前面状目标的坐标范围
Integer NumParts // 当前面目标所包含的子环的个数
Integer NumPoints // 构成当前面状目标的所有顶点的个数
Integer[NumParts] Parts // 每个子环的第一个坐标点在Points的位置
Point[NumPoints] Points // 记录所有坐标点的数组
}
对于一个shapefile中的多边形,它必须满足下面三个条件:
构成多边形的每个子环都必须是闭合的,即每个子环的第一个顶点跟最后一个顶点是同一个点;
每个子环在Points数组中的排列顺序并不重要,但每个子环的顶点必须按照一定的顺序连续排列;
存储在shapefile 中的多边形必须是干净的。所谓一个干净的多边形,它必须满足两点:
- 没有自相交现象—-这就要求任何一个子环不能跟其它的子环相交,共线的现 象也将被当作相交。但是允许两个子环的顶点重合;
- 对于一个不含岛的多边形或者是含岛的多边形的外环,它们的顶点排列顺序必须是顺时针方向;而对于内环,它的排列顺序必须是逆时针方向。所谓的“脏多边形”就是指顶点排列顺序为顺时针的内环。
import shapefile
sf = shapefile.Reader("E:\\1.2\\cs\\DX_CSL.shp")
shapes = sf.shapes()
print shapes[1].parts
print len(shapes) #79条记录
#print len(list(sf.iterShapes())) #79条记录
#for name in dir(shapes[3]): #不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表
# if not name.startswith('__'):
# print name
print sf.numRecords
recds = sf.records()
for i in range(sf.numRecords):
rcd = sf.record(i)
#sp = rcd.shape 没有shape属性
#print sp.points
#recds.shape
#读取记录
print sf.shapeRecord(1).shape.shapeType
print sf.shapeRecord(1).record
print sf.fields
print ''
for shp in range(len(shapes)):
shap = shapes[shp]
print shap.points
print shap.shapeType
print len(shap.points)
for i in range(len(shap.points)):
print shap.points[i]
for x in range(len(shap.points[i])):
print shap.points[i][x]
转载自:https://blog.csdn.net/DinnerHowe/article/details/79010483