免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 7185|回复: 53
收起左侧

「GIS教程」Python读取、创建shapefile文件

    [复制链接]

324

主题

56万

铜板

1172

好友

管理员

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
349368

宣传勋章爱心勋章组织勋章官方团队冰雪节勋章

发表于 2020-7-9 15:18 | 显示全部楼层 |阅读模式
文 / fungis
一个热带生活、乐于分享、努力搬砖的giser
shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature Class),主要包括 点(point)、线(polyline)和多边形(polygon)。Python脚本是ArcGIS官方推荐的脚本语言,通过Python脚 本能够很方便的调用ArcGIS中的各种工具和函数批量完成所需操作。本文所介绍的这个库(Python Shapefile Library)是一个Python库,用于在Python脚本中对ArcGIS中的Shapefile文件 (.shp,.shx,.dbf等格式)进行读写操作。

开发准备
安装命令:


pip install pyshp
使用导入:


import shapefile
我这里用的是pyshp 2.1的版本,旧的版本方法调用方式跟新的版本有差异。

shapefile文件的读取
文件读取和显示功能有点“鸡肋”,文件展示功能不如geopandas库,不过不要心急,下面有更强势的地方。

- coding: utf-8 -*- import shapefile # 使用pyshp# file = shapefile.Reader("E://arcgisData//行政区划数据//省界_region.shp") file = shapefile.Reader("./data-use/shapefile/中国省级行政区划.shp")# 读取元数据print(str(file.shapeType)) # 输出shp类型print(file.encoding) # 输出shp文件编码 print(file.bbox) # 输出shp的文件范围-四至矩形范围 print(file.numRecords) # 输出shp文件的要素数据 print(file.fields) # 输出所有字段信息 print(file.records()) # 输出所有属性表
显示效果:


shapefile文件的创建
要素类的创建效率很高,既能创建要素实体,也能写入属性信息和定义投影。下面先简单介绍下三种要素类的创建方法。

点状要素类的创建
# -*- coding: utf-8 -*-import osrimport shapefile # 使用pyshp# data_address = "E:\gisData\shapefile\point05.shp" # 新建数据存放位置 data_address = "./output/point05.shp" # 新建数据存放位置file = shapefile.Writer(data_address)# 创建两个字段file.field('FIRST_FLD') # file.field('FIRST_FLD', 'N',0 '31') # 数值类型 file.field('type', 'C', '40') # 'SECOND_FLD'为字段名称,C代表数据类型为字符串,长度为4# 要素1file.point(100.11, 30.5)file.record('First', 'Point')#写入输定信息# 要素2file.point(120.11, 30.5)file.record('Second', 'Point')# 要素3file.point(100.11, 35.5)file.record('Third', 'Point')# 要素4file.point(160.11, 50.6)file.record('Fourth', 'Point')file.close()# 定义投影proj = osr.SpatialReference() proj.ImportFromEPSG(4326) # 4326-GCS_WGS_1984; 4490- GCS_China_Geodetic_Coordinate_System_2000wkt = proj.ExportToWkt()# 写入投影f = open(data_address.replace(".shp", ".prj"), 'w') f.write(wkt)#写入投影信息f.close()#关闭操作流
线状要素类的创建
# -*- coding: utf-8 -*-import osrimport shapefile # 使用pyshpdata_address = "./output/polyline01.shp"# 新建数据存放位置 file = shapefile.Writer(data_address)# 创建两个字段file.field('FIRST_FLD')file.field('SECOND_FLD', 'C', '40') # 'SECOND_FLD'为字段名称,C代表数据类型为字符串, 长度为40file.line([[[100.1, 5], [105.1, 5], [110.1, 1], [160.1, 3], [101, 1]]])file.record('First', 'polyline') file.line([[[1, 500], [300, 30], [1, 16]]]) file.record('Second', 'polyline')# 写入数据file.close()# 定义投影proj = osr.SpatialReference() proj.ImportFromEPSG(4326) # 4326-GCS_WGS_1984; 4490- GCS_China_Geodetic_Coordinate_System_2000wkt = proj.ExportToWkt()# 写入投影f = open(data_address.replace(".shp", ".prj"), 'w') f.write(wkt)f.close()
面状要素类的创建
# -*- coding: utf-8 -*-import osrimport shapefile # 使用pyshpdata_address = "./output/polygon01.shp" # 新建数据存放位置 file = shapefile.Writer(data_address)# 创建两个字段file.field('FIRST_FLD')file.field('type', 'C', '40') # 'SECOND_FLD'为字段名称,C代表数据类型为字符串,长度为 40file.poly([[[117.210024,40.082262],[117.105315,40.074479], [117.105315,40.074479],[117.102851,40.073563],[116.720969,39.599884]]]) file.record('First', 'polygon')file.poly([[[110.210024,40.082262],[110.105315,40.004409], [110.105315,40.004409],[110.102851,40.003563],[112.020969,40.599884]]]) file.record('Second', 'polygon')file.poly([[[112.05,38.056],[112.05,40.056],[115.05,40.056],[114.05,37.056]]]) file.record('third', 'polygon')# 关闭文件操作流file.close()# 定义投影proj = osr.SpatialReference() proj.ImportFromEPSG(4326) # 4326-GCS_WGS_1984; 4490- GCS_China_Geodetic_Coordinate_System_2000wkt = proj.ExportToWkt()# 写入投影f = open(data_address.replace(".shp", ".prj"), 'w') f.write(wkt)f.close()
创建后的要素类效果展示

