php中pandans,Python地信专题 | 基于geopandas的空间数据分析-文件IO篇

本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

在上一篇文章中我们对geopandas中的坐标参考系有了较为深入的学习,而在日常空间数据分析工作中矢量文件的读入和写出,是至关重要的环节。

作为基于geopandas的空间数据分析系列文章的第三篇,通过本文你将会学习到geopandas中的文件IO。

2 文件IO

2.1 矢量文件的读入

geopandas将fiona作为操纵矢量数据读写功能的后端。

使用geopandas.read_file()读取对应类型文件,而在后端实际上是使用fiona.open来读入数据,即两者参数是保持一致的,读入的数据自动转换为GeoDataFrame。

下面是geopandas.read_file()主要参数:

filename:str类型,传入文件对应的路径或url

layer:str类型,当要读入的数据格式为地理数据库.gdb或QGIS中的.gpkg时,传入对应图层的名称

下面结合上述参数,来介绍一下使用geopandas.read_file()在不同情况下读取常见格式矢量数据的方法。

使用到的示例数据为中国地图,CRS为EPSG:4326。

本文使用到的所有数据都可以在文章开头提及的Github仓库对应本文路径下找到:

1cdd992433269c3c8effda2276d7f46c.png

图1

2.1.1 shapefile

作为非常常见的一种矢量文件格式,geopandas对shapefile提供了很好的读取和写出支持。

下面分为不同情况来介绍:

完整的shapefile

如图2,这是一个完整的shapefile:

27900230d58e6b26e36fc8c84e5455ce.png

图2

使用geopandas来读取这种形式的shapefile很简单:

import geopandas as gpd

data = gpd.read_file('geometry/china_provinces/china_provinces.shp')

print(data.crs) # 查看数据对应的crs

data.head() # 查看前5行

50bb489f5db345a95e430caa8abfca32.png

图3

缺少投影的shapefile

当shapefile中缺失.prj文件时,使用geopandas读入后形成的GeoDataFrame会缺失crs属性:

3e413655fccf536be753d2386562717b.png

图4

如果已经知道数据对应的CRS,可以在读入数据后补充上crs信息以进行其他操作:

import pyproj

data.crs = pyproj.CRS.from_user_input('EPSG:4326')

data.crs

e1d99380c5f68d1faef00736d4e17a6f.png

图5

直接读取文件夹

当文件夹下只有单个shapefile时,可以直接读取该文件夹:

070de97da02496dc657d677f697971f8.png

图6

读取zip压缩包中的文件

geopandas通过传入特定语法格式的文件路径信息,以支持直接读取.zip格式压缩包中的shapefile文件,主要分为两种情况。

当文件在压缩包内的根目录时,使用下面的语法规则来读取数据:

zip://路径/xxx.zip

譬如我们要读取图7所示的压缩包内文件:

3ea74f6cddca9a13beccc5fd1765a38f.png

图7

按照对应的语法规则,读取该类型数据方式如下:

2a1aab1d04b1dac56d90fcdac0ce5f9d.png

图8

而当文件在压缩包内的文件夹中时,如图9:

933b9f5295fb44ebdfcf8656262d6719.png

图9

使用下面的语法规则来读取数据:

zip://路径/xxx.zip!压缩包内指定文件路径

将上述语法运用到上述文件:

2f614df95bde21e77370eaee4eacf4c5.png

图10

2.1.2 gdb与gpkg

对于Arcgis中的地理数据库gdb,以及QGIS中的GeoPackage,要读取其包含的矢量数据,就要涉及到图层的概念。

对应geopandas.read_file()的layer参数,只需要将gdb或gpkg文件路径作为filename参数,再将对应的图层名称作为layer参数传入:

gdb

data = gpd.read_file('geometry/china_provinces.gdb',

layer='china_provinces')

print(data.crs) # 查看数据对应的crs

data.head() # 查看前5行

bc8991053e960c9c06702315ba277354.png

图11

gpkg

类似读入gdb文件:

data = gpd.read_file('geometry/china_provinces.gpkg',

layer='china_provinces',

encoding='utf-8')

print(data.crs) # 查看数据对应的crs

data.head() # 查看前5行

e7007d1ddf2e48bf35b23badeff5c157.png

图12

