Chapter 14. PostGIS Extras

Table of Contents
14.1. 地址标准器
14.1.1. 解析器的工作原理
14.1.2. 地址标准器类型
14.1.3. 地址标准化器表
14.1.4. 地址标准化函数
14.2. TIGER地理编码器

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

14.1. 地址标准器

这是一把叉子 PAGC标准器 (这部分的原始代码是 PAGC PostgreSQL地址标准器 )。

地址标准化器是一个单行地址解析器,它接受输入地址,并根据表和助手lex和gaz表中存储的一组规则对其进行规范化。

该代码内置于一个名为 address_standardizer 它可以与一起安装 CREATE EXTENSION address_standardizer; 。除了ADDRESS_STANDIZER扩展名之外,还有一个名为 address_standardizer_data_us 构建了扩展,其中包含用于美国数据的GAZ、LEX和RULES表。可以通过以下方式安装此扩展: CREATE EXTENSION address_standardizer_data_us;

此扩展模块的代码可在PostGIS中找到 extensions/address_standardizer 目前是自给自足的。

有关安装说明,请参阅: Section 2.3, “安装和使用地址标准化程序”

14.1.1. 解析器的工作原理

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

国家代码

假定为美国或CA,基于:邮政编码为美国或加拿大的州/省为美国或加拿大其他美国

邮政编码/邮政编码

可以使用与Perl兼容的正则表达式来识别它们。这些正则表达式当前位于parseAddress-api.c中,如果需要,可以相对简单地进行更改。

州/省

可以使用与Perl兼容的正则表达式来识别它们。这些正则表达式当前位于parseAddress-api.c中,但将来可能会移到Include中以便于维护。

14.1.2. 地址标准器类型

Abstract

本节列出了Address Standardizer扩展安装的PostgreSQL数据类型。注意:我们描述了这些函数的强制转换行为,这一点非常重要,尤其是在设计您自己的函数时。

标准地址 — 由地址元素组成的复合类型。这是的返回类型 standardize_address 功能。

14.1.3. 地址标准化器表

Abstract

本节列出了ADDRESS_STANDARIZER用于标准化地址的PostgreSQL表格式。请注意,这些表的名称不需要与此处引用的名称相同。例如,您可以为每个国家/地区或您的自定义地理编码器设置不同的lex、Gaz、Rules表。这些表的名称被传递给地址标准化函数。

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

规则表 — 规则表包含一组将地址输入序列令牌映射到标准化输出序列的规则。规则定义为一组输入令牌,后跟-1(终止符),后跟一组输出令牌,后跟-1,后跟表示规则类型的数字,然后是规则排名。
Lex表 — Lex表用于对字母数字输入进行分类,并将该输入与(A)输入令牌相关联(请参见 the section called “输入令牌” )和(B)标准化表述。
GAZ表 — GAZ表用于标准化地名并将该输入与(A)输入令牌相关联(请参见 the section called “输入令牌” )和(B)标准化表述。

14.1.4. 地址标准化函数

parse_address — 获取一行地址并将其分成几个部分
standardize_address — 使用lex、gaz和规则表返回输入地址的stdaddr形式。

14.2. TIGER地理编码器

Abstract

编写的基于plpgsql的地理编码器,用于 TIGER(拓扑集成地理编码和参考系统)/线路和主地址数据库导出 由美国人口普查局发布。

地理编码器有四个组件:数据加载器功能、地址规格化程序、地址地理编码器和反向地理编码器。

尽管它是专门为美国设计的,但许多概念和功能都是适用的,可以与其他国家的地址和公路网一起使用。

该脚本构建了一个名为 tiger 以容纳所有与老虎相关的功能、可重复使用的查找数据,例如道路类型前缀、后缀、状态、用于管理数据加载的各种控制表以及所有老虎加载的表从其继承的骨架基表。

另一种模式称为 tiger_data 还创建了加载程序从人口普查站点下载并加载到数据库中的每个州的所有人口普查数据。在当前模型中,每组状态表都带有州代码前缀,例如 ma_addrma_edges 具有仅强制实施该状态数据的约束。这些表中的每一个都继承自这些表 addrfacesedges ,等位于 tiger schema

所有地理编码函数仅引用基表,因此不要求调用数据方案 tiger_data 或者,该数据不能进一步分区到其他架构中--例如,每个州的不同架构,只要所有的表都继承自 tiger 架构。

有关如何在数据库中启用扩展模块以及如何使用它加载数据的说明,请参阅 Section 2.4.1, “启用PostGIS数据库的Tiger地理编码器:使用扩展模块”

[Note]

如果您使用的是Tiger地理编码器(Tiger_2010),则可以使用Extras/Tiger中附带的Upgrade_Geocoder.bat/.sh脚本来升级脚本。一个主要的变化是 tiger_2010tiger_2011+ 那是不是 countystate 表格不再按州分类。如果您有来自Tiger_2010的数据,并且想要替换为Tiger_2015,请参阅 Section 2.4.5, “升级您的Tiger地理编码器安装”

[Note]

PostGIS 2.2.0版本中的新功能是对Tiger 2015数据的支持,并将地址标准化作为PostGIS的一部分。

