本章介绍了 PostGIS 源代码 tarball 和源代码存储库的 extras 文件夹中的功能。这些功能并非总是与 PostGIS 二进制版本一起打包,但通常是基于 PL/pgSQL 的脚本或标准的 shell 脚本,可以直接运行。
这是 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 节,“安装和使用地址标准化工具”。
解析器从右向左工作,首先查看邮政编码、州/省、城市等宏元素,然后查看微元素,以确定我们处理的是门牌号码、街道、路口还是地标。它目前不查找国家/地区代码或名称,但将来可以引入。
根据以下假设为美国或加拿大:邮政编码为美国或加拿大,州/省为美国或加拿大,否则为美国
这些使用 Perl 兼容的正则表达式进行识别。这些正则表达式目前位于 parseaddress-api.c 中,如果需要,可以相对容易地对其进行更改。
这些使用 Perl 兼容的正则表达式进行识别。这些正则表达式目前位于 parseaddress-api.c 中,但为了方便维护,将来可能会将其移动到包含文件中。
本节列出了地址标准化工具扩展安装的 PostgreSQL 数据类型。请注意,我们描述了这些数据类型的转换行为,这在设计自己的函数时尤其重要。
standardize_address
函数的返回类型。本节列出了 address_standardizer 用于规范化地址的 PostgreSQL 表格式。请注意,这些表的名称不必与此处引用的名称相同。例如,您可以为每个国家/地区或为您的自定义地理编码器使用不同的 lex、gaz 和规则表。这些表的名称将传递给地址标准化工具函数。
打包的扩展 address_standardizer_data_us
包含用于规范化美国地址的数据。
一个基于 plpgsql 的地理编码器,旨在与美国人口普查局发布的 TIGER(拓扑集成地理编码和参考系统)/ 线和主地址数据库导出 配合使用。
地理编码器有四个组成部分:数据加载器函数、地址标准化工具、地址地理编码器和反向地理编码器。
尽管它是专门为美国设计的,但许多概念和函数都适用,并且可以进行调整以与其他国家/地区的地址和道路网络配合使用。
该脚本构建了一个名为 tiger
的模式,用于存放所有与 tiger 相关的函数、可重用的查找数据(例如道路类型前缀、后缀、州、用于管理数据加载的各种控制表),以及所有 tiger 加载表从中继承的骨架基本表。
还创建了另一个名为 tiger_data
的模式,其中包含每个州的人口普查数据,加载器从人口普查站点下载这些数据并将其加载到数据库中。在当前模型中,每组州表的开头都带有州代码,例如 ma_addr
、ma_edges
等,并带有约束以强制执行仅该州的数据。这些表中的每一个都继承自 tiger
模式中位于的 addr
、faces
、edges
等表。
所有地理编码函数仅引用基本表,因此不需要将数据模式称为 tiger_data
,也不需要将数据进一步划分为其他模式 -- 例如,每个州使用不同的模式,只要所有表都继承自 tiger
模式中的表即可。
有关如何在数据库中启用扩展以及如何使用它加载数据的说明,请参阅 第 2.4.1 节,“Tiger 地理编码器启用您的 PostGIS 数据库”。
如果您使用的是 tiger 地理编码器 (tiger_2010),则可以使用 extras/tiger 中的随附 upgrade_geocoder.bat / .sh 脚本升级脚本。 |
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 支持的所有平台上轻松安装和使用。
它应该足够健壮,即使存在格式和拼写错误也能正常运行。
它应该具有足够的扩展性,以便在未来的数据更新或替代数据源中使用,只需最少的代码更改。
必须将 |
tiger_data
。county_all
、state_all
或州代码后跟 county
或 state
开头的所有表。tiger_data
。normalized_address
(addy) 和等级。等级越低,匹配的可能性就越大。结果首先按最低等级排序。可以选择传入最大结果(默认为 10)。使用 Tiger 数据(edges、faces、addr)、PostgreSQL 模糊字符串匹配(soundex、levenshtein)。tiger_data
模式中。每个州脚本作为单独的记录返回。tiger_data
模式中。每个州脚本作为单独的记录返回。最新版本支持 Tiger 2010 结构更改,并加载人口普查区、街区组和街区表。norm_addy
类型,该类型具有标准化的道路后缀、前缀和类型,街道、街道名称等被分解为单独的字段。此函数仅使用 tiger_geocoder 打包的查找数据即可工作(无需 tiger 人口普查数据)。norm_addy
类型,该类型具有标准化的道路后缀、前缀和类型,街道、街道名称等被分解为单独的字段。此函数仅使用 tiger_geocoder 打包的查找数据即可工作(无需 tiger 人口普查数据)。需要 address_standardizer 扩展。norm_addy
复合类型对象,返回其美化打印表示形式。通常与 normalize_address 结合使用。还有一些用于 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 是跨平台的,并且还具有一些其他很棒的功能,包括反向地理编码器。