本文完整代碼及數據已上傳至我的
Github倉庫https://github.com/CNFeffery/DataScienceStudyNotes
1 簡介
PostGIS作為postgresql針對地理空間數據的拓展功能,可以幫助我們有效管理和固化空間矢量數據,以及開展空間數據分析,而geopandas作為Python生態中優秀的空間數據分析處理工具,自然在與PostGIS進行交互方面開發了相應的功能。
本文就將針對如何利用geopandas向PostGIS空間數據庫寫入及讀取矢量數據進行介紹。
2 geopandas與PostGIS進行交互
為了能在geopandas中與postgresql和PostGIS建立連接,請確保以下3個庫已經安裝:
pip install sqlalchemy psycopg2 geoalchemy2
接下來我們需要保證postgresql中存在可以連接的空間數據庫,在pgAdmin界面內新建數據庫,譬如這里我們新建數據庫demo:
點擊保存成功創建數據庫之后,要注意這時我們的demo數據庫只是個普通的postgresql數據庫,是不支持空間相關功能的,在對應數據庫上右鍵打開查詢工具:
在彈出的界面中輸入CREATE EXTENSION postgis;並執行,成功之后我們的數據庫就變成了空間數據庫,支持空間相關的各種功能:
至此我們的准備工作就已結束,接下來我們就可以直接在geopandas中讀寫PostGIS數據表。
2.1 利用geopandas向PostGIS寫入數據
為方便演示,這里我們以簡化版的重慶市區縣矢量面數據為例,首先我們導入所需的geopandas(注意geopandas版本必須大於等於0.8.0)與sqlalchemy(后者用於創建數據庫連接),並讀入重慶市.geojson文件,你可以在開頭的Github倉庫找到它:
接着我們來演示如何通過geopandas向PostGIS推送矢量信息表,使用到的API為to_postgis(),其主要參數如下:
name:字符型,用於指定推送到
PostGIS后的表名稱con:
sqlalchemy.engine.Engine對象,用於建立與數據庫的連接if_exists:字符型,用於指定當數據庫中已存在同名表時的相應策略,
'fail'表示拋出錯誤,'replace'指替換,'append'指向原表追加,默認為failschema:字符型,用於指定
schema,默認為'public'index:bool型,用於指定是否保留index信息
index_label:字符型或序列,當index被設置為True時為index信息指定字段名稱
首先需要利用sqlalchemy中的create_engine來創建數據庫連接,傳入字符串包含了數據庫類型、用戶名、密碼、主機IP、端口以及數據庫名稱,格式為:
數據庫類型://用戶名:密碼@主機IP:端口/數據庫名稱
對應本例:
在pgAdmin中隨即就能查看到剛才寫入的數據表:
2.2 利用geopandas從PostGIS讀取數據
從PostGIS中讀取數據要用到另一個API,對應geopandas的read_postgis(),其主要參數如下:
sql:字符型,對應從空間數據庫中提取數據的SQL語句
con:同
to_postgis()geom_col:字符型,用於指定將哪一列作為
GeoDataFrame的矢量列crs:用於指定坐標參考系,同
GeoDataFrame的坐標參考系設定方式index_col:字符型或列表,用於指定將哪些列作為索引
parse_dates:列表,用於預解析時間類型數據
接着我們從PostGIS中讀取剛才寫入的表:
簡簡單單,我們就實現了與PostGIS的交互。
以上就是本文的全部內容,如有疑問歡迎在評論區與我討論~
