16.1. Lesson: PostGIS设置

设置PostGIS函数将允许您从PostgreSQL中访问空间函数。

The goal for this lesson: 安装空间函数并简要演示它们的效果。

备注

在本练习中,我们假定使用的是PostGIS版本2.1或更高版本。旧版本的安装和数据库配置有所不同,但本模块中的其余部分仍然有效。有关安装和数据库配置的帮助,请参考您的平台的文档。

16.1.1. 在Ubuntu下安装

Postgis很容易从APT安装。

$ sudo apt install postgresql
$ sudo apt install postgis

真的,就这么简单。

备注

将安装的确切版本取决于您使用的Ubuntu版本以及您配置的存储库。安装后,您可以通过发出 select PostGIS_full_version(); 使用psql或其他工具进行查询。

要安装特定版本(例如,PostgreSQL Version 13和PostGIS3),您可以使用以下命令。

$ sudo apt install wget ca-certificates
$ sudo lsb_release -a
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
$ sudo apt-get update
$ sudo apt install postgis postgresql-13-postgis-3

16.1.2. 在Windows下安装

在Windows上的安装可以使用普通的Windows安装对话框从二进制程序包完成。

第一次访问 the download page 。那就跟着来 this guide

有关在Windows上安装的更多信息,请访问 PostGIS website

16.1.3. 在其他平台上安装

这个 PostGIS website download 提供了有关在其他平台(包括MacOS和其他Linux发行版)上安装的信息

16.1.4. 配置数据库以使用PostGIS

一旦安装了PostGIS,您将需要配置数据库以使用这些扩展。如果您已经安装了>2.0版的PostGIS,那么只需使用我们上一个练习中的Address数据库通过psql发出以下命令即可。

$ psql -d address -c "CREATE EXTENSION postgis;"

备注

根据您的版本,您可以在https://postgis.net/docs/postgis_administration.html#create_spatial_db.上找到有关如何在空间上启用数据库的更多说明

16.1.5. 查看已安装的PostGIS功能

PostGIS可以被认为是数据库内函数的集合,这些函数扩展了PostgreSQL的核心功能,使其能够处理空间数据。我们所说的‘处理’是指存储、检索、查询和操作。为了做到这一点,在数据库中安装了许多函数。

我们的PostgreSQL address 数据库现在可以在地理空间上使用,这要归功于PostGIS。我们将在接下来的几节中更深入地研究这一点,但让我们给您一个快速的小试。假设我们想要从文本创建一个点。首先,我们使用psql命令查找与point相关的函数。如果您尚未连接到 address 数据库,现在就这么做。然后运行:

\df *point*

这就是我们要找的命令: st_pointfromtext 。要浏览列表,请使用向下箭头,然后按 Q 退回到psqlShell。

尝试运行此命令:

select st_pointfromtext('POINT(1 1)');

结果:

st_pointfromtext
--------------------------------------------
0101000000000000000000F03F000000000000F03F
(1 row)

需要注意的三件事:

  • 我们在位置1,1(假定为EPSG:4326)定义了一个点,使用 POINT(1 1)

  • 我们运行了一条SQL语句,但不是针对任何表,而是针对从SQL提示符输入的数据,

  • 由此产生的行没有多大意义。

得到的行为OGC格式,称为‘熟知二进制’(WKB)。我们将在下一节详细介绍这种格式。

要以文本形式返回结果,我们可以快速扫描函数列表以查找返回文本的内容:

\df *text

我们现在要查找的查询是 st_astext 。让我们将其与前面的查询结合起来:

select st_astext(st_pointfromtext('POINT(1 1)'));

结果:

 st_astext
------------
  POINT(1 1)
  (1 row)

在这里,我们输入了字符串 POINT(1,1) ,将其转换为一个点,使用 st_pointfromtext() ,并将其转换回人类可读的形式 st_astext() ,这让我们回到了原来的弦上。

在我们真正深入到使用PostGIS的细节之前,还有最后一个示例:

select st_astext(st_buffer(st_pointfromtext('POINT(1 1)'),1.0));

那是怎么回事?它在我们的点周围创建了一个1度的缓冲区,并以文本形式返回结果。

16.1.6. 空间参考系

除了PostGIS功能外,该扩展还包含由欧洲石油调查小组(EPSG)定义的一组空间参考系(SRS)定义。它们在坐标参考系(CRS)转换等操作期间使用。

我们可以在数据库中检查这些SR定义,因为它们存储在正常的数据库表中。

首先,让我们通过在psql提示符下输入以下命令来查看表的模式:

\d spatial_ref_sys

结果应该是:

Table "public.spatial_ref_sys"
   Column   |          Type           | Modifiers
 -----------+-------------------------+-----------
  srid      | integer                 | not null
  auth_name | character varying(256)  |
  auth_srid | integer                 |
  srtext    | character varying(2048) |
  proj4text | character varying(2048) |
  Indexes:
"spatial_ref_sys_pkey" PRIMARY KEY, btree (srid)

您可以使用标准的SQL查询(正如我们从介绍部分中了解到的那样)来查看和操作该表-尽管除非您知道自己在做什么,否则更新或删除任何记录都不是一个好主意。

您可能感兴趣的一个SRID是EPSG:4326-使用WGS 84椭球体的地理/经度参考系。让我们来看看它:

select * from spatial_ref_sys where srid=4326;

结果:

srid      | 4326
auth_name | EPSG
auth_srid | 4326
srtext    | GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS
84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,
0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,
AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
proj4text | +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs

这个 srtext 是以熟知文本表示的投影定义(您可以从shapefile集合中的.prj文件中认出这一点)。

16.1.7. In Conclusion

现在,您已经在您的PostgreSQL副本中安装了PostGIS函数。有了这一点,您将能够利用PostGIS的广泛空间功能。

16.1.8. What's Next?

接下来,您将了解如何在数据库中表示空间要素。