1. 程式人生 > >PostGIS匯入匯出ESRI Shapefile資料

PostGIS匯入匯出ESRI Shapefile資料

PostGIS作為PostgreSQL資料庫的空間擴充套件,提供了對空間資料管理的支援。對於空間向量資料,PostGIS提供了Geometry和Geography倆種類型用於空間物件的儲存,Geometry使用笛卡爾座標系,而Geography使用球面座標系(預設是WGS84座標系)。對於空間柵格資料,則提供了Raster型別。

這裡介紹如何匯入我們常用的ESRI Shapefile資料到PostgreSQL資料庫中,我們可以使用PostGIS提供的shp2pgsql和pgsql2shp工具進行匯入和匯出操作,還可以使用GDAL庫提供的ogr2ogr工具,ogr2ogr工具支援更加多樣的資料格式。

我的實驗環境如下:
OS: Ubuntu 16.04 LTS
PostgreSQL:9.5.5 (安裝好PostgreSQL以後可以使用psql --version進行檢視)
PostGIS: 2.2 (安裝好PostGIS,並在資料庫中啟用PostGIS擴充套件以後,可以在psql命令列中使用SELECT PostGIS_Version();或者SELECT PostGIS_Full_Version();進行檢視。

我們使用的資料是全球大洲的一個向量資料,座標型別為WGS84。資料下載連結:百度雲下載

在Ubuntu中安裝PostgreSQL和PostGIS非常簡單:
首先,使用如下命令安裝PostgreSQL:

sudo apt-get install postgresql

然後,使用如下命令新增UbuntuGIS的PPA用於安裝PostGIS擴充套件。

sudo add-apt-repository ppa:ubuntugis/ppa
sudo apt-get update

最後,使用如下命令安裝PostGIS:

sudo apt-get install postgis

安裝好了以後,使用sudo -u postgres psql命令可以進入psql互動環境。
可以使用SQL修改postgres使用者的密碼alter user postgres with password 'new password';

(修改了postgres使用者密碼和沒有修改使用當前使用者登入,在後面插入資料時命令會稍有不同)

進入psql互動環境以後,我們首先建立資料庫。

CREATE DATABASE postgis_in_action;

然後再建立一個schema,以後我們可以將我們建立的table都儲存在我們的schema中,而不是預設的public schema中。

CREATE SCHEMA staging;

然後,切換到我們新建的postgis_in_action資料庫中。

\c postgis_in_action

然後在postgis_in_action資料庫中啟用PostGIS擴充套件。

CREATE EXTENSION postgis;

可以通過\dx命令檢視安裝的擴充套件:
PostgreSQL擴充套件

建立好了資料庫以後,我們可以使用\q命令退出psql。

接下來就是使用shp2psql命令列工具匯入資料了,命令如下:

shp2pgsql -s 4326 -I "continent" staging.world_continent | psql -h localhost -p 5432 -d postgis_in_action -U postgres -W

首先說明的是shp2pgsql的引數(具體引數使用shp2pgsql --help進行檢視):
-s指定空間參考系,PostGIS的參考系和EPSG程式碼是一樣的,比如EPSG:4326表示WGS84地理座標系
-I指定在新建的關係表的空間物件的那一列建立空間索引
然後,雙引號引起來的是Shapefile的檔名稱(也可以加上副檔名.shp)
最後是關係表的全名,staging是schema名稱,world_continent是關係名稱
shp2pgsql的輸出是一個標準的SQL,然後Linux的管道操作符’|’將結果傳入到psql中進行SQL的執行。
-h指定連線的地址hostname
-p指定連線的埠號
-d指定連線的資料庫名稱
-U指定連線的使用者名稱
-W指定在執行時彈出密碼輸入提示

注意:
修改了postgres使用者密碼的情況下,使用上面的命令插入資料。執行過程中,按照提示輸入postgres使用者的密碼即可。
也可以不給postgres使用者設定密碼,使用如下的命令插入資料,效果是一樣的。其實,raster2pgsql命令及其引數不變,就是進入psql命令的時候,稍微有些不同。要不然會提示password authentication failed for user “postgres”錯誤。

raster2pgsql -s 4326 -C ~/Downloads/gis-data/wsiearth.tif staging.wsiearth | sudo -u postgres psql -d postgis_in_action

這條命令執行過程中,需要輸入當前使用者的密碼即可。

執行過程如下:
PostGIS匯入資料

執行成功以後,我們可以進入psql從資料庫中檢視資料。命令如下:\dt staging.其中,staging是schema的名稱,可以看到staging中有兩個關係表。
PostGIS空間資料表

此外,我們還可以使用\d staging.world_continent檢視world_continent關係的表結構:
PostGIS表結構
可以看到這裡有一個geom的列。在PostGIS中Geography物件型別儲存在名為geog的列,而Geometry物件型別儲存在geom的列。所以,我們的資料被以Geometry物件型別儲存在資料庫。如果要儲存成為Geography物件,則需要在shp2psql命令列匯入的時候加入-G引數。

下面說說資料的匯出,我們可以使用psql2shp工具匯出資料為Shapefile檔案。命令如下:

pgsql2shp -f ~/Desktop/continent -h localhost -p 5432 -u postgres -P [passworld] postgis_in_action staging.world_continent

-f後面是匯出的檔案全路徑
-P後面接使用者postgres的密碼
最後面postgis_in_action是資料庫名稱,staging.world_continent是關係表名稱

PostGIS資料匯出

最後,看看如何使用QGIS直接連線PostgreSQL資料庫進行資料顯示。
(添加了UbuntuGIS的PPA以後,我們可直接使用sudo apt-get install qgis python-qgis qgis-plugin-grass命令安裝QGIS)
開啟QGIS,在最左側的圖示中點選Add PostGIS layers,在彈出的對話方塊中點選New新建一個連線,輸入連線引數。
QGIS連線PostGIS
點選Connect,可以看到我們的staging中有兩個關係表。
QGIS連線PostGIS
選擇world_continent關係表,然後點選Add可以進行資料的顯示。
QGIS連線PostGIS