PostGIS2.1.0版本中的新功能是,如果您运行的是PostgreSQL 9.1+,则可以安装带有PostgreSQL扩展模型的Tiger地理编码器。参考 Section 2.4.1, “启用PostGIS数据库的Tiger地理编码器:使用扩展模块” 有关详细信息,请参阅。

这个 Pagc_Normalize_Address 作为内置产品的替代产品 Normalize_Address 。请参阅 Section 2.3, “安装和使用地址标准化程序” 以获取编译和安装说明。

设计:

该项目的目标是建立一个功能齐全的地理编码器,它可以处理任意的美国地址字符串,并使用归一化的老虎普查数据,产生反映给定地址的位置和该位置的可能性的点几何和评级。评级数字越高,结果就越糟糕。

这个 reverse_geocode 在PostGIS2.0.0中引入的函数可用于获取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 如果未指定架构,则返回。
地理编码 — 接受作为字符串(或其他标准化地址)的地址,并输出一组可能的位置,其中包括NAD 83 Long Long中的点几何图形、每个点的标准化地址以及评级。评级越低,匹配的可能性就越大。结果首先按最低评级排序。可以有选择地传入最大结果,默认为10,RESTORY_REGION(默认为NULL)
Geocode_Intersection — 包含相交的2条街道和州、市、邮政编码,并输出位于交叉点处的第一条交叉街道上的一组可能位置,还包括作为NAD 83 Long Late中的点位置的Geomout,a normalized_address (Addy)每个位置,以及评级。评级越低,匹配的可能性就越大。结果首先按最低评级排序。可以选择性地传入最大结果,默认为10。使用Tiger数据(边、面、地址)、PostgreSQL模糊字符串匹配(Soundex、levenshtein)。
Get_Geocode_Setting — 返回存储在tiger.Geocode_settings表中的特定设置的值。
Get_Tract — 从几何图形所在的轨迹表返回普查区域或字段。默认返回区域的短名称。
Install_Missing_Indexes — 查找具有地理编码器联接中使用的键列的所有表,并筛选缺少这些列上使用的索引的条件,然后将它们添加到表中。
Loader_Generate_Census_Script — 为指定州的指定平台生成外壳脚本,该脚本将下载老虎人口普查州区域、BG和选项卡块数据表、暂存并加载到 tiger_data 架构。每个状态脚本都作为单独的记录返回。
Loader_Generate_Script — 为指定状态的指定平台生成外壳脚本,该脚本将下载Tiger数据、暂存并加载到 tiger_data 架构。每个状态脚本都作为单独的记录返回。最新版本支持Tiger 2010结构变化,还加载人口普查区域、区块组和区块表。
Loader_Generate_Nation_Script — 为加载县和州查找表的指定平台生成外壳脚本。
Missing_Indexes_Generate_Script — 查找地理编码器联接中使用的具有键列的所有表,这些表缺少这些列的索引,并将输出SQL DDL以定义这些表的索引。
Normalize_Address — 在给定文本街道地址的情况下,返回一个复合 norm_addy 具有道路后缀、前缀和标准化类型、街道、街道名称等的类型划分为单独的字段。该函数将只处理用Tiger_Geocode打包的查找数据(不需要Tiger人口普查数据)。
Pagc_Normalize_Address — 在给定文本街道地址的情况下,返回一个复合 norm_addy 具有道路后缀、前缀和标准化类型、街道、街道名称等的类型划分为单独的字段。该函数将只处理用Tiger_Geocode打包的查找数据(不需要Tiger人口普查数据)。需要ADDRESS_STANDIZER扩展名。
Pprint_Addy — 给出了一个 norm_addy 复合类型对象,返回它的漂亮打印表示形式。通常与Normize_Address一起使用。
Reverse_Geocode — 获取已知空间参考系统中的几何点,并返回包含理论上可能的地址数组和交叉街道数组的记录。如果Include_strnum_range=TRUE,则将街道范围包括在交叉街道中。
Topology_Load_Tiger — 将定义的老虎数据区域加载到PostGIS拓扑中,并将老虎数据转换为拓扑的空间参考,并捕捉到拓扑的精度公差。
Set_Geocode_Setting — 设置影响地理编码器功能行为的设置。

与Tiger不同,PostGIS还有其他几个开源地理编码器,它们具有支持多个国家/地区的地理编码的优势

  • 无名氏 使用OpenStreetMap地名词典格式的数据。它需要osm2pgsql来加载数据,PostgreSQL 8.4+和PostGIS1.5+才能运行。它被打包为Web服务接口,似乎被设计为作为Web服务进行调用。就像Tiger地理编码器一样,它同时有一个地理编码器和一个反向地理编码器组件。从文档中,不清楚它是否有一个像Tiger地理编码器一样的纯SQL接口,或者是否有大量的逻辑在Web接口中实现。

  • 地理信息系统地理信息系统 还利用PostGIS,与Nominatim一样,使用OpenStreetMap(OSM)数据。它带有一个加载OSM数据的加载器,与Nominatim类似,它不仅能够对美国进行地理编码。与Nominatim非常相似,它以Web服务的形式运行,并依赖于Java 1.5、Servlet应用程序和Solr。GisGraphy是跨平台的,在其他一些巧妙的功能中,还有一个反向地理编码器。