5. 加载空间数据

PostGIS 支持各种库和应用程序,提供了许多加载数据的选项。

我们首先从数据库备份文件加载工作数据,然后回顾一些使用常用工具加载不同 GIS 数据格式的标准方法。

5.1. 加载备份文件

  1. 在 PgAdmin 浏览器中,**右键单击** **nyc** 数据库图标,然后选择 **恢复…** 选项。

    _images/data_loading_1.png
  2. 浏览到您的工作坊数据数据目录的位置(在工作坊 数据包 中可用),并选择 nyc_data.backup 文件。

    _images/data_loading_2.png
  3. 单击 **恢复选项** 选项卡,向下滚动到 **不保存** 部分,并将 **所有者** 切换到 **是**。

    _images/data_loading_2a.png
  4. 单击 **恢复** 按钮。数据库恢复应运行至完成,无错误。

    _images/data_loading_3.png
  5. 加载完成后,右键单击 **nyc** 数据库,然后选择 **刷新** 选项以更新客户端有关数据库中存在哪些表的的信息。

    _images/data_loading_4.png

注意

如果您想练习从本机空间格式加载数据,而不是使用刚刚介绍的 PostgreSQL 数据库备份文件,接下来的几节将指导您使用各种命令行工具和 QGIS DbManager 加载数据。请注意,如果您已经使用 pgAdmin 加载了数据,可以跳过这些部分。

5.2. 使用 ogr2ogr 加载

ogr2ogr 是一个命令行实用程序,用于在 GIS 数据格式之间转换数据,包括常见的文件格式和常见的空间数据库。

Windows:
  • 可以从 GIS Internals 下载 ogr2ogr 的构建版本。

  • ogr2ogr 作为 QGIS 安装 的一部分包含在内,可以通过 OSGeo4W Shell 访问 -

  • 可以从 MS4W 下载 ogr2ogr 的构建版本。

