第 12 章。PostGIS 額外功能

目錄

本章記錄了 PostGIS 原始碼壓縮檔和原始碼儲存庫 extras 資料夾中找到的功能。這些功能不一定會與 PostGIS 二進位發行版本一起封裝,但通常是基於 PL/pgSQL 或可以照常執行的標準 Shell 指令碼。

12.1. 地址標準化工具

這是 PAGC 標準化工具 的分支(此部分的原始程式碼是 PAGC PostgreSQL 地址標準化工具)。

地址標準化工具是一種單行地址解析器,它會接收輸入地址,並根據儲存在表格和輔助 lex 和 gaz 表格中的一組規則將其正規化。

該程式碼被建置到一個名為 address_standardizer 的單一 PostgreSQL 擴充函式庫中,可以使用 CREATE EXTENSION address_standardizer; 安裝。除了 address_standardizer 擴充功能之外,還建置了一個名為 address_standardizer_data_us 的範例資料擴充功能,其中包含美國資料的 gaz、lex 和規則表格。此擴充功能可以使用以下方式安裝:CREATE EXTENSION address_standardizer_data_us;

此擴充功能的程式碼可在 PostGIS extensions/address_standardizer 中找到,目前是獨立的。

如需安裝說明,請參閱:第 2.3 節,「安裝與使用地址標準化工具」

12.1.1. 解析器如何運作

解析器從右向左運作,首先查看郵遞區號、州/省、城市等巨型元素,然後查看微型元素以判斷我們處理的是門牌號碼街道、交叉路口還是地標。它目前不尋找國家/地區代碼或名稱,但未來可能會引入。

國家/地區代碼

根據以下假設為美國或加拿大:郵遞區號為美國或加拿大,州/省為美國或加拿大,否則為美國

郵遞區號/郵編

這些是使用 Perl 相容的正規表示式辨識的。這些正規表示式目前位於 parseaddress-api.c 中,如果需要,相對容易進行變更。

州/省

這些是使用 Perl 相容的正規表示式辨識的。這些正規表示式目前位於 parseaddress-api.c 中,但未來可能會移至 include 中,以方便維護。

12.1.2. 地址標準化工具類型

摘要

本節列出地址標準化工具擴充功能安裝的 PostgreSQL 資料類型。請注意,我們會描述這些資料類型的類型轉換行為,這在設計您自己的函式時非常重要。

  • stdaddr — 一種複合類型,由地址的元素組成。這是 standardize_address 函式的傳回類型。

12.1.3. 地址標準化工具表格

摘要

本節列出 address_standardizer 用於正規化地址的 PostgreSQL 表格格式。請注意,這些表格的名稱不需要與此處參考的名稱相同。例如,您可以為每個國家/地區或自訂地理編碼器設定不同的 lex、gaz 和規則表格。這些表格的名稱會傳遞到地址標準化工具函式中。

封裝的擴充功能 address_standardizer_data_us 包含用於正規化美國地址的資料。

  • rules table — 規則表格包含一組規則,將地址輸入序列符記對應到標準化輸出序列。規則定義為一組輸入符記,後接 -1 (終止符),後接一組輸出符記,後接 -1,後接表示規則種類的數字,後接規則的排名。
  • lex table — lex 表格用於分類字母數字輸入,並將該輸入與 (a) 輸入符記 (請參閱「輸入符記」一節) 和 (b) 標準化表示建立關聯。
  • gaz table — gaz 表格用於標準化地名,並將該輸入與 (a) 輸入符記 (請參閱「輸入符記」一節) 和 (b) 標準化表示建立關聯。

12.1.4. 地址標準化工具函式

12.2. Tiger 地理編碼器

摘要

一個基於 plpgsql 的地理編碼器,用於處理美國人口普查局發布的 TIGER(拓撲整合地理編碼和參考系統)/線和主地址資料庫匯出

地理編碼器有四個元件:資料載入器函式、地址正規化工具、地址地理編碼器和反向地理編碼器。

儘管它是專門為美國設計的,但許多概念和函式都適用,並且可以調整以用於其他國家/地區的地址和道路網路。

