• (数据科学学习手札93)利用geopandas与PostGIS进行交互


    本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

    1 简介

      PostGIS作为postgresql针对地理空间数据的拓展功能,可以帮助我们有效管理和固化空间矢量数据,以及开展空间数据分析,而geopandas作为Python生态中优秀的空间数据分析处理工具,自然在与PostGIS进行交互方面开发了相应的功能。

      本文就将针对如何利用geopandasPostGIS空间数据库写入及读取矢量数据进行介绍。

    图1

    2 geopandas与PostGIS进行交互

      为了能在geopandas中与postgresqlPostGIS建立连接,请确保以下3个库已经安装:

    pip install sqlalchemy psycopg2 geoalchemy2
    

      接下来我们需要保证postgresql中存在可以连接的空间数据库,在pgAdmin界面内新建数据库,譬如这里我们新建数据库demo

    图2
    图3

      点击保存成功创建数据库之后,要注意这时我们的demo数据库只是个普通的postgresql数据库,是不支持空间相关功能的,在对应数据库上右键打开查询工具:

    图4

      在弹出的界面中输入CREATE EXTENSION postgis;并执行,成功之后我们的数据库就变成了空间数据库,支持空间相关的各种功能:

    图5

      至此我们的准备工作就已结束,接下来我们就可以直接在geopandas中读写PostGIS数据表。

    2.1 利用geopandas向PostGIS写入数据

      为方便演示,这里我们以简化版的重庆市区县矢量面数据为例,首先我们导入所需的geopandas(注意geopandas版本必须大于等于0.8.0)与sqlalchemy(后者用于创建数据库连接),并读入重庆市.geojson文件,你可以在开头的Github仓库找到它:

    图6

      接着我们来演示如何通过geopandasPostGIS推送矢量信息表,使用到的API为to_postgis(),其主要参数如下:

    name:字符型,用于指定推送到PostGIS后的表名称

    consqlalchemy.engine.Engine对象,用于建立与数据库的连接

    if_exists:字符型,用于指定当数据库中已存在同名表时的相应策略,'fail'表示抛出错误,'replace'指替换,'append'指向原表追加,默认为fail

    schema:字符型,用于指定schema,默认为'public'

    index:bool型,用于指定是否保留index信息

    index_label:字符型或序列,当index被设置为True时为index信息指定字段名称

      首先需要利用sqlalchemy中的create_engine来创建数据库连接,传入字符串包含了数据库类型用户名密码主机IP端口以及数据库名称,格式为:

    数据库类型://用户名:密码@主机IP:端口/数据库名称
    

      对应本例:

    图7

      在pgAdmin中随即就能查看到刚才写入的数据表:

    图8
    图9

    2.2 利用geopandas从PostGIS读取数据

      从PostGIS中读取数据要用到另一个API,对应geopandasread_postgis(),其主要参数如下:

    sql:字符型,对应从空间数据库中提取数据的SQL语句

    con:同to_postgis()

    geom_col:字符型,用于指定将哪一列作为GeoDataFrame的矢量列

    crs:用于指定坐标参考系,同GeoDataFrame的坐标参考系设定方式

    index_col:字符型或列表,用于指定将哪些列作为索引

    parse_dates:列表,用于预解析时间类型数据

      接着我们从PostGIS中读取刚才写入的表:

    图10

      简简单单,我们就实现了与PostGIS的交互。


      以上就是本文的全部内容,如有疑问欢迎在评论区与我讨论~

  • 相关阅读:
    bzoj5157: [Tjoi2014]上升子序列(树状数组LIS)
    2435: [Noi2011]道路修建(树上操作)
    bzoj1019: [SHOI2008]汉诺塔(动态规划)
    bzoj1103: [POI2007]大都市meg(树链剖分)
    bzoj2190: [SDOI2008]仪仗队(欧拉)
    bzoj4519: [Cqoi2016]不同的最小割(分治最小割)
    bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)
    bzoj1816: [Cqoi2010]扑克牌(二分答案判断)
    [HEOI2015]兔子与樱花
    [POI2009]KAM-Pebbles
  • 原文地址:https://www.cnblogs.com/feffery/p/13468203.html
Copyright © 2020-2023  润新知