MacOS:
  • 如果您安装了 Postgres.app,那么您将在 /Applications/Postgres.app/Contents/Versions/*/bin 目录中找到 ogr2ogr

  • 最后,如果您已安装 HomeBrew,您可以安装 gdal 包以访问 ogr2ogr

Linux:
  • 如果您从软件包中安装了 QGIS,ogr2ogr 应该已经安装并位于您的 PATH 中,作为 gdallibgdal* 软件包的一部分。

postgis 工作坊数据目录包含一个 2000/ 子目录,其中包含来自 2000 年人口普查的形状文件,这些文件已被 2010 年人口普查的数据取代。我们可以使用这些文件练习数据加载,以避免与我们已经使用备份文件加载的数据产生名称冲突。在执行这些说明时,请确保在 shell 中位于 2000/ 子目录中。

export PGPASSWORD=mydatabasepassword

我们没有在连接字符串中传递密码,而是将其放在环境中,这样在命令运行时,它不会出现在进程列表中。

请注意,在 Windows 上,您需要使用 set 而不是 export

ogr2ogr \
  -nln nyc_census_blocks_2000 \
  -nlt PROMOTE_TO_MULTI \
  -lco GEOMETRY_NAME=geom \
  -lco FID=gid \
  -lco PRECISION=NO \
  Pg:"dbname=nyc host=localhost user=pramsey port=5432" \
  nyc_census_blocks_2000.shp

为了更直观的显示,这些行用 \ 显示,但它们应该在您的 shell 上写成一行。

The ogr2ogr大量 的选项,我们这里只使用其中一小部分。以下是命令的逐行解释。

ogr2ogr \

可执行文件名称!您可能需要确保可执行文件位置在您的 PATH 中,或者使用可执行文件的完整路径,具体取决于您的设置。

-nln nyc_census_blocks_2000 \

nln 选项代表“新图层名称”,并设置将在目标数据库中创建的表名。

-nlt PROMOTE_TO_MULTI \

nlt 选项代表“新图层类型”。特别是对于形状文件输入,新图层类型通常是“多部分几何”,因此系统需要提前告知使用“MultiPolygon”而不是“Polygon”作为几何类型。

-lco GEOMETRY_NAME=geom \
-lco FID=gid \
-lco PRECISION=NO \

lco 选项代表“图层创建选项”。不同的驱动程序有不同的创建选项,我们在这里为 PostgreSQL 驱动程序 使用了三个选项。

  • GEOMETRY_NAME 设置几何列的列名。我们更喜欢“geom”而不是默认值,这样我们的表就能与研讨会中的标准列名保持一致。

  • FID 设置主键列名。同样,我们更喜欢“gid”,这是研讨会中使用的标准。

  • PRECISION 控制数字字段在数据库中的表示方式。加载 shape 文件时的默认行为是使用数据库的“numeric”类型,这种类型更精确,但有时比“integer”和“double precision”等简单数字类型更难使用。我们使用“NO”来关闭“numeric”类型。

Pg:"dbname=nyc host=localhost user=pramsey port=5432" \

ogr2ogr 中,参数的顺序大致为:可执行文件,然后是选项,然后是目标位置,然后是源位置。因此,这是目标,我们 PostgreSQL 数据库的连接字符串。“Pg:”部分是驱动程序名称,然后是 连接字符串 包含在引号中(因为它可能包含嵌入的空格)。

nyc_census_blocks_2000.shp

在这种情况下,源数据集是我们正在读取的 shape 文件。可以通过将连接字符串放在这里,然后在其后跟随一个图层名称列表,在一个调用中读取多个图层,但在这种情况下,我们只有一个 shape 文件要加载。

5.3. Shape 文件?那是什么?

你可能在问自己——“这个 shape 文件是什么?”“shape 文件”通常指的是一组文件,这些文件具有 .shp.shx.dbf 以及其他扩展名,它们具有共同的前缀名称(例如,nyc_census_blocks)。实际的 shape 文件专门指具有 .shp 扩展名的文件。但是,如果没有必要的支持文件,单独的 .shp 文件是不完整的,无法进行分发。

必备文件

  • .shp—形状格式;要素几何本身

  • .shx—形状索引格式;要素几何的方位索引

  • .dbf—属性格式;每个形状的列属性,以 dBase III 格式

可选文件包括

  • .prj—投影格式;坐标系和投影信息,一个使用知名文本格式描述投影的纯文本文件

The shp2pgsql 实用程序通过将形状数据从二进制数据转换为一系列 SQL 命令,然后在数据库中运行这些命令来加载数据,从而使形状数据在 PostGIS 中可用。

5.4. 使用 shp2pgsql 加载

The shp2pgsql 将 Shape 文件转换为 SQL。它是一个转换实用程序,是 PostGIS 代码库的一部分,并随 PostGIS 包一起提供。如果您在本地计算机上安装了 PostgreSQL,您可能会发现 shp2pgsql 已与之一起安装,并且在安装的执行目录中可用。

ogr2ogr 不同,shp2pgsql 不会直接连接到目标数据库,它只是发出与输入形状文件等效的 SQL。用户需要将 SQL 传递到数据库,无论是通过“管道”还是通过将 SQL 保存到文件然后加载它。

以下是一个示例调用,加载与之前相同的数据

export PGPASSWORD=mydatabasepassword

shp2pgsql \
  -D \
  -I \
  -s 26918 \
  nyc_census_blocks_2000.shp \
  nyc_census_blocks_2000 \
  | psql dbname=nyc user=postgres host=localhost

以下是命令的逐行解释。

shp2pgsql \

可执行程序!它读取源数据文件,并发出 SQL,该 SQL 可以定向到文件或通过管道传输到 psql 以直接加载到数据库中。

-D \

D 标志告诉程序生成“转储格式”,这比默认的“插入格式”快得多。

-I \

I 标志告诉程序在加载完成后在表上创建空间索引。

-s 26918 \

s 标志告诉程序数据的“空间参考标识符 (SRID)”是什么。本研讨会的源数据均为“UTM 18”,其 SRID 为 26918(见下文)。

nyc_census_blocks_2000.shp \

要读取的源形状文件。

nyc_census_blocks_2000 \

创建目标表时要使用的表名。

| psql dbname=nyc user=postgres host=localhost

实用程序正在生成一个 SQL 流。“|”运算符获取该流并将其用作 psql 数据库终端程序的输入。对 psql 的参数只是目标数据库的连接字符串。

5.5. SRID 26918?这是什么?

导入过程的大部分内容是不言自明的,但即使是经验丰富的 GIS 专业人员也会被 SRID 绊倒。

“SRID” 代表“空间参考标识符”。它定义了我们数据地理坐标系和投影的所有参数。SRID 很方便,因为它将有关地图投影的所有信息(可能非常复杂)打包到一个数字中。

您可以通过在线数据库查找我们的研讨会地图投影的定义,

或者直接在 PostGIS 中使用对 spatial_ref_sys 表的查询。

SELECT srtext FROM spatial_ref_sys WHERE srid = 26918;

注意

PostGIS spatial_ref_sys 表是一个 OGC 标准表,它定义了数据库中已知的所有空间参考系统。与 PostGIS 一起提供的數據列出了超过 3000 个已知空间参考系统以及在它们之间进行转换/重新投影所需的详细信息。

在这两种情况下,您都会看到 **26918** 空间参考系统的文本表示(为了清晰起见,这里进行了美化打印)

PROJCS["NAD83 / UTM zone 18N",
  GEOGCS["NAD83",
    DATUM["North_American_Datum_1983",
      SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],
      AUTHORITY["EPSG","6269"]],
    PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4269"]],
  UNIT["metre",1,AUTHORITY["EPSG","9001"]],
  PROJECTION["Transverse_Mercator"],
  PARAMETER["latitude_of_origin",0],
  PARAMETER["central_meridian",-75],
  PARAMETER["scale_factor",0.9996],
  PARAMETER["false_easting",500000],
  PARAMETER["false_northing",0],
  AUTHORITY["EPSG","26918"],
  AXIS["Easting",EAST],
  AXIS["Northing",NORTH]]

如果您打开数据目录中的 nyc_neighborhoods.prj 文件,您将看到相同的投影定义。

您从地方机构(如纽约市)收到的数据通常会使用当地投影,用“州平面”或“UTM”表示。我们的投影是“通用横轴墨卡托 (UTM) 18 区北”或 EPSG:26918。

5.6. 尝试:使用 QGIS 查看数据

QGIS 是一个桌面 GIS 查看器/编辑器,用于快速查看数据。您可以查看多种数据格式,包括平面 shapefile 和 PostGIS 数据库。它的图形界面允许您轻松探索数据,以及进行简单的测试和快速样式设置。

尝试使用此软件连接您的 PostGIS 数据库。该应用程序可以从 https://qgis.org 下载

您首先需要使用菜单 图层->添加图层->PostGIS 图层->新建 创建一个到 PostGIS 数据库的连接,然后填写提示。建立连接后,您可以通过单击连接并选择要显示的表来添加图层。

5.7. 使用 QGIS DbManager 加载数据

QGIS 自带一个名为 DbManager 的工具,它允许您连接到各种不同的数据库,包括启用了 PostGIS 的数据库。配置好 PostGIS 数据库连接后,前往 数据库->DbManager 并展开您的数据库,如下所示

_images/qgis_dbmanager.png

从那里您可以使用 导入图层/文件 菜单选项加载多种不同的空间格式。除了能够从多种空间格式加载数据并导出数据到多种格式之外,您还可以使用突出显示的扳手图标将临时查询添加到画布或在数据库中定义视图。