如何使用Python处理shp文件

涉及到空间数据处理的时候,为了比较清晰方便的看出空间数据所处的区域,通常都需要将省市边界线加到地图中。

Python中也提供了大量的shp文件处理方法,有底层的一些库,也有一些封装比较完整的库。比如:

•fiona[1]:基于ogr的封装,提供了更简洁的API•pyshp[2]:纯python实现的shape文件处理库,支持shp,shx和dbf文件的读写•ogr :gdal中的用于处理边界文件的模块•geopandas[3]:基于 fiona 进行了封装

fiona

安装

pip install fiona

读取shp文件

import fiona

shps = fiona.open('CHN_adm2.shp')

获取shp文件中属性信息

 >>> shps.schema

  {'properties': OrderedDict([('ID_0', 'int:10'),
                ('ISO', 'str:3'),
                ('NAME_0', 'str:75'),
                ('ID_1', 'int:10'),
                ('NAME_1', 'str:75'),
                ('ID_2', 'int:10'),
                ('NAME_2', 'str:75'),
                ('HASC_2', 'str:15'),
                ('CCN_2', 'int:10'),
                ('CCA_2', 'str:254'),
                ('TYPE_2', 'str:50'),
                ('ENGTYPE_2', 'str:50'),
                ('NL_NAME_2', 'str:75'),
                ('VARNAME_2', 'str:150')]),
   'geometry': 'Polygon'}

获取shp文件编码

 >>> shps.encoding
  'utf-8'

获取shp文件投影信息

>>> shps.crs
  {'init': 'epsg:4326'}

>>> shps.crs_kwt
  'GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_84",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433],AUTHORITY["EPSG","4326"]]

获取shape子文件

>>> shp = next(iter(shps))

查看shape子文件信息

>>> shp.keys()
dict_keys(['type', 'id', 'geometry', 'properties'])

type:表示shape子文件的类型 id:shape子文件的序号 geometry:包含shape子文件的类型和经纬度信息(字典类型),包含了 typecoordinates 两个关键词 properties:shape子文件的属性信息

>>> shp.get('type')
>>> shp.get('id')
>>> shp.get('geometry')

shps 变量包含了一些方法可以获取shape文件中的每个边界,比如 .next.iterms等。

.next 方法将在 fiona 2.0版本中移除,可改用 next(iter(shps))进行单个迭代,或者使用 shps.iterms 进行循环迭代。

fiona中提供了shp文件的读取方法,但是并没有提供可视化方法,如果使用fiona处理,还需要单独进行画图的操作。

写shp文件

构建shp文件的操作很少使用,但有时候可能需要从已有的shp文件中提取一个子区域。

subshp = fiona.open('subshp.shp', mode='w', 
                    crs=shps.crs, crs_wkt=shps.crs_wkt, 
                    driver=shps.driver, 
                    encoding=shps.encoding, 
                    schema=shps.schema)

fiona默认的方式是读,只需要改为写,然后提供源文件中的一些信息即可。

>>> shp = next(iter(shps))
>>> subshp.write(shp)  ## 写入字段
>>> subshp.flush()  ## 更新文件
>>> subshp.close()  ## 关闭文件

上述方法只是从源文件中随意选择了一个子区域,可以根据需要选择特定的区域,然后写入文件即可。

⚠️:不要忘记更新文件。

pyshp

安装

pip install pyshp

文件读取

import shapefile

shps = shapefile.Reader('CHN_adm2.shp')

读取后返回的 shps 中也包含了很多方法,其中 .fields 包含了shape文件中的一些字段信息,类似 fiona 中的 .schema 方法:

>>> shps.fields

[('DeletionFlag', 'C', 1, 0),
 ['ID_0', 'N', 10, 0],
 ['ISO', 'C', 3, 0],
 ['NAME_0', 'C', 75, 0],
 ['ID_1', 'N', 10, 0],
 ['NAME_1', 'C', 75, 0],
 ['ID_2', 'N', 10, 0],
 ['NAME_2', 'C', 75, 0],
 ['HASC_2', 'C', 15, 0],
 ['CCN_2', 'N', 10, 0],
 ['CCA_2', 'C', 254, 0],
 ['TYPE_2', 'C', 50, 0],
 ['ENGTYPE_2', 'C', 50, 0],
 ['NL_NAME_2', 'C', 75, 0],
 ['VARNAME_2', 'C', 150, 0]]
>>> shps.numRecords  # shape文件中包含了多少个记录数,即子文件数

读取shape子文件

>>> shp = shps.shapeRecord()

获取子文件属性信息

>>> shp.record  # 返回列表

[49,
'CHN',
'China',
1,
'Anhui',
1,
'Anqing',
'',
0,
'',
'Dìjíshì',
'Prefecture City',
'安庆市',
'Ānqìng']

类似 fiona 中获取shape子文件的属性信息,但fiona返回为字典。

获取子文件坐标信息

>>> shp.shape.points # 包含了经纬度坐标
>>> shp.shape.bbox  # shape子文件范围

上述两个库,均可以进行shape文件的读写操作,但并没有提供可视化的方法。如果想看图的时候可以使用ArcGIS或者QGIS,导入文件即可。或者使用geopandas进行处理,geopandas提供了shape文件的处理和可视化,具有更为简便的API。

geopandas

安装

pip install geopandas

文件处理和可视化

import geopandas

shps = geopandas.read_file('CHN_adm1.shp')
shps.plot()

包括库导入也只需要3行代码即可。

本文分享自微信公众号 - MeteoAI(meteoai)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-26

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习录

Kubernetes是什么东西?

Kubernetes一词来源于希腊语,翻译来的意思就是舵手或者船长的意思,而它的logo也是很符合这个词的

21430
来自专栏python爱好部落

selenium ,webdriver 运行原理与机制

driver翻译过来是驱动,司机的意思。如果将webdriver比做成司机,竟然非常恰当。

20230
来自专栏好好学java的技术栈

Java 中几种常用 JSON 库性能比较

来 源:xncoding.com/2018/01/09/java/jsons.html

10920
来自专栏盟主来了

最新版chromium 76如何支持xp

我知道,当我写下这个标题的时候,肯定一大波人会过来嘲讽:都什么年代了,还XP?

23950
来自专栏玩转JavaEE

前后端分离开发思路探讨

但是毕竟要从前后端不分变为前后端分离,思维的变化还是比较大的,因此,今天我们就再来说说一说这个话题。

15220
来自专栏Python爬虫与数据挖掘

Python 播放音频与录音

os.system(file) 调用系统应用来打开文件,file 可为图片或者音频文件。

46430
来自专栏PHP饭米粒

手把手撸PHP扩展 0x01: 开发规范

2、全局PHP扩展函数以及扩展方法的参数声明放在study_*.cc、study.cc里面。

11120
来自专栏汪宇杰博客

.NET Core里的UrlEncode之坑

当我们在.NET Core中处理URL编码的时候,有两个API可以选择:System.Net.WebUtility.UrlEncode 和 System.Web...

12920
来自专栏微信公众号:Java团长

Java基于百度API的图片文字识别

http://ai.baidu.com/docs#/OCR-API/e1bd77f3

51000
来自专栏大史住在大前端

如何查看jsplumb.js的API文档(YUIdoc的基本使用)

最近向一些同事推荐了网页中实现流程图绘制的工具库jsplumb.js,Community版本是开源的,在github的官方仓库的Wiki中能够找到社区版的官方指...

21900

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励