本章介绍了 PostGIS 源代码包和源代码库的 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 中,但将来可能会移至包含文件以方便维护。
standardize_address
函数的返回类型。这是一个基于 plpgsql 的地理编码器,用于与美国人口普查局发布的 TIGER(拓扑集成地理编码和参考系统)/ 线和主地址数据库导出 协同工作。
地理编码器包含四个组件:数据加载函数、地址规范器、地址地理编码器和反向地理编码器。
虽然它是专门为美国设计的,但许多概念和功能是适用的,可以调整以适应其他国家/地区的地址和道路网络。
该脚本构建了一个名为 tiger
的模式,用于存放所有与 tiger 相关的函数、可重用查找数据(例如道路类型前缀、后缀、州)、用于管理数据加载的各种控制表以及所有 tiger 加载表继承的骨架基本表。
还创建了另一个名为 tiger_data
的模式,用于存放加载器从人口普查网站下载并加载到数据库中的每个州的所有人口普查数据。在当前模型中,每组州表都以州代码为前缀,例如 ma_addr
、ma_edges
等,并带有约束以仅强制执行该州数据。这些表中的每一个都继承自 tiger
模式中的 addr
、faces
、edges
等表。
所有地理编码函数仅引用基本表,因此不需要数据模式称为 tiger_data
,也不需要数据不能进一步划分为其他模式(例如,每个州一个不同的模式),只要所有表都继承自 tiger
模式中的表。
有关如何在数据库中启用扩展以及使用它加载数据的说明,请参阅 第 2.4.1 节,“Tiger Geocoder 启用您的 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 数据(边、面、地址)、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 结合使用。除了 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 是跨平台的,并且还具有反向地理编码器以及其他一些不错的功能。