Chapter 2. PostGIS 安装

Table of Contents

本章介绍安装 PostGIS 所需的步骤。

2.1. 简短版本

如果所有依赖项都在路径中,请按如下方式编译:

tar -xvzf postgis-3.5.0dev.tar.gz
cd postgis-3.5.0dev
./configure
make
make install

安装 PostGIS 后,您需要使每个数据库可用(Section 3.3, “创建空间数据库”)或升级它(Section 3.4, “升级空间数据库”)。

2.2. 从源代码编译和安装

[Note]

现在许多操作系统都包含 PostgreSQL/PostGIS 的预构建包。 在许多情况下,只有当您想要最前沿的版本或者您是软件包维护者时才需要编译。

本节提供一般编译过程。 如果您正在针对Windows或其他操作系统进行编译,则可以在PostGIS 用户编译指南PostGIS开发Wiki中找到更详细的帮助。

可以在 PostGIS 预构建包中找到许多操作系统的PostGIS 预构建包列表

如果您是 Windows 用户,您可以通过 Stackbuilder 或 PostGIS Windows下载站点获得稳定的版本。我们还有非常前沿的Windows实验性版本,通常每周构建一次,或者在有令人兴奋的新变化发生时构建。你可以使用这些版本来尝试正在进行中的PostGIS发布

PostGIS 模块是PostgreSQL服务的扩展。 PostGIS3.5.0dev 需要完整的 PostgreSQL 服务器标头进行编译。你可以在PostgreSQL 12 - 17之间构建。 支持旧版本的PostgreSQL。

如果您没有安装 PostgreSQL,请参阅PostgreSQL安装指南。它位于 https://www.postgresql.org

[Note]

对于GEOS功能,当您安装PostgresQL时,您可能需要将PostgreSQL显式链接到标准C++库:

LDFLAGS=-lstdc++ ./configure [YOUR OPTIONS HERE]

这是解决与旧开发工具不正常交互的虚假C++异常的一种变通方法。如果你遇到奇怪的问题(例如,后端意外关闭或类似的问题),尝试这个技巧。当然,这将需要重新从头编译你的PostgreSQL。

下一步是概述 PostGIS 源配置和编译。 这些是为Linux用户编写的,不适用于Windows或Mac。

2.2.1. 获取源代码

从下载站点 https://postgis.net/stuff/postgis-3.5.0dev.tar.gz 获取源代码的存档

wget https://postgis.net/stuff/postgis-3.5.0dev.tar.gz
tar -xvzf postgis-3.5.0dev.tar.gz
cd postgis-3.5.0dev

这将在当前工作目录中创建一个名为 postgis-3.5.0dev 的目录。

或者从 git 存储库 https://git.osgeo.org/gitea/postgis/postgis/ 中查看它。

git clone https://git.osgeo.org/gitea/postgis/postgis.git postgis
cd postgis
sh autogen.sh
    

切换到新创建的 postgis目录以继续安装。

./configure

2.2.2. 安装要求

要构建和使用 PostGIS,您需要:

不可缺少

  • PostgreSQL12 - 16。需要完整安装 PostgreSQL(包括服务器标头)。PostgreSQL可从https://www.postgresql.org 获取。

    请参阅 https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS 中完整的 PosgreSQL/PostGIS 和 PostGIS/GEOS 支持表

  • GNU C 编译器 (gcc)。其他一些 ANSI C 编译器也可以用来编译PostGIS,但使用gcc编译时我们发现问题要少得多。

  • GNU Make(gmake or make)。对于许多系统,GNU make是 make 的默认版本。通过调用make -v检查版本。 其他版本的make可能无法正确处理 PostGIS Makefile

  • Proj重投影库。需要项目 6.1 或更高版本。Proj 库用于在 PostGIS 中提供坐标重投影支持。Proj 可以从 https://proj.org/ 下载。

  • GEOS 几何库,版本 3.8.0 或更高版本,但为了充分利用所有新的函数和特性,需要使用 GEOS 3.12+。您可以从以下链接下载 GEOS: https://libgeos.org

  • LibXML2、2.5.x 或更高版本。 目前,导入函数(ST_GeomFromGML和ST_GeomFromKML)使用 LibXML2。 您可以从 https://gitlab.gnome.org/GNOME/libxml2/-/releases 下载 LibXML2。

  • JSON-C 0.9或更高版本。JSON-C 目前用于按 ST_GeomFromGeoJson 导入 GeoJSON。 JSON-C 可从 https://github.com/json-c/json-c/releases/ 下载。

  • GDAL,版本 2+ 是必需的,版本 3+ 是首选。 这是栅格支持所必需的。https://gdal.org/download.html

  • 要使用PostgreSQL+JIT进行编译,需要LLVM版本6或更高版本。请参阅 https://trac.osgeo.org/postgis/ticket/4125

