python: 读取线 的shp文件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DinnerHowe/article/details/79010483
  • Shape files数据说明
Shape filesESRI提供的一种矢量数据格式,它没有拓扑信息,一个Shape files由一组文件组成,其中必要的基本文件包括坐标文件(.shp、索引文件(.shx)和属性文件(.dbf)三个文件。
坐标文件的结构说明
坐标文件(.shp)用于记录空间坐标信息。它由头文件和实体信息两部分构成(如图2.1所示)。
坐标文件的文件头
坐标文件的文件头是一个长度固定(100 bytes)的记录段,一共有9int型和7double型数据,主要记录内容见下表

起始位置
名称
数值
类型
位序
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)和具体的坐标记录(XY) ,记录内容因要素几何类型的不同其具体的内容及格式都有所不同。下面分别介绍点状目标Point)、线状目标PolyLine)和面状目标(Polygon)三种几何类型的.shp文件的记录内容:
  • 点状目标
shapefile中的点状目标由一对XY坐标构成,坐标值为双精度型(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 中的多边形必须是干净的。所谓一个干净的多边形,它必须满足两点:
  1. 没有自相交现象----这就要求任何一个子环不能跟其它的子环相交,共线的现 象也将被当作相交。但是允许两个子环的顶点重合;
  2. 对于一个不含岛的多边形或者是含岛的多边形的外环,它们的顶点排列顺序必须是顺时针方向;而对于内环,它的排列顺序必须是逆时针方向。所谓的“脏多边形”就是指顶点排列顺序为顺时针的内环。

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]




展开阅读全文

没有更多推荐了,返回首页