5. 載入空間資料

PostGIS 由各種函式庫和應用程式提供支援,提供多樣選項可供載入資料。

我們會先從資料庫備份檔載入工作資料,接著回顧使用常見工具載入不同 GIS 資料格式的一些標準方式。

5.1. 載入備份檔

  1. 在 PgAdmin 瀏覽器中,在 **nyc** 資料庫圖示上**按一下右鍵**,然後選擇**還原…** 選項。

    _images/data_loading_1.png
  2. 瀏覽至工作坊資料資料目錄的位置(可在工作坊中找到 資料套件),然後選取 nyc_data.backup 檔案。

    _images/data_loading_2.png
  3. 按一下**還原選項**索引標籤,向下捲動至**不得儲存**區段,並將**所有人**切換為**是**。

    _images/data_loading_2a.png
  4. 按一下**還原**按鈕。資料庫還原應該會執行至完成而不會產生錯誤。

    _images/data_loading_3.png
  5. 載入完成後,按一下右鍵**nyc** 資料庫,然後選擇**重新整理**選項,以更新客戶端關於資料庫中有哪些表格的資訊。

    _images/data_loading_4.png

備註

如需練習從原生空間格式載入資料,而不是使用剛才涵蓋的 PostgreSQL 資料庫備份檔,後面的幾個區段將指導您透過各種命令列工具和 QGIS DbManager 進行載入。請注意,如果您已透過 pgAdmin 載入資料,可以略過這些區段。

5.2. 透過 ogr2ogr 載入

ogr2ogr 是用於在 GIS 資料格式間轉換資料的命令列工具程式,包括常見檔案格式和常見空間資料庫。

Windows:
  • 可從 GIS Internals 下載 ogr2ogr 的組建。

  • ogr2ogr 包含在 QGIS 安裝 中的組成部分,而且可透過 OSGeo4W Shell 存取 -

  • 可從 MS4W 下載 ogr2ogr 的組建。

