本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  大家好我是费老师,很多读者朋友跟随着我先前写作的基于geopandas的空间数据分析系列教程文章(快捷访问地址:https://www.cnblogs.com/feffery/tag/geopandas/),掌握了有关geopandas的诸多实用方法,从而更方便地在Python中处理分析GIS数据。其中在文件IO篇中给大家介绍过针对ESRI GeoDataBase格式的文件(也就是大家简称的gdb文件),可以在指定图层名layer参数后进行读取,但无法进行gdb文件的写出操作。

  实际上geopandas是具有写出矢量数据到gdb文件的能力的,只是需要额外配置一些软件库,今天的文章中,我就来带大家学习如何简单快捷地给geopandas补充gdb文件写出功能。

2 为geopandas补充gdb文件写出功能

2.1 为gdal添加FileGDB插件

  在geopandas0.11版本之后,针对矢量文件的读写有默认的'fiona'和可选的'pyogrio'两种引擎,请注意,本文的方案仅适用于默认的'fiona'引擎。

  而fiona底层依赖的则是著名的栅格矢量数据转换框架gdal,因此我们要给geopandas添加gdb写出功能,本质上是需要给gdal添加相关功能。

  搞清楚问题的关键后,下面我们开始操作,这里为了方便演示测试,我们利用conda新建一个geopandas虚拟环境,顺便把jupyterlab也装上,全部命令如下,直接全部粘贴到终端执行即可:

conda create -n geopandas-write-gdb-test python=3.8 -c https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main -y
conda activate geopandas-write-gdb-test
conda install geopandas -c https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge -y
pip install jupyterlab -i https://pypi.tuna.tsinghua.edu.cn/simple

  全部执行完之后,我们可以先查看默认情况下fiona有哪些已有的读写驱动:

import fiona

fiona.supported_drivers

  可以看到其中列出的'OpenFileGDB'就是gdal中默认自带的针对gdb文件的驱动,其对应的值为'r'说明它只能针对gdb文件进行读取,我们要想写出gdb文件,需要额外配置添加Esri官方开发的FileGDB驱动。

  第一步,我们需要去下载FileGDB驱动文件,Esri官方Github仓库:https://github.com/Esri/file-geodatabase-api,按照https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal上有关gdal使用FileGDB插件的额外说明,我选择下载FileGDB的版本为https://github.com/Esri/file-geodatabase-api/blob/master/FileGDB_API_1.5.1/FileGDB_API_1_5_1-VS2015.zip

  下载到本地解压后,因为我是64位windows系统,所以从bin64目录下复制FileGDBAPI.dll文件,粘贴到我们前面利用conda新建的虚拟环境根目录下的Library\bin里。

  这个目录找起来很简单,因为所有用conda建立的虚拟环境,默认都位于你的conda安装根目录的envs目录下,我的conda安装根目录在C:\Conda,因此我需要粘贴前面文件的目标目录为C:\Conda\envs\geopandas-write-gdb-test\Library\bin

  第二步,我们还需要下载ogr_FileGDB.dll这个文件,我是通过OSGeo4W下载的,有些麻烦,为了方便广大读者朋友使用,我在百度云盘分享了一个备份(链接:https://pan.baidu.com/s/1VEtN6JAReFsDhnWl_8v6Eg

提取码:w2s7),大家将其下载下来放置于前面FileGDBAPI.dll同级目录下的gdalplugins目录中即可:

  第三步,完成了这些操作后,我们就已经搞定了,这时回到fiona中再次查看支持的驱动,可以看到多了FileGDB,且值为'raw',这代表我们已经拥有了写出gdb文件的能力:

2.2 在geopandas中测试写出gdb文件

  至此我们就可以进行gdb文件的写出了,只需要在to_file()中指定driver='FileGDB',并设置好对应的图层名layer参数即可:

import geopandas as gpd
from shapely.geometry import Point, LineString, Polygon demo_point_layer = gpd.GeoDataFrame(
{
'数据字段测试': ['点要素测试数据字段测试'],
'geometry': [Point(0, 0)]
},
crs='EPSG:4326'
)
demo_linestring_layer = gpd.GeoDataFrame(
{
'数据字段测试': ['线要素测试数据字段测试'],
'geometry': [LineString([(0, 0), (1, 1)])]
},
crs='EPSG:4326'
)
demo_polygon_layer = gpd.GeoDataFrame(
{
'数据字段测试': ['面要素测试数据字段测试'],
'geometry': [Polygon([(0, 0), (1, 1), (1, 0)])]
},
crs='EPSG:4326'
) # 写出到示例gdb文件中
demo_point_layer.to_file('./demo.gdb', layer='点图层测试', driver='FileGDB')
demo_linestring_layer.to_file('./demo.gdb', layer='线图层测试', driver='FileGDB')
demo_polygon_layer.to_file('./demo.gdb', layer='面图层测试', driver='FileGDB')

  查看目标gdb文件的所有图层名:

  读入查看矢量,在读入时建议不设置driver参数,因为默认的OpenFileGDB驱动读取gdb文件要更快:

  其中线要素与面要素读进来不知为何变成了多部件要素类型,这其实不影响在geopandas中进行分析使用,但如果实在介意,可以直接基于数值唯一的某个字段进行dissolve()操作即可恢复原样:

  以上操作适用于windows系统,至于linux系统,且容我日后研究出来后再分享给大家。


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

(数据科学学习手札143)为geopandas添加gdb文件写出功能的更多相关文章

  1. (数据科学学习手札89)geopandas&geoplot近期重要更新

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 最近一段时间(本文写作于2020-07-1 ...

  2. (数据科学学习手札111)geopandas 0.9.0重要新特性一览

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在几天前,geopandas释放了其最新正式版 ...

  3. (数据科学学习手札139)geopandas 0.11版本重要新特性一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...

  4. (数据科学学习手札129)geopandas 0.10版本重要新特性一览

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...

  5. (数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,geopandas作为在Pyt ...

  6. (数据科学学习手札134)pyjanitor:为pandas补充更多功能

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 pandas发展了如此多年,所包含的功能已 ...

  7. (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇

    本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...

  8. (数据科学学习手札80)用Python编写小工具下载OSM路网数据

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...

  9. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

随机推荐

  1. React key究竟有什么作用?深入源码不背概念,五个问题刷新你对于key的认知

    壹 ❀ 引 我在[react]什么是fiber?fiber解决了什么问题?从源码角度深入了解fiber运行机制与diff执行一文中介绍了react对于fiber处理的协调与提交两个阶段,而在介绍协调时 ...

  2. .Net之延迟队列

    介绍 具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费. 使用场景 延时队列在项目中的应用还是比较多的,尤其像电商类平台: 订单成功后,在30分钟内 ...

  3. 对象数组和对象对象数组的for-each循环

    对象数组的声明 类名称 对象数组名[] = null: 对象数组名 = new 类名称[长度] 定义并开辟数组 类名称 对象数据名[] = new 类名称[长度]; 在声明一个对象数组后,必须对每个数 ...

  4. 【设计过程】.NET ORM FreeSql WhereDynamicFilter 动态表格查询功能

    前言 最近几乎每天40度,越热越不想面对电脑,还好开源项目都比较稳定没那么多待解决问题,趁着暑假带着女儿学习游泳已略有小成.游泳好处太多了,建议有孩子的都去学学,我是在岸边指导大约一周左右就学会了,目 ...

  5. 5-17 ELK 日志采集查询保存

    ELK简介 什么是ELK ELK: E:Elasticsearch 全文搜索引擎 L:logstash 日志采集工具 K:Kibana ES的可视化工具 ELK是当今业界非常流行的日志采集保存和查询的 ...

  6. osi七层与TCP\IP协议

    层次划分的方法 1.网络的每层应当具有相对独立的功能(便于排错)这个功能用不了必然是你这层处理问题 2.梳理功能之间的关系,使上一个功能可以实现为另一个功能提供必要的服务,从而形成系统的层次结构.为提 ...

  7. 了解有哪几个C标准&了解C编译管道

    下列哪个不是C标准.参考:C语言标准 小知识:C语言标准的发展 K&R C: 1978年,丹尼斯·里奇(Dennis Ritchie)和布莱恩·科尔尼干(Brian Kernighan)出版了 ...

  8. 解决线程安全问题_同步方法和解决线程安全问题_Lock锁

    解决线程安全问题_同步方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 卖票案例出现了线程安全的问题 * ...

  9. 【HMS core】【FAQ】HMS Toolkit典型问题合集1

    ​  1.[开发工具][HMS Toolkit][问题描述] HMS Toolkit 插件导致Android Studio崩溃无法使用 [解决方案] 1)        检查Android Studi ...

  10. 基于 Next.js实现在线Excel

    如果要从头开始使用 React 构建一个完整的 Web 应用程序,需要哪些步骤? 这当然不像把大象装进冰箱那么简单,只需要分成三步:打开冰箱,拿起大象,塞进冰箱就好. 我们需要考虑细节有很多,比如: ...