麻辣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公众号 微信扫一扫关注

1. 微信扫码关注公众号,回复 资源下载 获取验证码

2. 在下方输入验证码并提交查看隐藏内容:

也可在微信搜索公众号“麻辣GIS”关注获取

相关阅读

麻辣GIS-fungis

作者:

一个努力搬砖的GISer

声明

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

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

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

已有 26 条评论

  1. Name
    Name 1#
    为什么要用第三方库?arcpy不香吗?
      1. 麻辣GIS
        麻辣GIS 作者
        有些时候系统没有装ArcGIS,比如Mac系统。
      2. Name
        Name
        谁用mac系统折腾GIS数据…
      3. 麻辣GIS
        麻辣GIS 作者
        用mac跑数据的不少,我见过用Mac Pro那种垃圾桶来跑的。另外服务器动态生成shp也可以用到
      4. Name
        Name
        政府项目的话服务器上都跑正版的ArcGIS,这还是啥问题[捂脸]
        现在都折腾超图了
      5. 麻辣GIS
        麻辣GIS 作者
        GIS不仅仅是ArcGIS,搞开源GIS多了去了。也不是每一个项目都会去买版权。PS:政府项目照样有用盗版的。
  2. 鸣蜩十柒
    鸣蜩十柒 2#
    能在py里调用数学模型处理数据吗?我寻思气象数据再多,按年分也是一年一张表啊,纵轴站点名称,横轴日期,坐标,海拔,需要的气象要素
      1. 麻辣GIS
        麻辣GIS 作者
        应该是可行的
  3. 在下河伯
    在下河伯 3#
    直接调用Arxtoolbox里的工具它不香吗[奸笑][奸笑][奸笑]
      1. 麻辣GIS
        麻辣GIS 作者
        香,但我这个可以跑在Mac上,还可以跑在Linux 上[呲牙]
      2. 在下河伯
        在下河伯
        的确。而且arcpy只能用Python2.7,好多Python3的功能都用不了。
      3. 麻辣GIS
        麻辣GIS 作者
        ArcGIS Pro可以搞Py3了。
  4. 刺玫会会士 Jim Zhang
    刺玫会会士 Jim Zhang 4#
    回复楼上调用数学模型 必然可行 甚至做复杂网络也好 做机器学习的回归也好 甚至用LSTM做预测也好 py是集大成者(就是速度慢点)
      1. 麻辣GIS
        麻辣GIS 作者
        就是速度慢点[微笑]
  5. 胡胜 华南师范大学
    胡胜 华南师范大学 5#
    熟悉了pandas 用geopandas也很好创建和删除等一些列操作
  6. 唐梓涯
    唐梓涯 6#
    为什么不用ArcPy?因为它不自由。开源软件可以实现的为什么用ArcPy,你看USGS,NASA,MARS他们都开源,要知道美国政府管不了开源但可以管住Esri、Mathworks这些公司
  7. 噗哧🐰
    噗哧🐰 7#
    我就是MAC pro哈哈哈哈哈哈哈哈
      1. 麻辣GIS
        麻辣GIS 作者
        资深老铁现身说法。
  8. 踏雪无痕
    踏雪无痕 8#
    为什么完整代码链接进不去啊
      1. 麻辣GIS
        麻辣GIS 作者
        点底下的阅读原文。
      2. 踏雪无痕
        踏雪无痕
        我点了,百度云的链接没法复制
  9. 心静平和
    心静平和 9#
    怎么下载?点原文没反应啊
      1. 麻辣GIS
        麻辣GIS 作者
        点最底下的
  10. 感谢经历
    感谢经历 10#
    很好的教程!
  11. 李小勇
    李小勇 11#
    我看前面讨论的正版问题,政府部门一定会有一个正版,但现在政府部门已经要求国产化,所以尽量用开源的
      1. 麻辣GIS
        麻辣GIS 作者
        ESRI已经成内企了

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