MacOS:
  • 如果您已安裝 Postgres.app,您會在 /Applications/Postgres.app/Contents/Versions/*/bin 目錄中找到 ogr2ogr

  • 最後,如果你已安裝 HomeBrew,你可以安裝 gdal 套件來取得 ogr2ogr 的存取權限

Linux:
  • 如果你從套件安裝 QGIS,ogr2ogr 應當已安裝,且作為 gdallibgdal* 套件的一部分,已在你路徑中。

Postgis 研討會資料目錄包含一個 2000/ 子目錄,其中包含 2000 年人口普查的空間檔案,且已由 2010 年人口普查中的資料廢止。我們可以使用這些檔案來練習資料載入,以避免與我們使用備份檔案載入的資料產生名稱衝突。在執行這些指示時,務必在 shell 中位於 2000/ 子目錄中

export PGPASSWORD=mydatabasepassword

我們將密碼放在環境中,而不是在連線字串中傳遞密碼,因此在命令執行期間,密碼不會在處理程序清單中可見。

請注意,在 Windows 中,你需要使用 set,而不是 export

ogr2ogr \
  -nln nyc_census_blocks_2000 \
  -nlt PROMOTE_TO_MULTI \
  -lco GEOMETRY_NAME=geom \
  -lco FID=gid \
  -lco PRECISION=NO \
  Pg:"dbname=nyc host=localhost user=pramsey port=5432" \
  nyc_census_blocks_2000.shp

為了更清楚地了解視覺效果,這些行會顯示為 \,但你應當在 shell 中將它們寫在同一行中。

ogr2ogr 中有大量的選項,但我們在此僅使用少數幾個。以下是命令的逐行說明。

ogr2ogr \

可執行檔名稱!你可能需要確認可執行檔位置在你的 PATH 中,或使用可執行檔的完整路徑,具體取決於你的設定。

-nln nyc_census_blocks_2000 \

nln 選項代表「新的圖層名稱」,且會設定將在目標資料庫中建立的表格名稱。

-nlt PROMOTE_TO_MULTI \

nlt 選項代表「新的圖層類型」。特別是對於空間檔案輸入,新的圖層類型通常是「多部分幾何」,因此需要事先告知系統對幾何類型使用「多邊形」而不是「多邊形」。

-lco GEOMETRY_NAME=geom \
-lco FID=gid \
-lco PRECISION=NO \

lco 選項代表「建立圖層選項」。不同的驅動程式有不同的建立選項,我們在此為 PostgreSQL 驅動程式 使用三個選項。

  • GEOMETRY_NAME 設定幾何欄位的欄位名稱。在工作坊中,我們偏好使用「geom」而不是預設名稱,以使我們的表格符合標準的欄位名稱。

  • FID 設定主鍵欄位名稱。同樣地,我們偏好使用「gid」,這是工作坊中使用的標準。

  • 精度控制數字欄位在資料庫中的呈現方式。從 shape 檔載入資料的預設值會使用資料庫「數值」類型,此處理方式比較精確,但作業上有時會比「整數」和「雙重精度」等簡單數字類型困難。我們使用「否」來關閉「數值」類型。

Pg:"dbname=nyc host=localhost user=pramsey port=5432" \

大致而言,ogr2ogr 中參數的順序為:可執行檔、選項、目標位置以及來源位置。因此,這是目標位置,也是 PostgreSQL 資料庫的連結字串。「Pg:」部分是驅動程式的名稱,而後面的 連結字串 會放在引號中(因為其中可能有嵌入的空格)。

nyc_census_blocks_2000.shp

在本例中,來源資料集為我們正在讀取的 shape 檔。可以在一次呼叫中讀取多個圖層,方法是將連結字串放在這裡,然後再加上圖層名稱清單,但我們在本例中只有一個 shape 檔要載入。

5.3. Shapefiles?那是什麼?

您可能在問自己 - 「這個 shapefile 檔案是什麼東西?」「shapefile」通常用來表示一組檔案,這些檔案的 .shp.shx.dbf 以及其他附檔名具有相同的開頭名稱(例如 nyc_census_blocks)。實際的 shapefile 特別與 .shp 附檔名的檔案相關。然而,僅有 .shp 檔案本身並不完整,如果沒有必要的支援檔案就無法進行傳送。

必要的檔案

  • .shp—shape 格式;圖徵幾何本身

  • .shx—shape 索引格式;圖徵幾何的位置索引

  • .dbf—屬性格式;每個 shape 在 dBase III 中的欄屬性

可選檔案包含

  • .prj—投影格式;座標系統和投影資訊,一個使用 well-known text 格式描述投影的純文字檔

shp2pgsql 這個工具透過將二進位資料轉換為一系列 SQL 指令,讓形狀資料能夠在 PostGIS 中使用,然後這些指令會在資料庫中執行以載入資料。

5.4. 使用 shp2pgsql 載入資料

shp2pgsql 會將 Shape 檔案轉換為 SQL。它是一個轉換公用程式,是 PostGIS 程式碼庫的一部分,也與 PostGIS 套件一起發行。如果你在本機電腦上安裝了 PostgreSQL,你可能會發現 shp2pgsql 已隨附安裝,而且在安裝的可執行檔目錄中可以使用。

ogr2ogr 不同,shp2pgsql 不會直接連線到目標資料庫,它只會發出與輸入 shape 檔案相同的 SQL。使用者必須透過「管線」或先將 SQL 儲存到檔案,然後再載入,才能將 SQL 傳遞到資料庫。

以下是呼叫範例,載入與之前相同的資料

export PGPASSWORD=mydatabasepassword

shp2pgsql \
  -D \
  -I \
  -s 26918 \
  nyc_census_blocks_2000.shp \
  nyc_census_blocks_2000 \
  | psql dbname=nyc user=postgres host=localhost

以下是此命令的逐條說明。

shp2pgsql \

可執行程式!它會讀取來源資料檔,然後發出 SQL,可以將 SQL 導向檔案,或導管至 psql,以便直接載入資料庫。

-D \

D 旗標會指示程式產生「傾印格式」,其載入速度比預設的「新增格式」快很多。

-I \

I 旗標會指示程式在載入完成後,在資料表上建立空間索引。

-s 26918 \

s 旗標會指示程式此資料的「空間參考識別碼 (SRID)」為何。工作坊的來源資料都在「UTM 18」中,其 SRID 為 26918(請見下方)。

nyc_census_blocks_2000.shp \

要讀取的來源 shape 檔案。

nyc_census_blocks_2000 \

建立目標資料表時要使用的資料表名稱。

| psql dbname=nyc user=postgres host=localhost

此公用程式會產生 SQL 串流。「|」運算子會接受該串流,並將其用作 psql 資料庫終端程式程式碼的輸入。psql 的參數就是目標資料庫的連線字串。

5.5. SRID 26918?這是什麼意思?

大部分的匯入流程都不言而喻,但即使是經驗豐富的 GIS 人員也會被 SRID 給絆倒。

「SRID」代表「空間參考識別碼」。它定義我們資料的地理座標系統及投影的所有參數。SRID 很方便,因為它會將所有關於地圖投影(可能很複雜)的資訊打包成一個數字。

你可以透過在線上資料庫中查詢,或

直接在 PostGIS 中使用查詢 spatial_ref_sys 資料表來查看我們的研討會地圖投影。

SELECT srtext FROM spatial_ref_sys WHERE srid = 26918;

備註

PostGIS spatial_ref_sys 表格是 OGC 標準表格,定義了資料庫中已知的所有空間參考系統。PostGIS 提供的資料列出超過 3000 個已知的空間參考系統,以及它們之間進行轉換/重新投影所需的詳細資料。

在兩者中,您都會看到空間參考系統 **26918** 的文字表示(為了清楚起見,這裡以美化格式列印)

PROJCS["NAD83 / UTM zone 18N",
  GEOGCS["NAD83",
    DATUM["North_American_Datum_1983",
      SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],
      AUTHORITY["EPSG","6269"]],
    PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4269"]],
  UNIT["metre",1,AUTHORITY["EPSG","9001"]],
  PROJECTION["Transverse_Mercator"],
  PARAMETER["latitude_of_origin",0],
  PARAMETER["central_meridian",-75],
  PARAMETER["scale_factor",0.9996],
  PARAMETER["false_easting",500000],
  PARAMETER["false_northing",0],
  AUTHORITY["EPSG","26918"],
  AXIS["Easting",EAST],
  AXIS["Northing",NORTH]]

如果您從資料目錄中開啟 nyc_neighborhoods.prj 檔案,您將看到相同的投影定義。

您從地方機關(例如紐約市)收到的資料通常會以地方投影呈現,並標記為「州平面」或「UTM」。我們的投影是「通用橫軸墨卡托 (UTM) 區 18 北」或 EPSG:26918。

5.6. 嘗試:使用 QGIS 查看資料

QGIS 是電腦用的 GIS 檢視器/編輯器,可快速檢視資料。您可以檢視包含平面的 shapefile 和 PostGIS 資料庫在內的許多資料格式。其圖形介面允許輕鬆探索您的資料,而且簡易測試又可快速調整樣式。

嘗試使用此軟體來連線您的 PostGIS 資料庫。可以從 https://qgis.org 下載應用程式。

您首先會想要使用選單 圖層->新增圖層->PostGIS 圖層->新增,然後填寫提示建立與 PostGIS 資料庫的連線。連線完成後,您可以按一下連線並選取要顯示的表格來新增圖層。

5.7. 使用 QGIS DbManager 載入資料

QGIS 內建一個稱為 DbManager 的工具,可用於連線各種不同類型的資料庫,包含支援 PostGIS 的資料庫。設定 PostGIS 資料庫連線後,請前往 資料庫->DbManager 並展開您的資料庫,如下所示

_images/qgis_dbmanager.png

在這裡您可以使用 匯入圖層/檔案 選單選項來載入許多不同的空間格式。除了能從許多空間格式載入資料並將資料匯出到許多格式外,您還可以將臨時查詢新增到畫布,或使用畫面上標示扳手的圖示來定義資料庫中的檢視。