第 11 章。PostGIS 附加功能

目录
11.1. 地址标准化器
11.1.1. 解析器的工作原理
11.1.2. 地址标准化器类型
11.1.3. 地址标准化器表
11.1.4. 地址标准化器函数
11.2. Tiger 地理编码器

本章介绍了 PostGIS 源代码包和源代码库的 extras 文件夹中的功能。这些功能并不总是与 PostGIS 二进制发行版一起打包,但通常是基于 PL/pgSQL 或标准 shell 脚本,可以按原样运行。

11.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 节,“安装和使用地址标准化器”

11.1.1. 解析器的工作原理

解析器从右到左工作,首先查看邮政编码、州/省、城市等宏观元素,然后查看微观元素以确定我们是否正在处理门牌号、街道或交叉路口或地标。它目前不查找国家代码或名称,但将来可能会引入。

国家代码

假设为美国或加拿大,基于:邮政编码为美国或加拿大,州/省为美国或加拿大,否则为美国

邮政编码/邮政编码

这些是使用 Perl 兼容正则表达式识别的。这些正则表达式目前在 parseaddress-api.c 中,如果需要,可以很容易地进行更改。

州/省

这些使用与 Perl 兼容的正则表达式识别。这些正则表达式目前在 parseaddress-api.c 中,但将来可能会移至包含文件以方便维护。

11.1.2. 地址标准化类型

摘要

本节列出了地址标准化扩展安装的 PostgreSQL 数据类型。请注意,我们描述了这些类型的强制转换行为,这在设计您自己的函数时非常重要。

stdaddr — 一个复合类型,包含地址的元素。这是 standardize_address 函数的返回类型。

11.1.3. 地址标准化表

摘要

本节列出了地址标准化器用于规范地址的 PostgreSQL 表格式。请注意,这些表不需要与此处引用的名称相同。例如,您可以为每个国家/地区或自定义地理编码器创建不同的 lex、gaz、rules 表。这些表的名称将传递到地址标准化函数中。

打包扩展 address_standardizer_data_us 包含用于标准化美国地址的数据。

rules 表 — rules 表包含一组规则,这些规则将地址输入序列标记映射到标准化输出序列。规则定义为一组输入标记,后跟 -1(终止符),后跟一组输出标记,后跟 -1,后跟表示规则类型的数字,后跟规则的排名。
lex 表 — lex 表用于对字母数字输入进行分类,并将该输入与 (a) 输入标记(参见“输入标记”部分)和 (b) 标准化表示相关联。
gaz 表 — gaz 表用于标准化地名,并将该输入与 (a) 输入标记(参见“输入标记”部分)和 (b) 标准化表示相关联。

11.1.4. 地址标准化函数

debug_standardize_address — 返回一个 json 格式的文本,列出解析标记和标准化。
parse_address — 获取一行地址并将其分解为各个部分。
standardize_address — 使用 lex、gaz 和 rule 表返回输入地址的 stdaddr 形式。

11.2. Tiger 地理编码器

摘要

这是一个基于 plpgsql 的地理编码器,用于与美国人口普查局发布的 TIGER(拓扑集成地理编码和参考系统)/ 线和主地址数据库导出 协同工作。

地理编码器包含四个组件:数据加载函数、地址规范器、地址地理编码器和反向地理编码器。

虽然它是专门为美国设计的,但许多概念和功能是适用的,可以调整以适应其他国家/地区的地址和道路网络。

该脚本构建了一个名为 tiger 的模式,用于存放所有与 tiger 相关的函数、可重用查找数据(例如道路类型前缀、后缀、州)、用于管理数据加载的各种控制表以及所有 tiger 加载表继承的骨架基本表。

还创建了另一个名为 tiger_data 的模式,用于存放加载器从人口普查网站下载并加载到数据库中的每个州的所有人口普查数据。在当前模型中,每组州表都以州代码为前缀,例如 ma_addrma_edges 等,并带有约束以仅强制执行该州数据。这些表中的每一个都继承自 tiger 模式中的 addrfacesedges 等表。

所有地理编码函数仅引用基本表,因此不需要数据模式称为 tiger_data,也不需要数据不能进一步划分为其他模式(例如,每个州一个不同的模式),只要所有表都继承自 tiger 模式中的表。

有关如何在数据库中启用扩展以及使用它加载数据的说明,请参阅 第 2.4.1 节,“Tiger Geocoder 启用您的 PostGIS 数据库”

[Note]

如果您使用的是 tiger 地理编码器 (tiger_2010),您可以使用 extras/tiger 中附带的 upgrade_geocoder.bat/.sh 脚本升级脚本。tiger_2010tiger_2011+ 之间的一个主要变化是 countystate 表不再按州划分。如果您有来自 tiger_2010 的数据,并且想要替换为 tiger_2015,请参阅 第 2.4.4 节,“升级您的 Tiger Geocoder 安装和数据”

[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 — 接收两个交叉街道和州、城市、邮政编码,并输出第一条交叉街道上位于交叉点的可能位置集,还包括 geomout 作为 NAD 83 经纬度中的点位置、每个位置的 normalized_address(addy)和评分。评分越低,匹配可能性越大。结果按评分从低到高排序。可以选择传入最大结果数(默认值为 10)。使用 Tiger 数据(边、面、地址)、PostgreSQL 模糊字符串匹配(soundex、levenshtein)。
Get_Geocode_Setting — 返回存储在 tiger.geocode_settings 表中的特定设置的值。
Get_Tract — 返回几何图形所在的区域的普查区或字段。默认返回区的简称。
Install_Missing_Indexes — 查找所有在 geocoder 联接和过滤条件中使用关键列但缺少这些列的已使用索引的表,并将添加这些索引。
Loader_Generate_Census_Script — 为指定平台和指定州生成一个 shell 脚本,该脚本将下载 Tiger 普查州区、BG 和 Tabblock 数据表,并将这些数据表暂存并加载到 tiger_data 模式中。每个州脚本都作为单独的记录返回。
Loader_Generate_Script — 为指定平台和指定州生成一个 shell 脚本,该脚本将下载 Tiger 数据,并将这些数据暂存并加载到 tiger_data 模式中。每个州脚本都作为单独的记录返回。最新版本支持 Tiger 2010 结构更改,还加载普查区、区块组和区块表。
Loader_Generate_Nation_Script — 为指定平台生成一个加载县和州查找表的 shell 脚本。
Missing_Indexes_Generate_Script — 查找所有在 geocoder 连接中使用关键列但缺少这些列索引的表,并输出定义这些表索引的 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 — 将定义的虎数据区域加载到 PostGIS 拓扑中,并将虎数据转换为拓扑的空间参考,并捕捉到拓扑的精度容差。
Set_Geocode_Setting — 设置影响地理编码函数行为的设置。

除了 Tiger 地理编码器之外,还有其他几个开源地理编码器,它们与 Tiger 地理编码器不同,具有多国地理编码支持的优势。

  • Nominatim 使用 OpenStreetMap 地名格式数据。它需要 osm2pgsql 来加载数据,PostgreSQL 8.4+ 和 PostGIS 1.5+ 才能运行。它打包为 Web 服务接口,似乎设计为 Web 服务调用。就像 Tiger 地理编码器一样,它既有地理编码器,也有反向地理编码器组件。从文档中不清楚它是否具有像 Tiger 地理编码器那样的纯 SQL 接口,或者是否在 Web 接口中实现了大量逻辑。

  • GIS Graphy 也利用 PostGIS,并且像 Nominatim 一样使用 OpenStreetMap (OSM) 数据。它附带一个加载器来加载 OSM 数据,并且与 Nominatim 类似,能够对不仅仅是美国进行地理编码。与 Nominatim 非常相似,它作为 Web 服务运行,并依赖于 Java 1.5、Servlet 应用程序、Solr。GisGraphy 是跨平台的,并且还具有反向地理编码器以及其他一些不错的功能。