可选择的

  • GDAL(伪可选)仅当您不需要栅格时才可以将其省略。另请确保启用您要使用的驱动程序,如Section 3.2, “配置栅格支持”中所述。

  • GTK(需要 GTK+2.0, 2.8+)。用于编译shp2pgsql-gui,一个shapefile loader。它位于 http://www.gtk.org/

  • SFCGAL,版本 1.3.1(或更高版本),建议使用 1.4.1 或更高版本,以能够使用所有功能。SFCGAL 可用于为 PostGIS 提供额外的 2D 和 3D 高级分析功能,详情请参考 Chapter 8, SFCGAL函数参考。此外,还可以使用 SFCGAL 替代 GEOS 来执行某些由两个后端都提供的 2D 函数(例如 ST_Intersection 或 ST_Area)。如果已安装 SFCGAL,则用户可以通过 PostgreSQL 配置变量 postgis.backend 来控制使用哪个后端(默认为 GEOS)。注意:SFCGAL 1.2 至少需要 CGAL 4.3 和 Boost 1.54(参见:https://sfcgal.org) https://gitlab.com/sfcgal/SFCGAL/

  • 要构建Section 12.1, “地址标准化工具”,您还需要PCREhttp://www.pcre.org(通常安装在 nix 系统上)。检测到 PCRE 库后,将自动构建Section 12.1, “地址标准化工具” 。 或者,指定它在配置期间有效。--with-pcre-dir=/path/to/pcre

  • 要启用ST_AsMVT,您需要ProtoBuf-C库(运行时)和ProtoC-C编译器(构建时)。要检查 protobuf-c 的正确最低版本,需要 pkg-config。 参见protobuf-c。默认情况下,PostGIS 使用 Wagyu 快速评估 MVT 多边形,但需要 C++11 编译器。 使用 CXXFLAGS 使用您用于 PostgreSQL 安装的相同编译器。如果要禁用此功能并改用 GEOS,请在配置期间指定它。 --without-wagyu

  • CUnit(CUnit)。 这是回归测试所需要的。 http://cunit.sourceforge.net/

  • DocBook (xsltproc)构建文档需要。Docbook可从 http://www.docbook.org/ 获取。

  • DBLatex (dblatex)需要以 PDF 格式构建文档。它位于 http://dblatex.sourceforge.net/

  • ImageMagick (convert)生成文档中使用的图像。它位于 http://www.imagemagick.org/

2.2.3. 构建配置

与大多数 Linux 安装一样,第一步是生成一个将用于构建源代码的 Makefile。 这是通过 shell 脚本完成的

./configure

如果未提供任何参数,此命令将自动查找在系统上构建 PostGIS 源代码所需的组件和库。./configure 是一种常见的用法,但它接受一些参数,以防您在非标准位置拥有必要的库或程序。

以下列表显示了常用参数:有关完整列表,请使用 --help--help=short参数。

--with-library-minor-version

从 PostGIS 3.0 开始,默认生成的库文件将不再将次要版本作为文件名的一部分。 这意味着所有 PostGIS 3 库都将以 postgis-3 结尾。 这样做是为了使 pg_upgrade 更容易,缺点是您只能在服务器中安装一个版本的 PostGIS 3 系列。 要获取文件的旧行为(包括次要版本):例如 postgis-3.0 将此开关添加到您的配置语句中。

--prefix=PREFIX

指定要安装 PostGIS 库和 SQL 脚本的位置。 默认情况下,它将与检测到的 PostgreSQL 安装位置相同。

[Caution]

此参数当前已损坏,只会安装在PostgreSQL的位置。有关此错误的跟踪,请参阅 http://trac.osgeo.org/postgis/ticket/635

--with-pgconfig=FILE

PostgreSQL有一个名为pg_config的实用程序,使PostGIS等扩展能够定位PostgreSQL安装目录。使用此参数 (--with-pgconfig=/path/to/pg_config)可以手动指定 PostGIS 的特定 PostgreSQL 的安装目录。

--with-gdalconfig=FILE

GDAL是必需的库,提供栅格支持 gdal-config所需的功能,以使软件安装能够找到 GDAL装目录。使用此参数 (--with-gdalconfig=/path/to/gdal-config)手动指定 PostGIS 将针对其构建的特定 GDAL的安装目录。

--with-geosconfig=FILE

作为一个基本的几何库,GEOS 有一个名为 geos-config的实用程序,它会告诉您在安装软件时在哪里安装 GEOS。使用此参数 (--with-geosconfig=/path/to/geos-config) 手动指定要用于 PostGIS 构建的特定 GEOS的安装目录。

--with-xml2config=FILE

LibXML 是执行 GeomFromKML/GML 过程所需的库。通常情况下,如果您已安装 libxml,它将被找到,但如果没有或者您想使用特定版本,您需要指定一个特定的 xml2-config 配置文件,以便让软件安装程序找到 LibXML 安装目录。使用这个参数 (>--with-xml2config=/path/to/xml2-config) 来手动指定 PostGIS 将构建的特定 LibXML 安装。

--with-projdir=DIR

Proj是PostGIS必不可少的投影库。使用此参数 (--with-projdir=/path/to/projdir)手动指定要用于 PostGIS 构建的特定 Proj 的安装目录。

--with-libiconv=DIR

iconv的安装目录。

--with-jsondir=DIR

JSON-C 是 MIT 许可的 JSON 库,是 PostGIS ST_GeomFromJSON 所必需的。使用此参数 (--with-jsondir=/path/to/jsondir) 手动指定要用于 PostGIS 构建的特定 JSON-C的安装目录。

--with-pcredir=DIR

PCRE 是 address_standardizer 扩展所需的 BSD 许可的 Perl 兼容正则表达式库。使用此参数 (--with-pcredir=/path/to/pcredir) 手动指定 PostGIS 将构建的特定 PCRE 的安装目录。

--with-gui

编译数据导入GUI(需要 GTK+2.0)。此参数为 shp2pgsql 创建一个名为 shp2pgsql-gui 的图形用户界面。

--without-raster

在没有栅格功能的情况下进行编译。

--without-topology

在没有拓扑支持的情况下进行编译。 拓扑所需的所有逻辑都是在postgis-3.5.0dev 库中创建的,因此没有关联的库。

--with-gettext=no

默认情况下,会检测 gettext 并使用它进行编译,但如果在导致加载程序损坏的不兼容问题下运行,则此命令可以禁用它。使用此功能的配置可以解决的问题示例,请参见http://trac.osgeo.org/postgis/ticket/748。 注意:关闭此功能不会消除许多功能。 它用于 GUI 加载器中的内部帮助/标签功能,这些功能尚未记录,处于实验阶段。

--with-sfcgal=PATH

默认情况下,如果没有此开关,PostGIS 将不会安装 sfcgal 支持。 PATH 是一个可选参数,允许指定 sfcgal-config 的备用 PATH。

--without-phony-revision

禁用 postgis_revision.h 更新以匹配 Git 存储库中的当前 HEAD。

[Note]

如果要从代码存储库 获取PostGIS,请先运行以下脚本

./autogen.sh

此脚本生成配置脚本。这用于自定义 PostGIS 安装。

如果要获取 PostGIS 作为存档文件,则无需./autogen.sh,因为 配置已经生成。

2.2.4. 构建

生成Makefile后,构建PostGIS就像运行命令一样简单

make

如果在输出的最后一行看到“PostGIS was built successfully. Ready to install.”,则表示您已完成

从 PostGIS v1.4.0 开始,所有函数都有从文档生成的注释。如果您希望稍后将这些注释安装到空间数据库中,请运行需要的 docbook 命令。postgis_comments.sql 和其他包注释文件 raster_comments.sql、topology_comments.sql 也打包在 doc 文件夹中的 tar.gz 中,因此如果从 tar 包中安装,则无需进行注释。 注释包含在 CREATE EXTENSION 安装中。

make comments

它是在PostGIS 2.0中引入的。 生成适合快速参考和讲义的HTML备忘单,供正在学习的人使用。 xsltproc 是必需的,生成 4 个文件。topology_cheatsheet.html,tiger_geocoder_cheatsheet.html,raster_cheatsheet.html, postgis_cheatsheet.html

预构建的HTML和PDF版本可以在PostGIS / PostgreSQL学习指南中找到

make cheatsheets

2.2.5. 构建和部署PostGIS扩展

如果您使用的是 PostgreSQL 9.1 或更高版本,则会自动构建并安装PostGIS 扩展。

如果要从源存储库构建,则必须先构建函数描述。这些是在安装文档手册时构建的。 您也可以手动安装:

make comments

如果从存档文件构建,则其中一些注释文件已经构建,因此无需构建注释。

如果您针对 PostgreSQL 9.1 进行构建,则应在 make 安装过程中自动构建扩展。如果需要,可以从扩展文件夹生成,或者根据需要在另一台服务器上复制该文件。

cd extensions
cd postgis
make clean
make
export PGUSER=postgres #overwrite psql variables
make check #to test before install
make install
# to test extensions
make check RUNTESTFLAGS=--extension
[Note]

make check 使用 psql 来运行测试,并使用 psql 环境变量。常用的可用于覆盖的有 PGUSERPGPORTPGHOST。参考psql环境变量

无论操作系统如何,扩展文件在同一版本的 PostGIS 中始终相同。只要已安装 PostGIS 二进制文件,就可以将扩展文件从一个操作系统复制到另一个操作系统。

如果您想在与您的开发不同的单独服务器上手动安装扩展,您需要将扩展文件夹中的以下文件复制到 PostgreSQL 安装的 PostgreSQL/share/extension 文件夹中 常规 PostGIS 所需的二进制文件(如果服务器上还没有它们)。

  • 这些控制文件表示信息,例如要安装的扩展版本(如果未指定)。 postgis.control,postgis_topology.control

  • 每个扩展名的 /sql 文件夹中的所有文件。请注意,必须复制到 PostgreSQL 共享/扩展文件夹的顶层。extensions/postgis/sql/*.sql, extensions/postgis_topology/sql/*.sql

完成这一步后,你应该在 PgAdmin> 中看到 postgispostgis_topology 作为可用的扩展。

如果使用 psql,则可以运行以下查询来验证是否已安装扩展:

SELECT name, default_version,installed_version
FROM pg_available_extensions WHERE name LIKE 'postgis%' or name LIKE 'address%';

             name             | default_version | installed_version
------------------------------+-----------------+-------------------
 address_standardizer         | 3.5.0dev         | 3.5.0dev
 address_standardizer_data_us | 3.5.0dev         | 3.5.0dev
 postgis                      | 3.5.0dev         | 3.5.0dev
 postgis_raster               | 3.5.0dev         | 3.5.0dev
 postgis_sfcgal               | 3.5.0dev         |
 postgis_tiger_geocoder       | 3.5.0dev         | 3.5.0dev
 postgis_topology             | 3.5.0dev         |
(6 rows)

如果您正在查询的数据库中安装了扩展程序,您将在 installed_version 列中看到提及。 如果您没有收到任何记录,则意味着您的服务器上根本没有安装 postgis 扩展。 PgAdmin III 1.14+ 还将在数据库浏览器树的扩展 部分中提供此信息,甚至允许通过右键单击进行升级或卸载。

如果您有有效的扩展,则可以使用 pgAdmin 扩展接口或通过运行以下 SQL 将 PostGIS 扩展安装到所选数据库:

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION postgis_sfcgal;
CREATE EXTENSION fuzzystrmatch; --needed for postgis_tiger_geocoder
--optional used by postgis_tiger_geocoder, or can be used standalone
CREATE EXTENSION address_standardizer;
CREATE EXTENSION address_standardizer_data_us;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION postgis_topology;

在 psql 中,你可以使用以下命令来查看你已安装的版本以及它们所在的模式。

\connect mygisdb
\x
\dx postgis*
List of installed extensions
-[ RECORD 1 ]-------------------------------------------------
Name        | postgis
Version     | 3.5.0dev
Schema      | public
Description | PostGIS geometry, geography, and raster spat..
-[ RECORD 2 ]-------------------------------------------------
Name        | postgis_raster
Version     | 3.0.0dev
Schema      | public
Description | PostGIS raster types and functions
-[ RECORD 3 ]-------------------------------------------------
Name        | postgis_tiger_geocoder
Version     | 3.5.0dev
Schema      | tiger
Description | PostGIS tiger geocoder and reverse geocoder
-[ RECORD 4 ]-------------------------------------------------
Name        | postgis_topology
Version     | 3.5.0dev
Schema      | topology
Description | PostGIS topology spatial types and functions
[Warning]

无法直接备份扩展表 spatial_ref_syslayertopology。只有在备份相应的 postgispostgis_topology 扩展时,它们才会被备份,而这似乎只会在备份整个数据库时发生。从 PostGIS 2.0.1 开始,仅在备份数据库时会备份未与 PostGIS 打包的 srid 记录,因此请不要随意更改我们打包的 srid,并期望您的更改会存在。如果您发现问题,请提交工单。由于扩展表的结构是使用 CREATE EXTENSION 创建的,并且假定在给定版本的扩展中是相同的,因此它们永远不会被备份。这些行为内置在当前的 PostgreSQL 扩展模型中,所以我们无法改变这一点。

如果你在没有使用扩展系统的情况下安装了3.5.0dev版本,你可以通过运行以下命令将其转换为基于扩展的安装方式,以将函数打包到各自的扩展中。在PostgreSQL 13中已移除了使用`unpackaged`安装方式,因此建议在升级到PostgreSQL 13之前切换到扩展构建方式。

CREATE EXTENSION postgis FROM unpackaged;
CREATE EXTENSION postgis_raster FROM unpackaged;
CREATE EXTENSION postgis_topology FROM unpackaged;
CREATE EXTENSION postgis_tiger_geocoder FROM unpackaged;

2.2.6. 测试

要测试 PostGIS,请运行以下命令

make check

此命令使用针对实际 PostgreSQL 数据库生成的库执行各种检查和回归测试。

[Note]

如果您使用非标准 PostgreSQL、GEOS 或 Proj 位置配置 PostGIS,则可能需要将它们的库位置添加到 LD_LIBRARY_PATH 环境变量中。

[Caution]

目前,make check 依赖于PATHPGPORT环境变量来执行检查。它是使用 --with-pgconfig配置参数指定的 PostgreSQL。编辑路径以匹配在配置期间检测到的 PostgreSQL。 或者为不可避免的麻烦做好准备。

如果成功,make check 将产生近 500 个测试的输出。结果将类似于 以下(下面省略了许多行):

CUnit - A unit testing framework for C - Version 2.1-3
     http://cunit.sourceforge.net/

        .
        .
        .

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites     44     44    n/a      0        0
               tests    300    300    300      0        0
             asserts   4215   4215   4215      0      n/a
Elapsed time =    0.229 seconds

        .
        .
        .

Running tests

        .
        .
        .

Run tests: 134
Failed: 0


-- if you build with SFCGAL

        .
        .
        .

Running tests

        .
        .
        .

Run tests: 13
Failed: 0

-- if you built with raster support

        .
        .
        .

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites     12     12    n/a      0        0
               tests     65     65     65      0        0
             asserts  45896  45896  45896      0      n/a


        .
        .
        .

Running tests

        .
        .
        .

Run tests: 101
Failed: 0

-- topology regress

.
.
.

Running tests

        .
        .
        .

Run tests: 51
Failed: 0

-- if you built --with-gui, you should see this too

     CUnit - A unit testing framework for C - Version 2.1-2
     http://cunit.sourceforge.net/

        .
        .
        .

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites      2      2    n/a      0        0
               tests      4      4      4      0        0
             asserts      4      4      4      0      n/a

postgis_tiger_geocoder and address_standardizer 扩展目前仅支持标准的 PostgreSQL 安装检查。要测试这些,请使用以下命令。注意:如果您已经在 PostGIS 代码文件夹的根目录中进行了安装,则不需要进行安装。

对于address_standardizer:

cd extensions/address_standardizer
make install
make installcheck
          

输出应类似于以下内容:

============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries        ==============
test test-init-extensions     ... ok
test test-parseaddress        ... ok
test test-standardize_address_1 ... ok
test test-standardize_address_2 ... ok

=====================
 All 4 tests passed.
=====================

对于 tiger 地理编码器,请确保您的 PostgreSQL 实例中具有可用的 postgis 和 fuzzystrmatch 扩展。如果您在address_standardizer支持下构建了postgis,address_standardizer测试也将启动:

cd extensions/postgis_tiger_geocoder
make install
make installcheck
          

输出应类似于以下内容:

============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== installing fuzzystrmatch               ==============
CREATE EXTENSION
============== installing postgis                     ==============
CREATE EXTENSION
============== installing postgis_tiger_geocoder      ==============
CREATE EXTENSION
============== installing address_standardizer        ==============
CREATE EXTENSION
============== running regression test queries        ==============
test test-normalize_address   ... ok
test test-pagc_normalize_address ... ok

=====================
All 2 tests passed.
=====================

2.2.7. 安装

要安装 PostGIS,请运行以下命令

make install

这会将 PostGIS 安装文件复制到由--prefix参数指定的相应子目录。以下是值得注意的子目录:

  • 加载程序和转储程序二进制文件安装在 [prefix]/bin

  • SQL 文件(例如 postgis.sql)安装在 [prefix]/share/contrib 中。

  • PostGIS 库安装在[prefix]/lib

如果之前生成了make 注释,请运行以下命令来安装这些 SQL 文件:postgis_comments.sql,raster_comments.sql

make comments-install

[Note]

postgis_comments.sql, raster_comments.sql, topology_comments.sql成为 xsltproc 的外部依赖关系,因此它与正常的构建和安装分离。

2.3. 安装和使用地址标准化工具

address_standardizer扩展是一个单独的包,需要单独下载。它包含在 PostGIS 2.2 中。有关address_standardize可以执行的操作以及如何配置它的其他信息,请参见Section 12.1, “地址标准化工具”

该标准化器可以与 PostGIS 打包的 Tiger 地理编码器扩展结合使用,作为所讨论的 Normalize_Address 的替代品。 要用作替代品,请参阅Section 2.4.2, “将地址标准化器扩展与 Tiger 地理编码器结合使用”。 您还可以将其用作您自己的地理编码器的构建块,或使用它来标准化您的地址,以便更轻松地比较地址。

地址标准化器依赖于 PCRE,它通常已安装在许多 Nix 系统上,但您可以在以下位置下载最新版本:http://www.pcre.org。如果在Section 2.2.3, “构建配置”期间找到 PCRE,则将自动构建地址标准化器扩展。如果您想使用自定义 pcre 安装,请传递到 --with-pcredir=/path/to/pcre,其中/path/to/pcre是 pcre include 和 lib 目录的根文件夹。

在 Windows 上,PostGIS 2.1 及更高版本附带了地址标准化扩展,因此您无需编译即可立即使用。直接进入CREATE EXTENSION步骤。

安装后,可以连接到目标数据库并执行以下 SQL:

CREATE EXTENSION address_standardizer;

对于下面的测试,我们不需要rules、gaz、lex 表

SELECT num, street, city, state, zip
 FROM parse_address('1 Devonshire Place PH301, Boston, MA 02109');

输出应类似于以下内容

num |         street         |  city  | state |  zip
-----+------------------------+--------+-------+-------
 1   | Devonshire Place PH301 | Boston | MA    | 02109

2.4. 安装、升级 Tiger地理编码器并加载数据

像Tiger地理编码器这样的附加组件可能未包含在您的PostGIS分发中。如果您缺少tiger 地理编码器扩展或想要比您的安装提供的更新版本,那么可以使用适用于您PostgreSQL版本的share/extension/postgis_tiger_geocoder.*文件,这些文件可以从Windows未发布版本部分的软件包中获取。尽管这些软件包是为Windows准备的,但postgis_tiger_geocoder扩展文件将在任何操作系统上工作,因为该扩展只是一个SQL/plpgsql扩展。

2.4.1. 在 PostGIS 数据库中启用Tiger地理编码器

  1. 出于本主题的目的,我们假设您已经为 PostgreSQL 安装了postgis_tiger_geocoder扩展。

  2. 使用 psql、pgAdmin 或其他工具连接到数据库,然后运行以下 SQL 命令: 如果要在已有 PostGIS 的数据库上进行安装,则无需执行第一步。 如果已安装扩展,则不需要执行第二步fuzzystrmatch

    CREATE EXTENSION postgis;
    CREATE EXTENSION fuzzystrmatch;
    CREATE EXTENSION postgis_tiger_geocoder;
    --this one is optional if you want to use the rules based standardizer (pagc_normalize_address)
    CREATE EXTENSION address_standardizer;

    如果已安装postgis_tiger_geocoder扩展,并且只想更新到最新版本,请运行:

    ALTER EXTENSION postgis UPDATE;
    ALTER EXTENSION postgis_tiger_geocoder UPDATE;

    如果生成自己的条目或对tiger.loader_platformtiger.loader_variables进行更改,则可能需要更新它们。

  3. 若要验证安装是否成功,请在目标数据库中运行以下 SQL:

    SELECT na.address, na.streetname,na.streettypeabbrev, na.zip
            FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;

    输出应类似于以下内容

    address | streetname | streettypeabbrev |  zip
    ---------+------------+------------------+-------
               1 | Devonshire | Pl               | 02109
  4. tiger.loader_platform生成表的新记录,其中包含可执行文件或服务器的路径。

    sh作为在约定后生成名为 debbie 的配置文件的示例,请运行以下命令:

    INSERT INTO tiger.loader_platform(os, declare_sect, pgbin, wget, unzip_command, psql, path_sep,
                       loader, environ_set_command, county_process_command)
    SELECT 'debbie', declare_sect, pgbin, wget, unzip_command, psql, path_sep,
               loader, environ_set_command, county_process_command
      FROM tiger.loader_platform
      WHERE os = 'sh';

    然后将declare_sect列中的路径编辑为适合Debbie 的pg、unzip、shp2pgsql、psql 等路径位置。

    如果您不编辑此 loader_platform 表,它将仅包含项目的常见位置,并且您必须在生成脚本后编辑生成的脚本。

  5. 从 PostGIS 2.4.1 开始,邮政编码 5 位制表区域 zcta5加载步骤已修改为加载当前 zcta5 数据,并且在启用时是Loader_Generate_Nation_Script 的一部分。默认情况下它是关闭的,因为它需要相当长的时间来加载(20 到 60 分钟),占用相当多的磁盘空间,并且不经常使用。

    要启用它,请执行以下操作:

    UPDATE tiger.loader_lookuptables SET load = true WHERE table_name = 'zcta520';

    如果添加了边界过滤器并将其限制为边界内的 ZIP,则在存在 ZCTA5 的情况下将使用Geocode 函数。当返回的地址没有邮政编码时,将使用Reverse_Geocode函数,这通常发生在高速公路上的反向地理编码中。

  6. 如果您有到服务器的快速网络连接,请在服务器根目录或本地电脑上创建一个名为 gisdata的文件夹。该文件夹是 Tiger 文件下载和处理的位置。 如果您对该文件夹位于服务器根目录不满意,或者只是想更改为不同的文件夹进行暂存,请编辑 tiger.loader_variables表中的字段 staging_fold

  7. gisdata在该文件夹中创建一个名为 temp 的文件夹。或者,创建由staging_fold指示的文件夹。 这是加载程序提取下载的 Tiger 数据的地方。

  8. 然后运行Loader_Generate_Nation_ScriptSQL 函数,确保使用自定义配置文件的名称并将脚本复制到 .sh 或 .bat 文件。例如,如果要使用新的配置文件加载国家/地区:

    psql -c "SELECT Loader_Generate_Nation_Script('debbie')" -d geocoder -tA > /gisdata/nation_script_load.sh
  9. 运行命令行脚本以加载生成的国家/地区数据。

    cd /gisdata
    sh nation_script_load.sh
  10. 运行国家/地区脚本后,将在架构中创建三个表来存储数据。 从 psql 或 pgAdmin 运行以下查询进行验证: tiger_data

    SELECT count(*) FROM tiger_data.county_all;
    count
    -------
      3235
    (1 row)
    SELECT count(*) FROM tiger_data.state_all;
    count
    -------
        56
    (1 row)
    

    这将只包含数据,如果您标记了ZCTA5要加载

    SELECT count(*) FROM tiger_data.zcta5_all;
    count
    -------
      33931
    (1 row)
    
  11. 默认情况下,不加载bg, tract, tabblock20对应的表。这些表不被地理编码器使用,但被人们用来进行人口统计。如果您希望将它们作为状态加载的一部分进行加载,请运行以下语句来启用它们。

    UPDATE tiger.loader_lookuptables SET load = true WHERE load = false AND lookup_name IN('tract', 'bg', 'tabblock20');

    或者,可以使用Loader_Generate_Census_Script加载状态数据,然后仅加载这些表

  12. 对于要加载数据的每个状态,请使用Loader_Generate_Script创建状态脚本。

    [Warning]

    在完成加载国家/地区数据之前,请勿创建状态脚本。这是因为状态脚本使用国家/地区脚本中加载的国家/地区列表。

  13. psql -c "SELECT Loader_Generate_Script(ARRAY['MA'], 'debbie')" -d geocoder -tA > /gisdata/ma_load.sh
  14. 运行生成的命令行脚本。

    cd /gisdata
    sh ma_load.sh
  15. 在所有数据完成加载或到达断点后,最好对所有tiger表运行分析以更新其状态(包括继承的表)

    SELECT install_missing_indexes();
    vacuum (analyze, verbose) tiger.addr;
    vacuum (analyze, verbose) tiger.edges;
    vacuum (analyze, verbose) tiger.faces;
    vacuum (analyze, verbose) tiger.featnames;
    vacuum (analyze, verbose) tiger.place;
    vacuum (analyze, verbose) tiger.cousub;
    vacuum (analyze, verbose) tiger.county;
    vacuum (analyze, verbose) tiger.state;
    vacuum (analyze, verbose) tiger.zcta5;
    vacuum (analyze, verbose) tiger.zip_lookup_base;
    vacuum (analyze, verbose) tiger.zip_state;
    vacuum (analyze, verbose) tiger.zip_state_loc;

2.4.2. 将地址标准化器扩展与 Tiger 地理编码器结合使用

您可能认为有问题的众多事情之一是在地理编码之前进行格式化地址的Normalize_Address 函数。地址规范化远非完美,修补它可能会占用大量资源。 因此,我们将其集成到其他项目中,具有更好的地址标准化引擎。要使用此新的地址标准化,请按照Section 2.3, “安装和使用地址标准化工具”中所述编译扩展并将其安装在数据库中。

在安装了 postgis_tiger_geocoder 的同一数据库中安装此扩展程序后,就可以使用 Pagc_Normalize_Address 代替 Normalize_Address。 此扩展与 Tiger 无关,因此可以与其他数据源(例如国际地址)一起使用。 Tiger 地理编码器扩展确实附带了自己的自定义版本 rules table (tiger.pagc_rules) 、 gaz table (tiger. pagc_gaz)和lex table (tiger.pagc_lex)。 您可以添加和更新这些内容,以根据自己的需求改善标准化体验。

2.4.3. Tiger数据加载所需工具

加载过程从人口普查网站下载各个国家文件、所请求的州的数据,提取文件,然后将每个州加载到其自己单独的一组州表中。每个状态表都继承自 tiger模式中定义的表,因此,如果您需要重新加载状态或不需要重新加载状态,则只需查询这些表即可访问所有数据并随时使用 Drop_State_Tables_Generate_Script 删除一组状态表不再需要一个国家了。

启用数据加载需要以下工具:

  • 提取从人口普查网站获得的ZIP文件的工具。

    在类Unix系统上,它是一个可执行文件。unzip通常已经安装在大多数类Unix平台上。

    在Windows上,它是7-zip。它是一个免费的压缩解压缩工具,可以从http://www.7-zip.org/下载

  • shp2pgsql 命令。默认情况下,它在安装PostGIS时安装。

  • wget 命令。它是一个Web检索工具,通常安装在大多数Unix / Linux系统上。

    对于 Windows,您可以从http://gnuwin32.sourceforge.net/packages/wget.htm 获取编译的二进制文件

如果您要从 Tiger_2010 升级,则需要首先生成并运行 Drop_Nation_Tables_Generate_Script。在加载任何州数据之前,您需要加载使用 Loader_Generate_Nation_Script 执行的全国范围数据。这将为您生成一个加载器脚本。Loader_Generate_Nation_Script 是一个一次性步骤,应该在升级(从上一年的tiger普查数据)和新安装时完成。

要加载状态数据,请参阅Loader_Generate_Script为您的平台生成所需状态的数据加载脚本。 请注意,您可以零碎地安装这些。 您不必一次加载您想要的所有状态。 您可以根据需要加载它们。

加载所需的状态后,如

SELECT install_missing_indexes();

所示:尝试运行 Install_Missing_Indexes

要测试您是否能够执行应执行的操作,您将在使用 Geocode的州的地址上运行地理编码器

2.4.4. 升级您的 Tiger 地理编码器 安装和数据

首先postgis_tiger_geocoder按如下所示升级扩展:

ALTER EXTENSION postgis_tiger_geocoder UPDATE;

然后删除所有国家/地区表并加载新的国家/地区表。 如Drop_Nation_Tables_Generate_Script中所述,使用此 SQL 语句生成删除脚本

SELECT drop_nation_tables_generate_script();

执行生成的删除SQL语句。

Loader_Generate_Nation_Script中所述,使用此 SELECT 语句生成删除脚本

对于Windows

SELECT loader_generate_nation_script('windows'); 

对于unix/linux

SELECT loader_generate_nation_script('sh');

有关如何运行生成脚本的说明,请参见 Section 2.4.1, “在 PostGIS 数据库中启用Tiger地理编码器”。 您只需要执行此操作一次。

[Note]

您可以混合使用不同年份的状态表,并且可以单独升级每个状态。 在升级某个州之前,您首先需要使用 Drop_State_Tables_Generate_Script 删除该州前一年的州表。

2.5. 常见问题

当安装或升级未按预期进行时,需要检查一些事项。

  1. 请确保已安装 PostgreSQL12 或更新版本,并且你正在使用与正在运行的 PostgreSQL 版本相同的 PostgreSQL 源代码进行编译。当你的(Linux)发行版已经安装了 PostgreSQL,或者以其他方式安装了 PostgreSQL 但忘记了时,可能会出现混淆。PostGIS 只能与 PostgreSQL12 或更新版本一起使用,如果使用较旧版本,可能会出现奇怪且意想不到的错误消息。要检查正在运行的 PostgreSQL 版本,可以使用 psql 连接到数据库并运行以下查询:

    SELECT version();

    如果您运行的是基于 RPM 的发行版,则可以使用rpm命令检查是否存在带有 rpm -qa | grep postgresql的预安装软件包

  2. 如果升级失败,请确保还原到已安装PostGIS的数据库。

    SELECT postgis_full_version();

此外,请检查配置是否正确检测到 PostgreSQL、Proj4 库和 GEOS 库的安装位置。

  1. 配置的输出用于生成 postgis_config.h 文件。检查POSTGIS_PGSQL_VERSION, POSTGIS_PROJ_VERSIONPOSTGIS_GEOS_VERSION变量是否已正确设置。