2.1.3 GeoJSON

作为web地图中最常使用的矢量数据格式,GeoJSON几乎被所有在线地图框架作为数据源格式,在geopandas中读取GeoJSON非常简单,只需要传入文件路径名称即可。

下面我们来读入图13所示的文件:

bf8aafdf53d7159bc4c4fb205bd544ff.png

图13

6f7623db16371f89de0476cfe642adfc.png

图14

2.1.4 过滤

geopandas在0.1.0版本中新增了bbox过滤,在0.7.0版本中新增了蒙版过滤和行过滤功能,可以辅助我们根据自己的需要读入原始数据中的子集。

下面一一进行介绍:

bbox过滤

bbox过滤允许我们在read_file()中传入一个边界框作为参数bbox,格式为(左下角x, 左下角y, 右上角x, 右上角y),这样在读入的过程中只会保留几何对象与bbox有相交的数据记录。

下面我们仍然以上文中使用过的中国地图数据为例,我们在读入的过程中,传入边界框:

from shapely import geometry

data = gpd.read_file('geometry/china_provinces.json',

bbox=(100, 20, 110, 30))

%matplotlib widget

ax = data.plot()

# 绘制bbox框示意

ax = gpd.GeoSeries([geometry.box(minx=100,

miny=20,

maxx=110,

maxy=30).boundary]).plot(ax=ax, color='red')

4422f003ab5723db456fb782360062aa.png

图15

可以看到只有跟红色框有相交的几何对象被读入。

蒙版过滤

蒙版过滤和bbox过滤功能相似,都是筛选与指定区域相交的数据记录。

不同的是蒙版过滤通过mask参数可以传入任意形状的多边形,不再像bbox过滤那样只接受矩形:

data = gpd.read_file('geometry/china_provinces.json',

mask=geometry.Polygon([(100, 20), (110, 30), (120, 20)]))

ax = data.plot()

# 绘制bbox框示意

ax = gpd.GeoSeries([geometry.Polygon([(100, 20),

(110, 30),

(120, 20)]).boundary]).plot(ax=ax, color='red')

b3d328ff321607a20949fef286be8a9e.png

图16

可以看到只有跟红色多边形相交的几何对象被读入。

行过滤

行过滤的功能就比较简单,通过参数rows控制读入原数据的前若干行,可以用于在读取大型数据时先快速查看前几行以了解整个数据的格式:

b3f531e8e64413bb98a5e6fd24b49896.png

图17

2.2 矢量文件的写出

在geopandas中使用to_file()来将GeoDataFrame或GeoSeries写出为矢量文件,主要支持shapefile、GeoJSON以及GeoPackage。

不像geopandas.read_file()可以根据传入的文件名称信息自动推断类型,我们在写出矢量数据时就需要使用driver参数来声明文件类型:

ESRI Shapefile

我们将上文最后一次读入的GeoDataFrame写出为ESRI Shapefile,设置driver参数为ESRI Shapefile。

如果你对文件编码有要求,这里可以使用encoding参数来指定,譬如这里我们指定为utf-8:

'''在工程根目录下创建output文件夹'''

import os

try:

os.mkdir('output')

except FileExistsError:

pass

data.to_file('output/output.shp',

driver='ESRI Shapefile',

encoding='utf-8')

可以看到在output文件夹下,成功导出了完整的shapefile:

4999322a68efc7aba0f34dcf6d84d05b.png

图18

而如果导出的文件名不加后缀扩展名,则会生成包含在新目录下的shapefile:

data.to_file('output/output_shapefile',

driver='ESRI Shapefile',

encoding='utf-8')

550813c607d761772e81d0957ed6f43b.png

图19

也可以向指定的文件夹下追加图层:

data.to_file('output/output_shapefile_multi_layer',

driver='ESRI Shapefile',

layer='layer1',

encoding='utf-8')

data.to_file('output/output_shapefile_multi_layer',

driver='ESRI Shapefile',

layer='layer2',

encoding='utf-8')

data.to_file('output/output_shapefile_multi_layer',

driver='ESRI Shapefile',

layer='layer3',

encoding='utf-8')

d29a153b190f311b34735bac122b702e.png

图20

GeoPackage

对于gdb文件,由于ESRI的限制,暂时无法在开源的geopandas中导出。

