4

(数据科学学习手札140)详解geopandas中基于pyogrio的矢量读写引擎 - 费弗里

 2 years ago
source link: https://www.cnblogs.com/feffery/p/16459024.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

  大家好我是费老师,前不久我在一篇文章中给大家分享过geopandas在其0.11版本中为我们带来的一些重要新特性,其中提到过新的矢量读写后端,使得我们在read_file()以及to_file()中添加参数engine='pyogrio'即可获得500%的性能提升。

  而新引擎带来的不仅是性能上的大幅提升,还带来了诸多实用功能以方便我们读写常见矢量文件,今天我就来给大家详细介绍这些新功能。

1344061-20220708170545004-270677859.svg

2 详解geopandas中的pyogrio读写引擎

  geopandas0.11版本之后新增的pyogrio引擎,基于geopandas团队开发的同名Python库,其基于OGR,而OGR则是著名的开源栅格空间数据转换框架GDAL的重要分支库,专注于矢量数据的高性能转换。

1344061-20220708170548174-740123346.png

2.1 基于pyogrio的矢量文件读取#

  对于0.11及以后版本的geopandas,向read_file()中传入engine='pyogrio'后,即可切换至底层基于pyogrio.read_dataframe()的读取引擎,获取大幅度性能提升的同时也拥有了众多的新功能参数,其中比较实用的有:

2.1.1 利用columns参数指定需要读入的字段#

  开启pyogrio引擎后,我们可以通过设置参数columns来读入指定的若干字段,当你的矢量文件有很多无关紧要的字段时,可以利用此特性来整洁数据以及减少读入数据的内存消耗:

1344061-20220708170552555-910272356.png

2.1.2 利用read_geometry参数设置是否忽略矢量列#

  如果你不需要矢量文件中的矢量信息,只需要将其当作普通表格数据进行读入,开启pyogrio引擎后,设置read_geometry=False即可,所形成对象的类型也会变为普通的DataFrame

1344061-20220708170555860-1881685776.png

2.1.3 利用force_2d参数强制忽略z轴信息#

  有些情况下,矢量数据中的坐标信息带有z轴高度信息,如果分析过程中用不上该维度信息,可以在开启pyogrio引擎后设置force_2d=True强制转换为2D矢量,非常方便:

1344061-20220708170557927-995638310.png

2.1.4 利用skip_features与max_features参数控制读入数据规模#

  在开启pyogrio引擎后,通过设置参数skip_features可以控制从数据第0行开始需要跳过的要素记录数量:

1344061-20220708170600857-635504273.png

  而通过设置参数max_features则可以控制最多读取多少行要素记录,当我们的矢量文件记录行很多,而我们又只想简单查看几行看看数据长什么样时,这个参数就很实用了:

1344061-20220708170604928-1463407339.png

2.1.5 利用参数where对矢量文件进行条件过滤#

  这个新特性非常实用,我们可以像写SQL查询语句那样传入我们的过滤条件,从而帮助我们在读取数据时就实现比较丰富自由的条件过滤效果,值得注意的是,针对中文等由unicode字符构成的字段名,需要将其包裹在""中进行定义,参考下图中我的做法:

1344061-20220708170607117-1350748023.png

2.1.6 利用sql参数在原数据上直接进行sql查询#

  前面我们介绍了多种用于过滤原数据的实用参数,而在在开启pyogrio引擎后还有个非常实用的参数sql,可以帮助我们直接书写SQL语句对原数据进行提取(注意,其执行顺序先于上述其他过滤类参数):

1344061-20220708170609366-580325720.png

  但要注意的是,目前pyogrio引擎的sql参数,在读取诸如含有中文等unicode字符信息的shapefile文件时,不能正常的解析内容,而针对GeoJSONgpkg等其他格式矢量文件时则一切正常:

  • GeoJSON文件正常

1344061-20220708170611500-1983171812.png
  • gpkg文件正常

1344061-20220708170613772-1942930902.png
  • shapefile文件乱码,亲测即使指定encoding也无效

1344061-20220708170615916-1090248129.png

  所以现阶段建议读取shapefile文件时,可以使用columns+where的组合方式代替sql以实现同样的效果。

2.2 基于pyogrio的矢量文件写出#

  相较于文件的读取,新引擎中涉及文件写出的功能参数就寡淡很多,只发现一个比较特别的promote_to_multi参数,用于强制将单部件要素转换为多部件要素:

1344061-20220708170618222-1869156778.png

2.3 pyogrio引擎支持的所有矢量文件类型#

  你可以通过pyogrio.list_drivers()查看新引擎所支持的全部矢量文件格式,基本上只有你想不到没有它覆盖不到😂:

1344061-20220708170733695-95642226.png

  更多相关内容,可以前往https://pyogrio.readthedocs.io/en/latest/api.html?#geopandas-integration阅读了解更多。


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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK