第12章。PostGIS 扩展

目录

本章介绍了 PostGIS 源代码 tarball 和源代码存储库的 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 中,但为了方便维护,将来可能会将其移动到包含文件中。

12.1.2. 地址标准化工具类型

摘要

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

  • stdaddr — 一个由地址元素组成的复合类型。这是 standardize_address 函数的返回类型。

12.1.3. 地址标准化工具表

摘要

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

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

  • 规则表 — 规则表包含一组规则,这些规则将地址输入序列标记映射到标准化输出序列。规则被定义为一组输入标记,后跟 -1(终止符),后跟一组输出标记,后跟 -1,后跟表示规则类型的数字,后跟规则的排名。
  • lex 表 — lex 表用于对字母数字输入进行分类,并将该输入与 (a) 输入标记(请参阅“输入标记”部分)和 (b) 标准化表示形式相关联。
  • gaz 表 — 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 人口普查州区、bg 和 tabblocks 数据表,暂存并加载到 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+ 才能运行。它被打包为 Web 服务接口,并且似乎被设计为作为 Web 服务调用。就像 tiger 地理编码器一样,它既有地理编码器组件,也有反向地理编码器组件。从文档来看,尚不清楚它是否像 tiger 地理编码器一样具有纯 SQL 接口,或者是否在 Web 界面中实现了大量逻辑。

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