前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python2.x之pyshp的使用

python2.x之pyshp的使用

作者头像
用户1432189
发布2018-09-05 10:04:05
1.3K0
发布2018-09-05 10:04:05
举报
文章被收录于专栏:zingpLiuzingpLiu

pyshp是python读写shape文件的一个很简单的库。下面记录其用法:

用法详见代码中:

代码语言:javascript
复制
 1 #! /usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 import shapefile
 5 
 6 sf = shapefile.Reader("shapefile/d_map_1000000.shp")
 7 shapes = sf.shapes()     # shapes方法返回描述每个形状记录的几何形状的Shape对象的列表。
 8 
 9 print(len(shapes))      # 2130
10 print (shapes[5])       # <shapefile._Shape instance at 0x03785530>     
11 
12 for name in dir(shapes[5]):
13     if not name.startswith('__'):
14         print(name)
15 # 这个对象有4个属性
16 # bbox
17 # parts
18 # points
19 # shapeType
20 
21 
22 print("shapes[5].bbox:",shapes[5].bbox)    # bbox:如果形状类型包含多个点,则此元组描述左下角(x,y)坐标和右上角坐标,
23 # 在点周围创建一个完整的框。 如果shapeType是Null(shapeType == 0),则会引发AttributeError。
24 # ('shapes[5].bbox:', [-60.0, -88.0, -36.0, -84.0])
25 
26 
27 print("shapes[5].parts:",shapes[5].parts)   # parts:只需将点集合分组为形状。 如果形状记录具有多个部分,则该属性包含每个部分的第一点的索引。
28 # 如果只有一个部分,则返回包含0的列表。
29 # ('shapes[5].parts:', [0])
30 
31 
32 print("shapes[5].points:",shapes[5].points)     # points属性包含一个元组列表,其中包含形状中每个点的(x,y)坐标
33 # ('shapes[5].points:', [(-60.0, -84.0), (-60.0, -88.0), (-36.0, -88.0), (-36.0, -84.0), (-60.0, -84.0)])
34 
35 print("shapes[5].points lenth:",len(shapes[5].points))  #('shapes[5].points lenth:', 5)
36 print("shapes[5].shapeType:",shapes[5].shapeType)   # shapeType:表示由shapefile规范定义的形状类型的整数。
37 # ('shapes[5].shapeType:', 5)
38 
39 fields = sf.fields     # 字段列表
40 print("多少字段:%s" % len(fields))  # 多少字段:9
41 print(fields)
42 # [('DeletionFlag', 'C', 1, 0), ['name', 'C', 32, 0], ['column', 'C', 32, 0], ['row', 'C', 32, 0], ['NS', 'C', 32, 0],
43 #  ['type', 'C', 32, 0], ['latitude', 'C', 32, 0], ['lat_diff', 'C', 32, 0], ['lon_diff', 'C', 32, 0]]
44 # 字段名:描述此列索引处的数据的名称。
45 # 字段类型:此列索引处的数据类型。类型可以是:字符,数字,长,日期或备忘。 “备忘”类型在GIS中没有意义,而是xbase规范的一部分。
46 # 字段长度:在此列索引处找到的数据的长度。较旧的GIS软件可能会将此长度截短为“字符”字段的8或11个字符。
47 # 小数长度:在“数字”字段中找到的小数位数。
48 
49 
50 records1 = sf.records()      # 通过调用records()方法获取shapefiles记录的列表。
51 print(len(records1))        # 2130
52 print(records1[5])          # ['DS2206', '22', '06', 'S', 'D', '-88--76', '4', '24']
53 
54 
55 shapeRecs = sf.shapeRecords()
56 # 同时读取几何和记录
57 # 您希望同时检查记录的几何和属性。 shapeRecord()和shapeRecords()方法让你做到这一点。
58 #
59 # 调用shapeRecords()方法将返回所有形状的几何和属性作为ShapeRecord对象的列表。
60 # 每个ShapeRecord实例都有一个“shape”和“record”属性。 形状属性是一个ShapeRecord对象,在第一部分“阅读几何”中被分割。
61 # 记录属性是如“读取记录”部分中所示的字段值列表。
62 shapeRecs[3].record[1:3]
63 points = shapeRecs[3].shape.points[0:2]

上述主要将的是shape文件的读,下面我举个例子来说明怎么写shape文件:

1:1000000地形图分幅:

代码语言:javascript
复制
 1 #! /usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 from public import create_shapefile
 5 import settings
 6 
 7 # 1:1 000 000 地形图分幅
 8 class CreateShapefile(object):
 9 
10     def __init__(self,filename):
11         self.filename = filename
12         self.map_type = settings.MAP_TYPE
13         self.fields   = settings.MAP_FIELDS
14         self.w        = create_shapefile(self.fields)
15         for item in settings.LAT_LON_RANGE:
16             self.create_poly(item)
17         self.w.save(self.filename)
18 
19     def create_poly(self, args):
20         lat_start,lat_final,lat_diff = args[0],args[1],args[2]
21         lon_start,lon_final,lon_diff = args[3],args[4],args[5]
22         latitude  = "{0}/{1}".format(str(lat_start),str(lat_final))    # 纬度范围
23         for lat in range(lat_start,lat_final,lat_diff):
24             for lon in range(lon_start,lon_final,lon_diff):
25 
26                 a = [lon, lat + lat_diff]                 # 左上角的点坐标
27                 b = [lon, lat]                            # 左下角的点坐标
28                 c = [lon + lon_diff, lat]                 # 右上角的点坐标
29                 d = [lon + lon_diff, lat + lat_diff]      # 右下角的点坐标
30 
31                 row, NS = self.row_1_1000000(lat,lat_diff)         # 行号和南北半球
32                 column  = self.column_1_1000000(lat,lon,lon_diff)  # 列号
33                 name    = "D{0}{1}{2}".format(NS, row, column)     # 分幅编码
34 
35                 self.w.poly(parts=[[a, b, c, d, a]])               # 为多边形添加点
36                 self.w.record(name,name, row, column, NS, self.map_type, latitude, lat_diff, lon_diff)  # 添加字段的值
37 
38 
39     def row_1_1000000(self,lat,lat_diff):
40         """
41         功能:计算1:1000000行号和南北半球。
42         输入:lat  纬度
43               lat_diff  纬差
44         返回:row 行号
45               NS  南北半球
46         """
47         if lat < 0:
48             NS = "S"
49             row = abs(lat) / lat_diff
50         else:
51             NS = "N"
52             row = (lat + lat_diff) / lat_diff
53         if row < 10:
54             row = "0{0}".format(row)
55         return row,NS
56 
57     def column_1_1000000(self,lat,lon,lon_diff):
58         """
59         功能:计算1:1000000列号。
60         输入:lat  纬度
61               lon  经度
62               lon_diff  经差
63         返回:column列号
64         """
65         if -60 <= lat < 60:x = 31
66         elif 60 <= lat < 76 or -76 <= lat < -60:x = 16
67         else:x = 8.5
68         column = int(float(lon)/lon_diff + x)
69         if column < 10: column = "0{0}".format(column)
70         return column
71 
72 if __name__ == "__main__":
73     shape_file = CreateShapefile("shapefile/d_map_1_1000000")
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档