但我们可以用QGIS中的GeoPackage作为替代方案(开源世界万岁O(∩_∩)O~~),只需要将driver参数设置为GPKG即可。

这里需要注意一个bug:在使用geopandas导出GeoPackage文件时,可能会出现图21所示错误:

ae5d2db6512042c4b06af8c5396ff1ba.png

图21

但我观察到即使出现了上述错误,GeoPackage文件也是成功保存到路径下的且整个程序并未被打断,因此可以无视上述错误:

ace7ed10ed629a969f6901593ee4b6e0.png

图22

GeoJSON

写出为GeoJSON非常容易,只需要设置driver='GeoJSON'即可:

8bc9f882f344a4155ed837ed2899e440.png

图23

以上就是本文的全部内容,如有笔误望指出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ros创建工作空间_ROS入门学习之七Moveit机械臂控制

1.MoveIt!系统架构MoveIt是什么:一个易于使用的集成化开发平台由一系列移动操作的功能包组成:运动规划、操作控制、3D感知、运动学、控制与导航算法提供友好的GUI可应用于工业、商业、研发和其他领域ROS社区中使用度排名前三的功能包系统架构用户接口(Us…

常用于评价回归模型优劣的统计量包括( )。_第四十一讲 R-判断回归模型性能的指标...

当回归模型建立好以后,如何评价该回归模型是否与另一个回归模型有区别,如何比较两个回归模型的性能?这一讲中,我们将给大家介绍几个评价回归模型性能的统计指标。1. 模型性能指标在回归模型中,最常用的评估指标包括&am…

python 常用包_Python常用指引

Python常用指引Python常用指引的形式来源于Linux文档项目的常用指引章节,是一系列独立、指定主题并尝试完全覆盖该主题的文章集合。致力于提供比Python库参考帮助更详尽的文档。Python 3 是 Python 的未来,但 Python 2 仍处于活跃使用阶段,最…

读取当前linux进程内存_(笔记)Linux上的内存分配

作者: LemonNan原文: https://juejin.im/post/5ee3c34a518825430c3ad31d前言本篇是对Linux内存分配的一个学习笔记.程序内存结构下面是在 Linux/x86-32 中典型的一个进程内存结构文本段包含了进程运行的程序机器语言指令. 文本段具有只读属性, 以防止进程通过勘误指针意外修改自…

php改成IP连接数据库,thinkphp,pdo连接数据库,host自动被替换成了本机ip

class DBAccess extends PDO{ private $charset; // 数据库字符集public $cacheDir_cache_$98sdf29fw!d#s4fef/; public $prename; public $time; function __construct($dsn, $user, $password){ try{ parent::__construct($dsn, $user, $pa…

django开源电子文档管理系统_「开源推荐」BookStack v2.8 发布,简洁美观的在线文档管理系统

程序介绍BookStack,基于 Mindoc、使用Go语言的Beego框架开发的功能类似GitBook和看云的在线文档管理系统,拥有简洁美观的页面布局,实现了文档采集、导入、电子书生成以及版本控制等强大的文档功能,并推出了配套的开源微信小程序 B…

matlab 随机森林算法_随机森林算法

随机森林是一种灵活,易于使用的机器学习算法,即使没有超参数调整,也能在大多数情况下产生出色的结果。它也是最常用的算法之一,因为它简单,并且可以用于分类和回归任务。在这篇文章中,您将学习随机森林算法…

opengl 纹理贴到对应的位置_一步步学OpenGL(27) -《公告牌技术与几何着色器》

教程 27公告牌技术与几何着色器原文: http://ogldev.atspace.co.uk/www/tutorial27/tutorial27.htmlCSDN完整版专栏: https://blog.csdn.net/cordova/article/category/9266966背景从最初的一系列教程我们已经应用过了顶点着色器和片段着色器&#xff0c…

python 当前目录_virtualenvwrapper打造多版本Python环境

前言面对多个 Python 开发项目时,需要针对不同的项目创建相应的开发环境。通常情况下,使用 virtualenv 创建一个虚拟的独立 Python 环境,但是 virtualenv 创建的环境相对分散不便于管理。这里推荐使用 virtualenvwrapper 来创建集中的便于管理…

oracle装了客户端怎么登陆账号,分享Oracle 11G Client 客户端安装步骤(图文详解)...

Oracle 11G Client 客户端安装步骤,具体如下:下载地址:http://www.gimoo.net/database/167737.html先将下载下来的ZIP文件解压,并运行setup.exe文件。执行到第四步之后,出现错误,直接点全部忽略就可以了。把…

python与excel互通_【python】python vs Excel ( 与mysql数据库之间的交互)

【python】python vs Excel ( 与mysql数据库之间的交互) 通过python与mysql数据库做交互 到目前为止大部分案例的演示数据都是基于文件进行读取的。那么python如何跟数据库之间做交互才是未来我们真正需要关心的。因为我们的数据最终还是要存储到数据库中去的。 python与数据库…

基于matlab的车牌识别系统程序,基于matlab的车牌识别系统的设计(附程序).doc

基于matlab的车牌识别系统的设计(附程序).doc 1车牌识别系统的设计1.摘要:汽车牌照自动识别系统是制约道路交通智能化的重要因素,包括车牌定位、字符分割和字符识别三个主要部分。本文首先确定车辆牌照在原始图像中的水平位置和垂直位置,从而定位车辆牌照…

python英文词云代码_使用python实现个性化词云的方法

先上图片词云图 需要模板 pip install jieba pip install wordcloud 还需要安装另外两个东西这两个我也不太懂借鉴百度写上去的 pip install scipy pip install matplotlib 因为用ubuntu系统所有没有windows那么麻烦,也没有那么多报错 看到好多人制作自己的词云有没…

linux监测node进程,通过node_exporter监控linux服务器一

前言:node_exporter用于监控*nux系统,使用go编写的收集器prometheus服务器:192.168.199.222监控服务器 192.168.199.221在192.168.199.221下载node_exporterwget https://github.com/prometheus/node_exporter/releases/download/v*/node_exp…

k8s 离线安装_阿里开源 k8s 事件通知服务

背景在 Kubernetes 开源生态中,资源监控有 metrics-server、Prometheus等,但这些监控并不能实时推送 Kubernetes 事件,监控准确性也不足。当 kubernetes 集群中发生 Pod因为 OOM 、拉取不到镜像、健康检查不通过等错误导致重启,集…

kali linux解密栅栏密码,最详细bugku加密小白解法---持续更新!

bugku加密!安排本文持续更新1 摩斯密码2 栅栏密码3 Ook密码4 brain密码5 easycrypto密码6 base647 散乱的密文8 凯撒密码9 一段base6410 !?11 []-12 奇怪的密码--凯撒变式13 托马斯杰斐逊--转轮加密14 伪加密15 告诉你个秘密16 这不是MD517 贝…

linux命令 重定向%3e,linux输出信息调试信息重定向

在运行linux的时候有所有的调试信息可以分为三个部分1、bootloader输出信息U-Boot 1.3.2(Nov 19 2016 - 22:02:08)DRAM: 64 MBFlash: 512 kBNAND: 64 MiBIn: serialOut: serialErr: serialHit any key to stop autoboot: 0[yqliu2410 #] tftpFound DM9000 ID:90000a46 at addre…

360加固一键脱壳工具2020_如何脱壳加固过的Apk并利用其API“走近数据库”

0x00 寻找突破口打开首页,emm就一个登录页面,没了随便写点东西提交看看天生手欠的我一不小心就多输了一个单引号WDNMD,除了数字和字母其他都不行?这叫我怎么测?刚刚要放弃,就在这时,首页的一个二维码吸引了我正是安卓端的软件,眼前一亮,仿佛找到了打开新世界的大门开开心心地…

python 函数递归_Python零基础之三元表达式、函数递归、匿名函数教程!超级详细!...

目录一、三元表达式二、函数递归 递归调用的定义递归分为两个阶段:递归,回溯三、匿名函数 什么是匿名函数?有名字的函数与匿名函数的对比lambda匿名函数的应用四、内置函数 #注意:内置函数id()可以返回一个对象的身份,…

linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高

一、CPU过高分析1)使用TOP命令查看CPU、内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比。其中CPU状态中标示id的为空闲CPU百分比。当空闲CPU百分比越低,说明CPU占用率越高。2)…