第 2 章  PostGIS 安裝

目錄

本章詳細介紹安裝 PostGIS 所需的步驟。

2.1. 簡短版本

若假設您的搜尋路徑中已具備所有相依性,即可進行編譯

tar -xvzf postgis-3.5.2dev.tar.gz
cd postgis-3.5.2dev
./configure
make
make install

PostGIS 安裝完成後,需要在每個想要使用的個別資料庫中啟用(第 3.3 節,「建立空間資料庫」)或升級(第 3.4 節,「升級空間資料庫」)。

2.2. 從原始碼編譯和安裝

[Note]

許多作業系統現在都包含 PostgreSQL/PostGIS 的預先建置套件。在許多情況下,只有當您想要最新的版本或是套件維護者時,才需要編譯。

本節包含一般編譯說明,如果您是為 Windows 等作業系統或其他作業系統進行編譯,您可以在 PostGIS 使用者提供的編譯指南PostGIS 開發 Wiki 中找到更多詳細的協助。

各種作業系統的預先建置套件列於 PostGIS 預先建置套件

如果您是 Windows 使用者,您可以透過 Stackbuilder 或 PostGIS Windows 下載網站 取得穩定的建置版本。我們也有 非常前沿的 Windows 實驗性建置版本,通常每週建置一到兩次,或是在發生任何令人興奮的事情時建置。您可以使用這些版本來實驗 PostGIS 的進展中版本

PostGIS 模組是 PostgreSQL 後端伺服器的擴充功能。因此,PostGIS 3.5.2dev 需要 完整的 PostgreSQL 伺服器標頭存取才能編譯。它可以使用 PostgreSQL 12 - 17 版本進行建置。較早版本的 PostgreSQL 受支援。

如果您尚未安裝 PostgreSQL,請參閱 PostgreSQL 安裝指南。 https://postgresql.dev.org.tw

[Note]

對於 GEOS 功能,當您安裝 PostgreSQL 時,您可能需要將 PostgreSQL 明確地連結到標準 C++ 程式庫

LDFLAGS=-lstdc++ ./configure [YOUR OPTIONS HERE]

這是為了解決 C++ 例外與較舊開發工具互動的錯誤。如果您遇到奇怪的問題(後端意外關閉或類似情況),請嘗試這個技巧。當然,這需要您從頭重新編譯 PostgreSQL。

以下步驟概述了 PostGIS 原始碼的設定和編譯。它們是為 Linux 使用者編寫的,不適用於 Windows 或 Mac。

2.2.1. 取得原始碼

從下載網站擷取 PostGIS 原始碼封存 https://postgis.dev.org.tw/stuff/postgis-3.5.2dev.tar.gz

wget https://postgis.dev.org.tw/stuff/postgis-3.5.2dev.tar.gz
tar -xvzf postgis-3.5.2dev.tar.gz
cd postgis-3.5.2dev

這會在目前的工作目錄中建立一個名為 postgis-3.5.2dev 的目錄。

或者,從 git 儲存庫 https://git.osgeo.org/gitea/postgis/postgis/ 中取出原始碼。

git clone https://git.osgeo.org/gitea/postgis/postgis.git postgis
cd postgis
sh autogen.sh
    

變更至新建立的 postgis 目錄以繼續安裝。

./configure

2.2.2. 安裝需求

PostGIS 有以下建置和使用需求

必要項目

  • PostgreSQL 12 - 17。需要完整安裝的 PostgreSQL(包括伺服器標頭)。PostgreSQL 可從 https://postgresql.dev.org.tw 取得。

    如需完整的 PostgreSQL / PostGIS 支援矩陣和 PostGIS/GEOS 支援矩陣,請參閱 https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS

  • GNU C 編譯器 (gcc)。可以使用其他一些 ANSI C 編譯器來編譯 PostGIS,但我們發現使用 gcc 編譯時問題會少得多。

  • GNU Make (gmakemake)。對於許多系統,GNU make 是 make 的預設版本。透過叫用 make -v 來檢查版本。其他版本的 make 可能無法正確處理 PostGIS Makefile

  • Proj 重新投影程式庫。需要 Proj 6.1 或更高版本。Proj 程式庫用於在 PostGIS 中提供座標重新投影支援。Proj 可從 https://proj.org/ 下載。

  • GEOS 幾何程式庫,版本 3.8.0 或更高版本,但需要 GEOS 3.12+ 才能充分利用所有的新功能和特性。GEOS 可從 https://libgeos.org 下載。

  • LibXML2,版本 2.5.x 或更高版本。LibXML2 目前用於某些匯入函數 (ST_GeomFromGML 和 ST_GeomFromKML)。LibXML2 可從 https://gitlab.gnome.org/GNOME/libxml2/-/releases 下載。

  • JSON-C,版本 0.9 或更高版本。JSON-C 目前用於透過函數 ST_GeomFromGeoJson 匯入 GeoJSON。JSON-C 可從 https://github.com/json-c/json-c/releases/ 下載。

  • GDAL,建議使用 3+ 版本。這是光柵支援所必需的。https://gdal.org/download.html

  • 如果使用 PostgreSQL+JIT 編譯,則需要 LLVM 版本 >=6 https://trac.osgeo.org/postgis/ticket/4125

