python2.x之pyshp的使用

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

用法详见代码中:

 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地形图分幅:

 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")

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

Excel常用函数大全

我们在使用Excel制作表格整理数据的时候,常常要用到它的函数功能来自动统计处理表格中的数据。这里整理了Excel中使用频率最高的函数的功能、使用...

3729
来自专栏后端技术探索

(答案来了)两道腾讯面试题目

前天推送的文章《两道腾讯技术面试题(二面经历)》,收到了不少留言,感兴趣的可以去哪篇文章下查看精选留言,有一多半同学没有正确理解题目,可分享的留言寥寥无几,根据...

1041
来自专栏程序员互动联盟

【专业技术】Android平台下使用OpenGL

存在问题: 安卓平台下如何使用opengl? 解决方案: 1、GLSurfaceView GLSurfaceView是Android应用程序中实现OpenGl画...

3836
来自专栏文渊之博

小议如何使用APPLY

简介 如果你打算为在结果集中的每条记录写一个调用表值函数或者表值表达式的select语句,那么你就能用到APPLY 操作符来实现。一般又两种形式写法: 第一种格...

1745
来自专栏逸鹏说道

小白眼中的AI之~Numpy基础

引入一下 Numpy模块, Numpy的数组使用可以查看一下帮助文档, Numpy的 array数组类型必须是一致的(后面会讲)

1044
来自专栏决胜机器学习

PHP数据结构(十一) ——图的连通性问题与最小生成树算法(2)

PHP数据结构(十一)——图的连通性问题与最小生成树算法(2) (原创内容,转载请注明来源,谢谢) 再次遇到微信公众号限制字数3000字的问题。因此将...

41910
来自专栏王小雷

Python之数据规整化:清理、转换、合并、重塑

Python之数据规整化:清理、转换、合并、重塑 1. 合并数据集 pandas.merge可根据一个或者多个不同DataFrame中的行连接起来。 panda...

2526
来自专栏从流域到海域

Python reduce()函数

MapReduce: Simplified Data Processing on Large Clusters Jeffrey Dean and Sanj...

1969
来自专栏程序生活

Python json 模块dumps、dump、loads、load的使用

本文主要讲下json.dumps和json.dump、json.loads和json.load的区别,因为经常需要加载json文件,读取数据,傻傻分不清...

711
来自专栏数据结构与算法

17:文字排版

17:文字排版 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻...

3027

扫码关注云+社区