当然创建后的要素类还包含属性信息,不过图中没办法展示。

640.webp (1).jpg


字段信息表
它是ArcGIS中的字段资源的类型。比如说字符串类型长度为40,在创建时可以写成file. .field('type', 'C', '40')、比如说双精度类型4位小数,可以写成file.field(columns_list, 'N', '31', decimal=4)

640.webp (2).jpg


批量创建要素类
看完的你,可能还是会感觉到“鸡肋”,我用ArcMap就能实现的功能,要你有何用。不过,我最近在 处理气象数据,用它大大提高了效率。我的数据是这样的一天一张表格,有699个站点,时间跨度好几 年,需要生成点状要素类。也就是说一年有365个表格,代表需要生成365个点状要素类,一个要素类 中包含699条记录。某天的部分数据预览:

640.webp (3).jpg

数据生成核心代码:

640.webp (4).jpg

数据生成效果展示:

640.webp (5).jpg

640.webp (6).jpg



本文转载来自 麻辣GIS
版权归作者所有,如有侵权请联系删除





5

主题

2万

铜板

23

好友

VIP会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
690

精华勋章爱心勋章地信元老活跃勋章贡献勋章冰雪节勋章10周年纪念勋章

发表于 2020-7-9 16:53 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1

主题

2万

铜板

2

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
875
发表于 2020-7-9 17:48 | 显示全部楼层
妥妥的干货啊!!很赞!谢谢分享
回复 支持 反对

使用道具 举报

11

主题

2万

铜板

8

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2620

童话节勋章

发表于 2020-7-9 18:02 | 显示全部楼层
222222222222222222222
回复 支持 反对

使用道具 举报

11

主题

2万

铜板

8

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2620

童话节勋章

发表于 2020-7-12 14:19 | 显示全部楼层
6666666666666666666666666
回复 支持 反对

使用道具 举报

0

主题

352

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
100
发表于 2020-7-21 17:16 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

251

铜板

1

好友

技术员

Rank: 3Rank: 3

积分
44
发表于 2020-11-11 23:09 | 显示全部楼层
学习了,谢谢分享
回复 支持 反对

使用道具 举报

4

主题

760

铜板

2

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
431
发表于 2020-11-19 21:48 | 显示全部楼层

谢谢分享!!!
回复

使用道具 举报

4

主题

760

铜板

2

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
431
发表于 2020-11-19 21:50 | 显示全部楼层

谢谢分享!!!
回复

使用道具 举报

4

主题

760

铜板

2

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
431
发表于 2020-11-19 21:51 | 显示全部楼层

谢谢分享!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表