1. 程式人生 > >(資料科學學習手札93)利用geopandas與PostGIS進行互動

(資料科學學習手札93)利用geopandas與PostGIS進行互動

> 本文完整程式碼及資料已上傳至我的`Github`倉庫[https://github.com/CNFeffery/DataScienceStudyNotes](https://github.com/CNFeffery/DataScienceStudyNotes) # 1 簡介   `PostGIS`作為`postgresql`針對**地理空間資料**的拓展功能,可以幫助我們有效管理和固化空間向量資料,以及開展空間資料分析,而`geopandas`作為`Python`生態中優秀的空間資料分析處理工具,自然在與`PostGIS`進行互動方面開發了相應的功能。   本文就將針對如何利用`geopandas`向`PostGIS`空間資料庫寫入及讀取向量資料進行介紹。
圖1
# 2 geopandas與PostGIS進行互動   為了能在`geopandas`中與`postgresql`和`PostGIS`建立連線,請確保以下3個庫已經安裝: ```bash 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
  接著我們來演示如何通過`geopandas`向`PostGIS`推送向量資訊表,使用到的API為`to_postgis()`,其主要引數如下: > **name**:字元型,用於指定推送到`PostGIS`後的表名稱 > > **con**:`sqlalchemy.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,對應`geopandas`的`read_postgis()`,其主要引數如下: > **sql**:字元型,對應從空間資料庫中提取資料的SQL語句 > > **con**:同`to_postgis()` > > **geom_col**:字元型,用於指定將哪一列作為`GeoDataFrame`的向量列 > > **crs**:用於指定座標參考系,同`GeoDataFrame`的座標參考系設定方式 > > **index_col**:字元型或列表,用於指定將哪些列作為索引 > > **parse_dates**:列表,用於預解析時間型別資料   接著我們從`PostGIS`中讀取剛才寫入的表:
圖10
  簡簡單單,我們就實現了與`PostGIS`的互動。 ---   以上就是本文的全部內容,如有疑問歡迎在評論區與