指令碼會建置一個名為 tiger 的結構描述,以容納所有與 tiger 相關的函式、可重複使用的查閱資料(例如道路類型字首、字尾、州、用於管理資料載入的各種控制表格,以及所有 tiger 載入表格繼承的骨架基本表格)。

還會建立另一個名為 tiger_data 的結構描述,其中包含每個州的普查資料,載入器會從普查網站下載這些資料並載入到資料庫中。在目前模型中,每組州表格都以州代碼作為字首,例如 ma_addrma_edges 等,並加上限制,以強制只使用該州資料。每個表格都繼承自 tiger 結構描述addrfacesedges 等表格。

所有地理編碼函式都只參考基本表格,因此資料結構描述不需要稱為 tiger_data,而且資料不能進一步分割到其他結構描述中 – 例如,每個州使用不同的結構描述,只要所有表格都繼承自 tiger 結構描述中的表格即可。

如需有關如何在資料庫中啟用擴充功能以及使用它載入資料的說明,請參閱 第 2.4.1 節,「Tiger 地理編碼器啟用您的 PostGIS 資料庫」

[Note]

如果您使用的是 tiger 地理編碼器 (tiger_2010),您可以使用 extras/tiger 中隨附的 upgrade_geocoder.bat / .sh 指令碼來升級指令碼。tiger_2010tiger_2011+ 之間的主要變更是 countystate 表格不再依州分開。如果您有來自 tiger_2010 的資料,並想要替換為 tiger_2015,請參閱 第 2.4.4 節,「升級您的 Tiger 地理編碼器安裝和資料」

[Note]

PostGIS 2.2.0 版本的新增功能是支援 Tiger 2015 資料,並將地址標準化工具納入 PostGIS 中。

PostGIS 2.1.0 版本的新增功能是,如果您執行的是 PostgreSQL 9.1+,則能夠使用 PostgreSQL 擴充模型安裝 tiger 地理編碼器。如需詳細資訊,請參閱 第 2.4.1 節,「Tiger 地理編碼器啟用您的 PostGIS 資料庫」

Pagc_Normalize_Address 函式可作為內建 Normalize_Address 的替代函式。如需編譯和安裝說明,請參閱 第 2.3 節,「安裝與使用地址標準化工具」

設計

此專案的目標是建置一個功能齊全的地理編碼器,可以處理任意美國地址字串,並使用正規化的 TIGER 普查資料,產生一個點幾何和評等,反映給定地址的位置和位置可能性。評等數字越高,結果越差。

PostGIS 2.0.0 中引入的 reverse_geocode 函式可用於推導 GPS 位置的街道地址和交叉路口。

對於任何熟悉 PostGIS 的使用者來說,地理編碼器應該很容易安裝和使用,並且應該很容易在 PostGIS 支援的所有平台上安裝和使用。

它應該足夠穩健,即使存在格式和拼寫錯誤也能正常運作。

它應該足夠可擴充,可以在最少的程式碼變更下,與未來的資料更新或替代資料來源一起使用。

[Note]

