麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

Python读取、创建shapefile文件

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 osr
import 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
# 要素1
file.point(100.11, 30.5)
file.record('First', 'Point')#写入输定信息
# 要素2
file.point(120.11, 30.5)
file.record('Second', 'Point')
# 要素3
file.point(100.11, 35.5)
file.record('Third', 'Point')
# 要素4
file.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_2000
wkt = proj.ExportToWkt()
# 写入投影
f = open(data_address.replace(".shp", ".prj"), 'w') f.write(wkt)#写入投影信息
f.close()#关闭操作流

线状要素类的创建

# -*- coding: utf-8 -*-
import osr
import shapefile # 使用pyshp
data_address = "./output/polyline01.shp"# 新建数据存放位置 file = shapefile.Writer(data_address)
# 创建两个字段
file.field('FIRST_FLD')
file.field('SECOND_FLD', 'C', '40') # 'SECOND_FLD'为字段名称,C代表数据类型为字符串, 长度为40
file.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_2000
wkt = proj.ExportToWkt()
# 写入投影
f = open(data_address.replace(".shp", ".prj"), 'w') f.write(wkt)
f.close()

面状要素类的创建

# -*- coding: utf-8 -*-
import osr
import shapefile # 使用pyshp
data_address = "./output/polygon01.shp" # 新建数据存放位置 file = shapefile.Writer(data_address)
# 创建两个字段
file.field('FIRST_FLD')
file.field('type', 'C', '40') # 'SECOND_FLD'为字段名称,C代表数据类型为字符串,长度为 40
file.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_2000
wkt = proj.ExportToWkt()
# 写入投影
f = open(data_address.replace(".shp", ".prj"), 'w') f.write(wkt)
f.close()

创建后的要素类效果展示

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

字段信息表

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

批量创建要素类

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

某天的部分数据预览:

数据生成核心代码:

数据生成效果展示:

完整代码下载

麻辣GIS为了防止资源恶意爬取导致被和谐,此处内容被作者隐藏。
验证码:

关注本站微信公众号,回复“资源下载”,获取验证码。

在微信里搜索“麻辣GIS”或微信扫描右侧二维码即可关注本站微信公众号。

相关阅读

麻辣GIS-fungis

作者:

一个努力搬砖的GISer

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

仅有一条评论

  1. 麻辣GIS-感谢经历
    1#
    感谢经历  · 2020-08-22 15:34

    很好的教程!

留言板(小编看到第一时间回复)