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';
進入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
命令檢視安裝的擴充套件:
建立好了資料庫以後,我們可以使用\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
這條命令執行過程中,需要輸入當前使用者的密碼即可。
執行過程如下:
執行成功以後,我們可以進入psql從資料庫中檢視資料。命令如下:\dt staging.
其中,staging是schema的名稱,可以看到staging中有兩個關係表。
此外,我們還可以使用\d staging.world_continent
檢視world_continent關係的表結構:
可以看到這裡有一個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是關係表名稱
最後,看看如何使用QGIS直接連線PostgreSQL資料庫進行資料顯示。
(添加了UbuntuGIS的PPA以後,我們可直接使用sudo apt-get install qgis python-qgis qgis-plugin-grass
命令安裝QGIS)
開啟QGIS,在最左側的圖示中點選Add PostGIS layers
,在彈出的對話方塊中點選New
新建一個連線,輸入連線引數。
點選Connect
,可以看到我們的staging中有兩個關係表。
選擇world_continent關係表,然後點選Add
可以進行資料的顯示。