必須將 tiger 結構描述新增至資料庫搜尋路徑,函式才能正常運作。

  • Drop_Indexes_Generate_Script — 產生一個指令碼,該指令碼會捨棄 tiger 結構描述和使用者指定結構描述中所有非主鍵和非唯一索引。如果未指定結構描述,則預設結構描述為 tiger_data
  • Drop_Nation_Tables_Generate_Script — 產生一個指令碼,該指令碼會捨棄指定結構描述中所有以 county_allstate_all 或州代碼開頭,後接 countystate 的表格。
  • Drop_State_Tables_Generate_Script — 產生一個指令碼,該指令碼會捨棄指定結構描述中所有以州縮寫為字首的表格。如果未指定結構描述,則預設結構描述為 tiger_data
  • Geocode — 接收地址作為字串(或其他正規化地址),並輸出可能的位置集,其中包括 NAD 83 長度緯度中的點幾何、每個位置的正規化地址和評等。評等越低,比對的可能性越高。結果會先依最低評等排序。您可以選擇傳入最大結果,預設為 10,以及 restrict_region(預設為 NULL)
  • Geocode_Intersection — 接收 2 條相交的街道以及州、城市、郵遞區號,並輸出第一條在交叉路口的相交街道上可能的位置集,其中還包括 geomout 作為 NAD 83 長度緯度中的點位置、每個位置的 normalized_address (addy) 和評等。評等越低,比對的可能性越高。結果會先依最低評等排序。您可以選擇傳入最大結果,預設為 10。使用 Tiger 資料(edges、faces、addr)、PostgreSQL 模糊字串比對 (soundex、levenshtein)。
  • Get_Geocode_Setting — 傳回儲存在 tiger.geocode_settings 表格中的特定設定值。
  • Get_Tract — 傳回幾何所在位置的人口普查區域或來自區域表格的欄位。預設為傳回區域的簡短名稱。
  • Install_Missing_Indexes — 尋找在地理編碼器聯結和篩選條件中使用的索引遺失索引的所有表格,並會新增這些索引。
  • Loader_Generate_Census_Script — 為指定平台和指定州別產生 shell 腳本,該腳本將下載 Tiger 人口普查州份的區塊、區塊群組和製表區塊數據表,並將其暫存和載入到 tiger_data 模式中。每個州的腳本將以單獨的記錄返回。
  • Loader_Generate_Script — 為指定平台和指定州別產生 shell 腳本,該腳本將下載 Tiger 數據,並將其暫存和載入到 tiger_data 模式中。最新版本支援 Tiger 2010 的結構性變更,並載入人口普查區塊、區塊群組和區塊表。
  • Loader_Generate_Nation_Script — 為指定平台產生 shell 腳本,該腳本會載入縣和州查詢表。
  • Missing_Indexes_Generate_Script — 尋找所有在地理編碼器連接中使用的關鍵欄位但缺少這些欄位索引的表,並輸出 SQL DDL 以為這些表定義索引。
  • Normalize_Address — 給定一個文字街道地址,返回一個複合 norm_addy 類型,該類型具有標準化的道路後綴、前綴和類型,以及被分成獨立欄位的街道、街道名稱等。此函數僅使用 tiger_geocoder 套件中的查詢數據即可運作(無需 tiger 人口普查數據)。
  • Pagc_Normalize_Address — 給定一個文字街道地址,返回一個複合 norm_addy 類型,該類型具有標準化的道路後綴、前綴和類型,以及被分成獨立欄位的街道、街道名稱等。此函數僅使用 tiger_geocoder 套件中的查詢數據即可運作(無需 tiger 人口普查數據)。需要 address_standardizer 擴充功能。
  • Pprint_Addy — 給定一個 norm_addy 複合類型物件,返回其美觀列印表示。通常與 normalize_address 結合使用。
  • Reverse_Geocode — 接收一個已知空間參考系統中的幾何點,並返回一個記錄,其中包含理論上可能的地址陣列和交叉街道陣列。如果 include_strnum_range = true,則在交叉街道中包含街道範圍。
  • Topology_Load_Tiger — 將定義區域的 tiger 數據載入 PostGIS 拓撲中,並將 tiger 數據轉換為拓撲的空間參考,並貼齊拓撲的精度容差。
  • Set_Geocode_Setting — 設定影響地理編碼器函數行為的設定。

還有一些其他的 PostGIS 開源地理編碼器,與 tiger 地理編碼器不同的是,它們具有多國地理編碼支援的優勢。

  • Nominatim 使用 OpenStreetMap 地名錄格式數據。它需要 osm2pgsql 來載入數據,以及 PostgreSQL 8.4+ 和 PostGIS 1.5+ 才能運作。它被封裝為網路服務介面,並且看起來像是被設計為以網路服務的方式呼叫。與 tiger 地理編碼器一樣,它同時具有地理編碼器和反向地理編碼器元件。從文檔來看,尚不清楚它是否具有像 tiger 地理編碼器那樣的純 SQL 介面,或者是否大部分邏輯是在網路介面中實現的。

  • GIS Graphy 也使用 PostGIS,並且與 Nominatim 一樣使用 OpenStreetMap (OSM) 數據。它帶有一個載入器來載入 OSM 數據,並且與 Nominatim 類似,它不僅可以對美國進行地理編碼。與 Nominatim 非常相似,它作為網路服務運行,並依賴於 Java 1.5、Servlet 應用程式和 Solr。GisGraphy 是跨平台的,並且還具有反向地理編碼器以及其他一些不錯的功能。