選用項目

  • GDAL(偽選用)只有在您不需要光柵時才能省略。另請務必啟用您想要使用的驅動程式,如 第 3.2 節,「設定光柵支援」 中所述。

  • GTK(需要 GTK+2.0、2.8+)才能編譯 shp2pgsql-gui shape 檔案載入器。 http://www.gtk.org/

  • 需要 SFCGAL 1.4.1 或更高版本,並且需要 1.5.0+ 才能使用所有功能。SFCGAL 可用於為 PostGIS 提供額外的 2D 和 3D 進階分析函數,請參閱 第 8 章,《SFCGAL 函數參考》。並且也允許使用 SFCGAL 而不是 GEOS 來執行兩個後端提供的某些 2D 函數(例如 ST_Intersection 或 ST_Area)。PostgreSQL 設定變數 postgis.backend 允許最終使用者控制如果安裝 SFCGAL(預設為 GEOS)時想要使用的後端。注意:SFCGAL 1.2 至少需要 CGAL 4.3 和 Boost 1.54(請參閱:https://sfcgal.orghttps://gitlab.com/sfcgal/SFCGAL/

  • 為了建置 第 12.1 節,「地址標準化器」,您還需要 PCRE http://www.pcre.org(通常已安裝在 nix 系統上)。如果它偵測到 PCRE 程式庫,或是在設定期間傳入有效的 --with-pcre-dir=/path/to/pcre,將會自動建置第 12.1 節,「地址標準化器」

  • 為了啟用 ST_AsMVT,需要 protobuf-c 程式庫 1.1.0 或更高版本(用於使用)和 protoc-c 編譯器(用於建置)。此外,還需要 pkg-config 來驗證 protobuf-c 的正確最低版本。請參閱 protobuf-c。預設情況下,Postgis 將使用 Wagyu 更快地驗證 MVT 多邊形,這需要 c++11 編譯器。它將使用 CXXFLAGS 和與 PostgreSQL 安裝相同的編譯器。若要停用此功能並改為使用 GEOS,請在設定步驟期間使用 --without-wagyu

  • CUnit (CUnit)。這是迴歸測試所必需的。http://cunit.sourceforge.net/

  • DocBook (xsltproc) 是建置文件所必需的。Docbook 可從 http://www.docbook.org/ 取得。

  • DBLatex (dblatex) 是以 PDF 格式建置文件所必需的。DBLatex 可從 http://dblatex.sourceforge.net/ 取得。

  • ImageMagick (convert) 是產生文件中使用的影像所必需的。ImageMagick 可從 https://imagemagick.dev.org.tw/ 取得。

2.2.3. 建置設定

與大多數 Linux 安裝一樣,第一步是產生將用於建置原始碼的 Makefile。這透過執行 Shell 指令碼來完成

./configure

在沒有其他參數的情況下,此命令將嘗試自動定位建置系統上 PostGIS 原始碼所需的元件和程式庫。雖然這是 ./configure 最常見的用法,但指令碼接受一些參數,以供在非標準位置擁有所需程式庫和程式的使用者使用。

以下清單僅顯示最常用的參數。如需完整清單,請使用 --help--help=short 參數。

--with-library-minor-version

從 PostGIS 3.0 開始,預設產生的程式庫檔案將不再將次要版本作為檔案名稱的一部分。這表示所有 PostGIS 3 程式庫都將以 postgis-3 結尾。這樣做是為了使 pg_upgrade 更容易,缺點是您只能在伺服器中安裝一個版本的 PostGIS 3 系列。若要取得包含次要版本的舊檔案行為:例如 postgis-3.0,請將此開關新增至您的設定陳述式。

--prefix=PREFIX

這是將安裝 PostGIS 載入器可執行檔和共享程式庫的位置。預設情況下,此位置與偵測到的 PostgreSQL 安裝位置相同。

[Caution]

此參數目前已損壞,因為套件只會安裝到 PostgreSQL 安裝目錄中。請瀏覽 http://trac.osgeo.org/postgis/ticket/635 以追蹤此錯誤。

--with-pgconfig=FILE

PostgreSQL 提供一個名為 pg_config 的公用程式,以允許 PostGIS 等擴充功能找到 PostgreSQL 安裝目錄。使用此參數 (--with-pgconfig=/path/to/pg_config) 手動指定 PostGIS 將針對其進行建置的特定 PostgreSQL 安裝。

--with-gdalconfig=FILE

GDAL 是一個必要的程式庫,提供光柵支援所需的功能 gdal-config,以允許軟體安裝找到 GDAL 安裝目錄。使用此參數 (--with-gdalconfig=/path/to/gdal-config) 手動指定 PostGIS 將針對其進行建置的特定 GDAL 安裝。

--with-geosconfig=FILE

GEOS 是一個必要的幾何程式庫,提供一個名為 geos-config 的公用程式,以允許軟體安裝找到 GEOS 安裝目錄。使用此參數 (--with-geosconfig=/path/to/geos-config) 手動指定 PostGIS 將針對其進行建置的特定 GEOS 安裝。

--with-xml2config=FILE

LibXML 是執行 GeomFromKML/GML 處理所需的函式庫。如果您已安裝 libxml,通常可以找到它,但如果沒有安裝,或您想要使用特定版本,則需要將 PostGIS 指向特定的 xml2-config 設定檔,以使軟體安裝程式能夠找到 LibXML 的安裝目錄。請使用此參數 (>--with-xml2config=/path/to/xml2-config) 手動指定 PostGIS 將用於建置的特定 LibXML 安裝。

--with-projdir=DIR

Proj 是 PostGIS 所需的重新投影函式庫。請使用此參數 (--with-projdir=/path/to/projdir) 手動指定 PostGIS 將用於建置的特定 Proj 安裝目錄。

--with-libiconv=DIR

iconv 的安裝目錄。

--with-jsondir=DIR

JSON-C 是一個 MIT 授權的 JSON 函式庫,PostGIS ST_GeomFromJSON 支援需要它。請使用此參數 (--with-jsondir=/path/to/jsondir) 手動指定 PostGIS 將用於建置的特定 JSON-C 安裝目錄。

--with-pcredir=DIR

PCRE 是一個 BSD 授權的 Perl 相容正規表示式函式庫,address_standardizer 擴充功能需要它。請使用此參數 (--with-pcredir=/path/to/pcredir) 手動指定 PostGIS 將用於建置的特定 PCRE 安裝目錄。

--with-gui

編譯資料匯入 GUI (需要 GTK+2.0)。這將為 shp2pgsql 建立 shp2pgsql-gui 圖形介面。

--without-raster

編譯時不包含 raster 支援。

--without-topology

停用拓撲支援。由於拓撲所需的所有邏輯都在 postgis-3.5.2dev 函式庫中,因此沒有對應的函式庫。

--with-gettext=no

預設情況下,PostGIS 會嘗試偵測 gettext 支援並使用它進行編譯,但如果您遇到導致載入器損壞的不相容問題,可以使用此命令完全停用它。有關透過此設定解決問題的範例,請參閱 http://trac.osgeo.org/postgis/ticket/748。注意:關閉此選項並不會遺失太多功能。它用於 GUI 載入器的國際說明/標籤支援,該功能尚未記錄且仍處於實驗階段。

--with-sfcgal=PATH

預設情況下,如果不使用此開關,PostGIS 將不會安裝 sfcgal 支援。PATH 是一個可選的參數,允許指定 sfcgal-config 的替代路徑。

--without-phony-revision

停用更新 postgis_revision.h 以符合 git 儲存庫的目前 HEAD。

[Note]

如果您從 程式碼儲存庫 取得 PostGIS,第一步實際上是執行腳本

./autogen.sh

此腳本將產生 configure 腳本,該腳本接著用於自訂 PostGIS 的安裝。

如果您改為將 PostGIS 作為 tarball 取得,則不需要執行 ./autogen.sh,因為 configure 已產生。

2.2.4. 建置

產生 Makefile 後,建置 PostGIS 就如同執行

make

輸出的最後一行應為 "PostGIS was built successfully. Ready to install."

自 PostGIS v1.4.0 起,所有函式都有從文件產生的註解。如果您稍後想要將這些註解安裝到您的空間資料庫中,請執行需要 docbook 的命令。postgis_comments.sql 和其他套件註解檔案 raster_comments.sql、topology_comments.sql 也打包在 tar.gz 發行版的 doc 資料夾中,因此如果從 tar ball 安裝,則不需要製作註解。註解也包含在 CREATE EXTENSION 安裝中。

make comments

在 PostGIS 2.0 中引入。這會產生適合快速參考或學生講義的 html 速查表。這需要 xsltproc 來建置,並將在 doc 資料夾中產生 4 個檔案 topology_cheatsheet.htmltiger_geocoder_cheatsheet.htmlraster_cheatsheet.htmlpostgis_cheatsheet.html

您可以從 PostGIS / PostgreSQL 學習指南 下載一些以 html 和 pdf 提供的預先建置的速查表。

make cheatsheets

2.2.5. 建置 PostGIS 擴充功能並部署它們

如果您使用 PostgreSQL 9.1+,PostGIS 擴充功能會自動建置和安裝。

如果您是從原始碼儲存庫建置,您需要先建置函式描述。如果您已安裝 docbook,則會建置這些描述。您也可以使用下列語句手動建置

make comments

如果您是從發行 tar ball 建置,則不需要建置註解,因為這些註解已與 tar ball 一起預先建置打包。

這些擴充功能應作為 make install 程序的一部分自動建置。如果需要,您可以從擴充功能資料夾建置,或者如果您需要在不同的伺服器上使用它們,則可以複製檔案。

cd extensions
cd postgis
make clean
make
export PGUSER=postgres #overwrite psql variables
make check #to test before install
make install
# to test extensions
make check RUNTESTFLAGS=--extension
[Note]

make check 使用 psql 來執行測試,因此可以使用 psql 環境變數。常用且有用的覆寫變數是 PGUSERPGPORTPGHOST。請參閱 psql 環境變數

對於相同版本的 PostGIS 和 PostgreSQL,無論作業系統為何,擴充功能檔案都將始終相同,因此只要您的伺服器上已安裝 PostGIS 二進位檔,就可以將擴充功能檔案從一個作業系統複製到另一個作業系統。

如果您想要在與開發伺服器不同的單獨伺服器上手動安裝擴充功能,您需要將下列檔案從擴充功能資料夾複製到 PostgreSQL 安裝的 PostgreSQL / share / extension 資料夾中,以及如果您的伺服器上尚未安裝常規 PostGIS 所需的二進位檔。

  • 這些是控制檔案,表示資訊,例如要安裝的擴充功能版本 (如果未指定)。postgis.control, postgis_topology.control

  • 每個擴充功能 /sql 資料夾中的所有檔案。請注意,這些檔案需要複製到 PostgreSQL share/extension 資料夾的根目錄 extensions/postgis/sql/*.sqlextensions/postgis_topology/sql/*.sql

執行此操作後,您應該會在 PgAdmin -> 擴充功能中看到 postgispostgis_topology 作為可用的擴充功能。

如果您使用 psql,您可以使用此查詢驗證擴充功能是否已安裝

SELECT name, default_version,installed_version
FROM pg_available_extensions WHERE name LIKE 'postgis%' or name LIKE 'address%';

             name             | default_version | installed_version
------------------------------+-----------------+-------------------
 address_standardizer         | 3.5.2dev         | 3.5.2dev
 address_standardizer_data_us | 3.5.2dev         | 3.5.2dev
 postgis                      | 3.5.2dev         | 3.5.2dev
 postgis_raster               | 3.5.2dev         | 3.5.2dev
 postgis_sfcgal               | 3.5.2dev         |
 postgis_tiger_geocoder       | 3.5.2dev         | 3.5.2dev
 postgis_topology             | 3.5.2dev         |
(6 rows)

如果您在您查詢的資料庫中安裝了擴充功能,您將會在 installed_version 欄中看到提及。如果沒有傳回任何記錄,則表示您的伺服器上根本沒有安裝 postgis 擴充功能。PgAdmin III 1.14+ 也會在資料庫瀏覽器樹狀結構的 extensions 區段中提供此資訊,甚至允許透過按一下滑鼠右鍵來升級或解除安裝。

如果您有可用的擴充功能,您可以使用 pgAdmin 擴充功能介面或執行以下 sql 命令,在您選擇的資料庫中安裝 postgis 擴充功能

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION postgis_sfcgal;
CREATE EXTENSION fuzzystrmatch; --needed for postgis_tiger_geocoder
--optional used by postgis_tiger_geocoder, or can be used standalone
CREATE EXTENSION address_standardizer;
CREATE EXTENSION address_standardizer_data_us;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION postgis_topology;

在 psql 中,您可以使用它來查看您已安裝的版本以及它們所安裝的綱要。

\connect mygisdb
\x
\dx postgis*
List of installed extensions
-[ RECORD 1 ]-------------------------------------------------
Name        | postgis
Version     | 3.5.2dev
Schema      | public
Description | PostGIS geometry, geography, and raster spat..
-[ RECORD 2 ]-------------------------------------------------
Name        | postgis_raster
Version     | 3.0.0dev
Schema      | public
Description | PostGIS raster types and functions
-[ RECORD 3 ]-------------------------------------------------
Name        | postgis_tiger_geocoder
Version     | 3.5.2dev
Schema      | tiger
Description | PostGIS tiger geocoder and reverse geocoder
-[ RECORD 4 ]-------------------------------------------------
Name        | postgis_topology
Version     | 3.5.2dev
Schema      | topology
Description | PostGIS topology spatial types and functions
[Warning]

擴充功能資料表 spatial_ref_syslayertopology 無法明確備份。只有在備份各自的 postgispostgis_topology 擴充功能時,才能備份它們,這似乎只有在備份整個資料庫時才會發生。自 PostGIS 2.0.1 起,只有未與 PostGIS 一起打包的 srid 記錄會在備份資料庫時備份,因此請勿更改我們打包的 srid,並期望您的變更會在那裡。如果您發現問題,請提出票證。擴充功能資料表的結構永遠不會備份,因為它們是使用 CREATE EXTENSION 建立的,並且假設對於給定版本的擴充功能來說是相同的。這些行為已建置到目前的 PostgreSQL 擴充功能模型中,因此我們無法對此做任何事情。

如果您安裝了 3.5.2dev,但未使用我們出色的擴充功能系統,您可以透過執行以下命令將其變更為基於擴充功能的系統,以將函式打包到它們各自的擴充功能中。PostgreSQL 13 中移除了使用 `unpackaged` 安裝的方式,因此建議您在升級到 PostgreSQL 13 之前切換到擴充功能建置。

CREATE EXTENSION postgis FROM unpackaged;
CREATE EXTENSION postgis_raster FROM unpackaged;
CREATE EXTENSION postgis_topology FROM unpackaged;
CREATE EXTENSION postgis_tiger_geocoder FROM unpackaged;

2.2.6. 測試

如果您想要測試 PostGIS 建置,請執行

make check

上述命令將使用產生的函式庫對實際的 PostgreSQL 資料庫執行各種檢查和迴歸測試。

[Note]

如果您使用非標準的 PostgreSQL、GEOS 或 Proj 位置設定 PostGIS,您可能需要將其函式庫位置新增至 LD_LIBRARY_PATH 環境變數。

[Caution]

目前,make check 在執行檢查時依賴 PATHPGPORT 環境變數,它使用可能已使用設定參數 --with-pgconfig 指定的 PostgreSQL 版本。因此,請務必修改您的 PATH 以符合組態期間偵測到的 PostgreSQL 安裝,或準備好處理即將發生的頭痛問題。

如果成功,make check 將產生將近 500 個測試的輸出。結果將如下所示 (下面省略了許多行)

     CUnit - A unit testing framework for C - Version 2.1-3
     http://cunit.sourceforge.net/

	.
	.
	.

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites     44     44    n/a      0        0
               tests    300    300    300      0        0
             asserts   4215   4215   4215      0      n/a
Elapsed time =    0.229 seconds

	.
	.
	.

Running tests

	.
	.
	.

Run tests: 134
Failed: 0


-- if you build with SFCGAL

	.
	.
	.

Running tests

	.
	.
	.

Run tests: 13
Failed: 0

-- if you built with raster support

	.
	.
	.

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites     12     12    n/a      0        0
               tests     65     65     65      0        0
             asserts  45896  45896  45896      0      n/a


	.
	.
	.

Running tests

	.
	.
	.

Run tests: 101
Failed: 0

-- topology regress

.
.
.

Running tests

	.
	.
	.

Run tests: 51
Failed: 0

-- if you built --with-gui, you should see this too

     CUnit - A unit testing framework for C - Version 2.1-2
     http://cunit.sourceforge.net/

	.
	.
	.

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites      2      2    n/a      0        0
               tests      4      4      4      0        0
             asserts      4      4      4      0      n/a

postgis_tiger_geocoderaddress_standardizer 擴充功能目前僅支援標準的 PostgreSQL installcheck。若要測試這些,請使用以下命令。注意:如果您已在 PostGIS 程式碼資料夾的根目錄執行 make install,則不需要執行 make install。

對於 address_standardizer

cd extensions/address_standardizer
make install
make installcheck
	  

輸出應如下所示

============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries        ==============
test test-init-extensions     ... ok
test test-parseaddress        ... ok
test test-standardize_address_1 ... ok
test test-standardize_address_2 ... ok

=====================
 All 4 tests passed.
=====================

對於 tiger 地理編碼器,請確保您的 PostgreSQL 執行個體中有 postgis 和 fuzzystrmatch 擴充功能可用。如果您使用 address_standardizer 支援建置 postgis,則 address_standardizer 測試也會啟動

cd extensions/postgis_tiger_geocoder
make install
make installcheck
	  

輸出應如下所示

============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== installing fuzzystrmatch               ==============
CREATE EXTENSION
============== installing postgis                     ==============
CREATE EXTENSION
============== installing postgis_tiger_geocoder      ==============
CREATE EXTENSION
============== installing address_standardizer        ==============
CREATE EXTENSION
============== running regression test queries        ==============
test test-normalize_address   ... ok
test test-pagc_normalize_address ... ok

=====================
All 2 tests passed.
=====================

2.2.7. 安裝

若要安裝 PostGIS,請輸入

make install

這會將 PostGIS 安裝檔案複製到 --prefix 設定參數指定的適當子目錄中。特別是

  • 載入器和傾印器二進位檔安裝在 [prefix]/bin 中。

  • SQL 檔案,例如 postgis.sql,安裝在 [prefix]/share/contrib 中。

  • PostGIS 函式庫安裝在 [prefix]/lib 中。

如果您先前執行了 make comments 命令來產生 postgis_comments.sqlraster_comments.sql 檔案,請透過執行以下命令來安裝 sql 檔案

make comments-install

[Note]

postgis_comments.sqlraster_comments.sqltopology_comments.sql 已與典型的建置和安裝目標分開,因為它附帶了 xsltproc 的額外相依性。

2.3. 安裝和使用位址標準化器

過去,address_standardizer 擴充功能是一個需要另外下載的獨立套件。從 PostGIS 2.2 版開始,它已包含在內。有關 address_standardize 的更多資訊,其功能以及如何根據您的需求進行配置,請參閱第 12.1 節,「地址標準化工具」

這個標準化工具可以與 PostGIS 打包的 tiger 地理編碼器擴充功能一起使用,以取代討論過的 Normalize_Address。若要作為替代方案使用,請參閱第 2.4.2 節,「將地址標準化工具擴充功能與 Tiger 地理編碼器搭配使用」。您也可以將它用作您自己的地理編碼器的建構模組,或使用它來標準化您的地址,以便更容易比較地址。

地址標準化工具依賴 PCRE,PCRE 通常已安裝在許多 Nix 系統上,但您可以在以下位置下載最新版本:http://www.pcre.org。如果在第 2.2.3 節,「組建配置」期間找到 PCRE,則會自動組建地址標準化工具擴充功能。如果您有想要改用的自訂 pcre 安裝,請將 --with-pcredir=/path/to/pcre 傳遞給 configure,其中 /path/to/pcre 是您的 pcre include 和 lib 目錄的根資料夾。

對於 Windows 使用者,PostGIS 2.1+ 套件已包含 address_standardizer,因此無需編譯,可以直接跳到 CREATE EXTENSION 步驟。

安裝完成後,您可以連線到您的資料庫並執行 SQL

CREATE EXTENSION address_standardizer;

以下測試不需要規則、gaz 或 lex 表格

SELECT num, street, city, state, zip
 FROM parse_address('1 Devonshire Place PH301, Boston, MA 02109');

輸出應為

 num |         street         |  city  | state |  zip
-----+------------------------+--------+-------+-------
 1   | Devonshire Place PH301 | Boston | MA    | 02109

2.4. 安裝、升級 Tiger 地理編碼器,以及載入資料

像 Tiger 地理編碼器這樣的額外功能可能未包含在您的 PostGIS 發行版中。如果您缺少 tiger 地理編碼器擴充功能,或想要比您安裝的版本更新的版本,請使用 share/extension/postgis_tiger_geocoder.* 檔案,這些檔案來自 Windows 未發行版本區段中適用於您的 PostgreSQL 版本的套件。雖然這些套件適用於 Windows,但 postgis_tiger_geocoder 擴充功能檔案可以在任何作業系統上運作,因為該擴充功能是一個僅限 SQL/plpgsql 的擴充功能。

2.4.1. Tiger 地理編碼器啟用您的 PostGIS 資料庫

  1. 以下說明假設您的 PostgreSQL 安裝已安裝 postgis_tiger_geocoder 擴充功能。

  2. 透過 psql 或 pgAdmin 或其他工具連線到您的資料庫,並執行以下 SQL 命令。請注意,如果您要安裝在已經有 postgis 的資料庫中,則不需要執行第一步。如果您已經安裝 fuzzystrmatch 擴充功能,也不需要執行第二步。

    CREATE EXTENSION postgis;
    CREATE EXTENSION fuzzystrmatch;
    CREATE EXTENSION postgis_tiger_geocoder;
    --this one is optional if you want to use the rules based standardizer (pagc_normalize_address)
    CREATE EXTENSION address_standardizer;

    如果您已經安裝了 postgis_tiger_geocoder 擴充功能,並且只想更新到最新版本,請執行

    ALTER EXTENSION postgis UPDATE;
    ALTER EXTENSION postgis_tiger_geocoder UPDATE;

    如果您對 tiger.loader_platformtiger.loader_variables 進行了自訂的項目或變更,您可能需要更新這些項目。

  3. 若要確認您的安裝是否正常運作,請在您的資料庫中執行此 SQL

    SELECT na.address, na.streetname,na.streettypeabbrev, na.zip
    	FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;

    應該會輸出

     address | streetname | streettypeabbrev |  zip
    ---------+------------+------------------+-------
    	   1 | Devonshire | Pl               | 02109
  4. tiger.loader_platform 表格中建立一個新記錄,其中包含您可執行檔和伺服器的路徑。

    例如,若要建立一個名為 debbie 的設定檔,該設定檔遵循 sh 慣例。您會執行

    INSERT INTO tiger.loader_platform(os, declare_sect, pgbin, wget, unzip_command, psql, path_sep,
    		   loader, environ_set_command, county_process_command)
    SELECT 'debbie', declare_sect, pgbin, wget, unzip_command, psql, path_sep,
    	   loader, environ_set_command, county_process_command
      FROM tiger.loader_platform
      WHERE os = 'sh';

    然後編輯 declare_sect 欄中的路徑,使其符合 Debbie 的 pg、unzip、shp2pgsql、psql 等路徑位置。

    如果您不編輯此 loader_platform 表格,它將僅包含常見的項目位置,並且您必須在產生指令碼後編輯產生的指令碼。

  5. 從 PostGIS 2.4.1 開始,郵遞區號 5 位數列表區域 zcta5 載入步驟已修訂為載入目前的 zcta5 資料,並且是啟用時 Loader_Generate_Nation_Script 的一部分。預設情況下,它是關閉的,因為載入需要相當長的時間(20 到 60 分鐘),佔用相當多的磁碟空間,並且不常用。

    若要啟用它,請執行以下操作

    UPDATE tiger.loader_lookuptables SET load = true WHERE table_name = 'zcta520';

    如果存在 Geocode 函式,則可以在加入邊界篩選器以限制僅該邊界中的郵遞區號時使用它。Reverse_Geocode 函式會在傳回的地址缺少郵遞區號時使用它,這種情況經常發生在高速公路反向地理編碼中。

  6. 在伺服器根目錄或您的本機電腦上建立一個名為 gisdata 的資料夾(如果您具有與伺服器的快速網路連線)。此資料夾是將下載和處理 tiger 檔案的位置。如果您不喜歡在伺服器根目錄上建立資料夾,或者只是想要變更為不同的資料夾進行暫存,請編輯 tiger.loader_variables 表格中的 staging_fold 欄位。

  7. gisdata 資料夾中,或您指定 staging_fold 的任何位置,建立一個名為 temp 的資料夾。這將是載入器解壓縮下載的 tiger 資料的資料夾。

  8. 然後執行 Loader_Generate_Nation_Script SQL 函式,請務必使用您自訂設定檔的名稱,並將指令碼複製到 .sh 或 .bat 檔案。例如,若要建置全國載入

    psql -c "SELECT Loader_Generate_Nation_Script('debbie')" -d geocoder -tA > /gisdata/nation_script_load.sh
  9. 執行產生的全國載入命令列指令碼。

    cd /gisdata
    sh nation_script_load.sh
  10. 執行完全國指令碼後,您的 tiger_data 綱要中應該會有三個表格,而且應該已填入資料。透過從 psql 或 pgAdmin 執行以下查詢來確認您是否已執行

    SELECT count(*) FROM tiger_data.county_all;
     count
    -------
      3235
    (1 row)
    SELECT count(*) FROM tiger_data.state_all;
     count
    -------
        56
    (1 row)
    

    只有在您將 zcta5 標示為載入時,才會包含資料

    SELECT count(*) FROM tiger_data.zcta5_all;
     count
    -------
      33933
    (1 row)
    
  11. 預設情況下,與 bgtracttabblock20 對應的表格不會載入。這些表格不會被地理編碼器使用,而是供人們進行人口統計使用。如果您希望將它們作為您州載入的一部分載入,請執行以下陳述式以啟用它們。

    UPDATE tiger.loader_lookuptables SET load = true WHERE load = false AND lookup_name IN('tract', 'bg', 'tabblock20');

    或者,您可以在載入州資料後,使用 Loader_Generate_Census_Script 僅載入這些表格

  12. 對於您想要載入資料的每個州,產生一個州指令碼 Loader_Generate_Script

    [Warning]

    在您已經載入全國資料之前,請勿產生州指令碼,因為州指令碼會使用全國指令碼載入的縣市清單。

  13. psql -c "SELECT Loader_Generate_Script(ARRAY['MA'], 'debbie')" -d geocoder -tA > /gisdata/ma_load.sh
  14. 執行產生的命令列指令碼。

    cd /gisdata
    sh ma_load.sh
  15. 在您完成載入所有資料或在停止點時,最好分析所有 tiger 表格以更新統計資料(包括繼承的統計資料)

    SELECT install_missing_indexes();
    vacuum (analyze, verbose) tiger.addr;
    vacuum (analyze, verbose) tiger.edges;
    vacuum (analyze, verbose) tiger.faces;
    vacuum (analyze, verbose) tiger.featnames;
    vacuum (analyze, verbose) tiger.place;
    vacuum (analyze, verbose) tiger.cousub;
    vacuum (analyze, verbose) tiger.county;
    vacuum (analyze, verbose) tiger.state;
    vacuum (analyze, verbose) tiger.zcta5;
    vacuum (analyze, verbose) tiger.zip_lookup_base;
    vacuum (analyze, verbose) tiger.zip_state;
    vacuum (analyze, verbose) tiger.zip_state_loc;

2.4.2. 將地址標準化工具擴充功能與 Tiger 地理編碼器搭配使用

人們的許多抱怨之一是地址標準化函式 Normalize_Address,該函式會標準化地址以進行地理編碼前的準備。標準化工具遠非完美,並且嘗試修補其不完善之處需要大量的資源。因此,我們已與另一個專案整合,該專案具有更好的地址標準化引擎。若要使用這個新的 address_standardizer,您可以如第 2.3 節,「安裝和使用地址標準化工具」中所述編譯擴充功能,並將其作為擴充功能安裝在您的資料庫中。

在您將此擴充功能安裝在與您已安裝 postgis_tiger_geocoder 的同一個資料庫中之後,就可以使用 Pagc_Normalize_Address 來代替 Normalize_Address。此擴充功能與 tiger 無關,因此可以與其他資料來源(例如國際地址)一起使用。tiger 地理編碼器擴充功能確實附帶了自己的自訂版本規則表格tiger.pagc_rules)、gaz 表格tiger.pagc_gaz)和lex 表格tiger.pagc_lex)。您可以新增和更新這些內容,以改善您自己需求的標準化體驗。

2.4.3. 載入 tiger 資料所需的工具

載入程序會從人口普查網站下載各個國家檔案、請求的州、解壓縮這些檔案,然後將每個州載入到其各自的一組州表格中。每個州表格都會繼承自 tiger 綱要中定義的表格,因此只需查詢這些表格即可存取所有資料,並在任何時候使用 Drop_State_Tables_Generate_Script 刪除一組州表格,如果您需要重新載入某個州或只是不再需要某個州。

若要能夠載入資料,您需要以下工具

  • 一個從人口普查網站解壓縮 zip 檔案的工具。

    對於類 Unix 系統:unzip 可執行檔,通常已安裝在大多數類 Unix 平台上。

    對於 Windows,7-zip 是一個免費的壓縮/解壓縮工具,您可以從 http://www.7-zip.org/ 下載

  • shp2pgsql 命令列,當您安裝 PostGIS 時,預設會安裝它。

  • wget,它是一個網頁抓取工具,通常安裝在大多數 Unix/Linux 系統上。

    如果您使用的是 Windows,您可以從 http://gnuwin32.sourceforge.net/packages/wget.htm 取得預先編譯的二進位檔

如果您要從 tiger_2010 升級,您需要先產生並執行 Drop_Nation_Tables_Generate_Script。在您載入任何州資料之前,您需要載入全國資料,這可以使用 Loader_Generate_Nation_Script 來執行。這將為您產生一個載入器指令碼。Loader_Generate_Nation_Script 是一個一次性的步驟,應該在升級(從前一年的 tiger 人口普查資料)和新安裝時執行。

若要載入州資料,請參閱 Loader_Generate_Script,以針對您想要的州為您的平台產生資料載入指令碼。請注意,您可以逐步安裝這些資料。您不必一次載入所有想要的州。您可以根據需要載入它們。

在載入您想要的州之後,請務必執行

SELECT install_missing_indexes();

Install_Missing_Indexes 中所述。

若要測試事情是否按應有的方式運作,請嘗試使用 Geocode 在您州中的地址上執行地理編碼

2.4.4. 升級您的 Tiger 地理編碼器安裝和資料

首先,按照以下步驟升級您的 postgis_tiger_geocoder 擴充功能

ALTER EXTENSION postgis_tiger_geocoder UPDATE;

接著,刪除所有全國表格並載入新的表格。使用此 SQL 陳述式產生刪除指令碼,如 Drop_Nation_Tables_Generate_Script 中詳述

SELECT drop_nation_tables_generate_script();

執行產生的刪除 SQL 陳述式。

使用此 SELECT 陳述式產生全國載入指令碼,如 Loader_Generate_Nation_Script 中詳述

對於 Windows

SELECT loader_generate_nation_script('windows'); 

對於 unix/linux

SELECT loader_generate_nation_script('sh');

請參閱第 2.4.1 節,「Tiger 地理編碼器啟用您的 PostGIS 資料庫」,以取得有關如何執行產生指令碼的指示。這只需要執行一次。

[Note]

您可以混合使用不同年份的狀態表,並可單獨升級每個狀態。在升級狀態之前,您需要先使用 Drop_State_Tables_Generate_Script 來刪除該狀態先前年份的狀態表。

2.5. 安裝期間的常見問題

當您的安裝或升級未如預期進行時,有幾件事需要檢查。

  1. 請檢查您是否已安裝 PostgreSQL 12 或更新版本,並且您編譯時使用的 PostgreSQL 原始碼版本與正在運行的 PostgreSQL 版本相同。當您的 (Linux) 發行版已安裝 PostgreSQL,或者您之前已安裝 PostgreSQL 但忘記時,可能會發生混淆。PostGIS 只能與 PostgreSQL 12 或更新版本一起使用,如果您使用較舊的版本,將會產生奇怪且意想不到的錯誤訊息。若要檢查正在運行的 PostgreSQL 版本,請使用 psql 連接到資料庫並執行以下查詢

    SELECT version();

    如果您正在運行基於 RPM 的發行版,您可以使用 rpm 命令檢查是否存在預先安裝的套件,如下所示:rpm -qa | grep postgresql

  2. 如果您的升級失敗,請確保您正在還原到已安裝 PostGIS 的資料庫中。

    SELECT postgis_full_version();

另請檢查 configure 是否正確偵測到 PostgreSQL、Proj 函式庫和 GEOS 函式庫的位置和版本。

  1. configure 的輸出用於產生 postgis_config.h 檔案。請檢查 POSTGIS_PGSQL_VERSIONPOSTGIS_PROJ_VERSIONPOSTGIS_GEOS_VERSION 變數是否已正確設定。