如何在Ubuntu14.04上安装和配置PostGIS

来自菜鸟教程
跳转至:导航、​搜索

介绍

PostGIS 是 PostgreSQL 关系数据库的空间扩展。 PostGIS 允许您使用几何和地理数据类型存储空间数据,使用空间函数执行空间查询以确定面积、距离、长度和周长,并在数据上创建空间索引以加快空间查询。

在本指南中,您将安装 PostGIS、为空间数据配置 PostgreSQL、将一些空间对象加载到数据库中,并执行基本查询。

先决条件

在开始本指南之前,您需要以下内容:

  • 一台 Ubuntu 14.04 服务器
  • 具有 sudo 权限的非 root 用户。 教程 Initial server setup guide for Ubuntu 14.04 解释了如何设置。
  • 一个 PostgreSQL 数据库。 遵循我们关于 如何在 Ubuntu 14.04 上安装和使用 PostgreSQL 的指南。 我们将使用您将在本教程的指南中设置的 test1 数据库和用户。

第 1 步 — 安装 PostGIS

PostGIS 不包含在 Ubuntu 的默认存储库中,但我们可以通过 [UbuntuGIS] (https://launchpad.net/~ubuntugis/) 获取它,这是一个维护许多开源的外部存储库地理信息系统包。 虽然此存储库中的 PostGIS 包可能并不总是最先进的版本,但它得到了很好的维护,它消除了从源代码编译 PostGIS 的需要。 因此,要安装 PostGIS,我们将把这个存储库添加到我们的源代码中,然后使用我们的包管理器安装它。

使用非 root 用户登录您的服务器:

ssh sammy@your_ip_address

由于我们使用的是 Ubuntu 14.04,因此我们需要存储库的不稳定分支。 执行以下命令将存储库添加到您的源:

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable

您将看到以下输出:

OutputUnstable releases of Ubuntu GIS packages. These releases are more bleeding edge and while generally they should work well, they dont receive the same amount of quality assurance as our stable releases do.
More info: https://launchpad.net/~ubuntugis/+archive/ubuntu/ubuntugis-unstable
Press [ENTER] to continue or ctrl-c to cancel adding it

ENTER 接受警告,将添加源:

Outputgpg: keyring `/tmp/tmpintg192h/secring.gpg' created
gpg: keyring `/tmp/tmpintg192h/pubring.gpg' created
gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpintg192h/trustdb.gpg: trustdb created
gpg: key 314DF160: public key "Launchpad ubuntugis-stable" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

在安装 PostGIS 之前,请更新可用包列表,以便将新存储库中的包添加到列表中。

sudo apt-get update

源更新后,安装 PostGIS。

sudo apt-get install postgis

当提示安装 PostGIS 及其必要的依赖项时,输入 Y

我们现在可以连接到 PostgreSQL 并集成 PostGIS。

第 2 步 — 使用 PostGIS 启用空间特征

PostGIS 的功能必须在每个数据库的基础上激活,然后才能存储空间数据。 我们将使用您在开始本教程之前遵循的 如何在 Ubuntu 14.04 上安装和使用 PostgreSQL 教程中的 test1 数据库和 postgres 用户。

使用 sudo 命令,切换到 postgres 用户:

sudo -i -u postgres

然后连接到test1数据库:

psql -d test1

接下来,在数据库上启用 PostGIS 扩展:

CREATE EXTENSION postgis;

让我们验证一切正常。 执行以下命令:

SELECT PostGIS_version();

你会看到这个输出:

Output            postgis_version
---------------------------------------
 2.2 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

我们都准备好了。 类型

\q

退出 SQL 会话并返回到终端提示符。

然后切换回您的主用户帐户:

su sammy

我们现在有一个安装了 PostGIS 的数据库,但是让我们调整一些 PostgreSQL 设置以使事情顺利运行。

第 3 步 — 为 GIS 数据库对象优化 PostgreSQL

PostgreSQL 旨在运行在从集成系统到大型企业数据库的任何设备上,但开箱即用的配置非常保守。 与文本数据相比,GIS 数据库对象很大,所以让我们配置 PostgreSQL 以更好地处理这些对象。

我们通过编辑 postgresql.conf 文件来配置 PostgreSQL。 打开这个文件:

sudo nano /etc/postgresql/9.3/main/postgresql.conf

我们需要对此文件进行一些更改以支持空间数据。

首先,应将 shared_buffers 更改为服务器 RAM 的 75% o 左右。 所以 200MB 对于具有 512MB RAM 的服务器来说是一个很好的价值。 找到 shared_buffers 行并像这样修改它:

/etc/postgresql/9.3/main/postgresql.conf

shared_buffers = 200MB                  # min 128kB

接下来,找到以 #work_mem 开头的行。 此行默认注释掉,因此取消注释此行并将其值增加到 16MB

/etc/postgresql/9.3/main/postgresql.conf

work_mem = 16MB                         # min 64kB

然后找到 #maintenance_work_mem,取消注释,并将其值增加到 128MB

/etc/postgresql/9.3/main/postgresql.conf

maintenance_work_mem = 128MB            # min 1MB

找到 checkpoint_segments,然后取消注释并将其值更改为 6

/etc/postgresql/9.3/main/postgresql.conf

checkpoint_segments = 6         # in logfile segments, min 1, 16MB each

最后,寻找 #random_page_cost。 找到它后,取消注释并将其值设置为 2.0

/etc/postgresql/9.3/main/postgresql.conf

random_page_cost = 2.0                 # same scale as above

CTRL+X 退出,然后按 YENTER 保存对该文件的更改。

您可以查看教程 Tuning PostgreSQL for Spatial 以获取有关这些设置的更多信息。

重新启动 PostgreSQL 以使这些更改发生:

sudo service postgresql restart

我们现在安装了 PostGIS 并配置了 PostgreSQL。 让我们将一些数据放入数据库中,以便我们进行测试。

第 4 步 — 加载空间数据

让我们将一些空间数据加载到我们的数据库中,以便我们熟悉将这些数据导入 PostgreSQL 的工具和过程,以便稍后进行一些空间查询。

[Natural Earth] (http://www.naturalearthdata.com/) 为全世界提供了各种尺度的基础数据的重要来源。 最重要的是,这些数据属于公共领域。

导航到您的主文件夹并创建一个名为 nedata 的新文件夹。 我们将使用此文件夹来保存我们将下载的 Natural Earth 数据。

cd ~
mkdir nedata

然后导航到这个新文件夹:

cd nedata

我们将从 Natural Earth 下载 1:110m 的国家数据集。 使用 wget 将该文件下拉到您的服务器:

wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip

您刚刚下载的文件是压缩的,因此您需要通过包管理器安装的 unzip 命令。 使用以下命令安装它:

sudo apt-get install unzip

然后解压文件:

unzip ne_110m_admin_0_countries.zip

您现在将在文件夹中添加六个文件:

  • ne_110m_admin_0_countries.README.html
  • ne_110m_admin_0_countries.VERSION.txt
  • ne_110m_admin_0_countries.dbf
  • ne_110m_admin_0_countries.prj
  • ne_110m_admin_0_countries.shp
  • ne_110m_admin_0_countries.shx

.dbf.prj.shp.shp 文件组成 ShapeFile、 GIS 软件使用的流行地理空间矢量数据格式。 我们可以将它加载到我们的 test1 数据库中。

为此,我们将安装地理空间数据抽象库 GDAL。 当我们安装 GDAL 时,我们还将获得 OGR(OpenGIS 简单功能参考实现)和命令 ogr2ogr。 这是一个矢量数据翻译库,我们将使用它来将 Shapefile 翻译成 PostGIS 可以使用的数据。

使用包管理器安装 GDAL:

sudo apt-get install gdal-bin

现在再次切换到 postgres 用户:

sudo -i -u postgres

现在使用 ogr2ogr 将您从 Natural Earth 获得的 Shapefile 转换为 PostGIS 表,如下所示:

ogr2ogr -f PostgreSQL PG:dbname=test1 -progress -nlt PROMOTE_TO_MULTI /home/sammy/nedata/ne_110m_admin_0_countries.shp

让我们分解该命令并详细查看每个选项。 首先,我们指定这个选项:

-f PostgreSQL

此开关声明输出文件类型是 PostgreSQL 表。

接下来,我们有这个选项:

PG:dbname=test1

这会将连接字符串设置到我们的数据库。 我们只是在这里指定数据库名称,但如果您想使用不同的用户、主机和端口,您可以像这样指定这些选项:

PG:"dbname='databasename' host='addr' port='5432' user='x' password='y'"

我们的选项列表中的下一个是:

-progress

此选项显示一个进度条,因此我们可以可视化该过程。

接下来,我们传递这个参数:

-nlt PROMOTE_TO_MULTI

PostgreSQL 对对象类型很严格。 ogr2ogr 命令将根据文件中的前几个特征对几何类型进行假设。 我们正在导入的数据包含 Polygon 类型和多部分多边形或 MultiPolygons 的混合。 这些不能插入到同一个字段中,因此我们将所有要素提升为多部分多边形,并且几何字段将创建为 MultiPolygon

最后,我们指定输入文件的路径:

/home/sammy/nedata/ne_110m_admin_0_countries.shp

访问 ogr2ogr 网站以查看完整的选项集。

运行完整命令时,您将看到以下输出:

Output0...10...20...30...40...50...60...70...80...90...100 - done.

我们可以使用 ogrinfo 命令检查数据是否被导入。 执行以下命令:

ogrinfo -so PG:dbname=test1 ne_110m_admin_0_countries

这将显示以下输出:

OutputINFO: Open of `PG:dbname=test1'
      using driver `PostgreSQL' successful.

Layer name: ne_110m_admin_0_countries
Geometry: Multi Polygon
Feature Count: 177
Extent: (-180.000000, -90.000000) - (180.000000, 83.645130)
Layer SRS WKT:
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.0174532925199433,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]
FID Column = ogc_fid
Geometry Column = wkb_geometry
scalerank: Integer (4.0)
featurecla: String (30.0)

...

region_wb: String (254.0)
name_len: Real (16.6)
long_len: Real (16.6)
abbrev_len: Real (16.6)
tiny: Real (16.6)
homepart: Real (16.6)

现在我们的数据库中有空间数据,让我们看看如何使用它来解决问题。

第 5 步 — 查询空间数据

假设我们被要求找出世界上最北的十个国家。 使用 PostGIS 和我们导入的数据很容易。

重新登录到 test1 数据库。

psql -d test1

列出数据库中的表:

\dt 

这将返回两个表:

Output                   List of relations
 Schema |           Name            | Type  |  Owner
--------+---------------------------+-------+----------
 public | ne_110m_admin_0_countries | table | postgres
 public | spatial_ref_sys           | table | postgres
(2 rows)

我们将使用 ne_110m_admin_0_countries 表,其中包含有助于我们回答问题的数据。 该表有一个包含国家名称的 admin 列和一个包含几何数据的 wkb_gemoetry 列。 如果要查看 ne_110m_admin_0_countries 表中的所有列,可以发出命令:

\d ne_110m_admin_0_countries

您将看到列及其数据类型。 wbk_geometry 列的数据类型如下所示:

 wkb_geometry | geometry(MultiPolygon,4326) |

wbk_geometry 列包含多边形。 我们正在处理国家及其不规则边界,因此我们数据库中的每个国家都没有单一的纬度值。 因此,为了获得每个国家的纬度,我们首先使用 PostGIS 的 ST_Centroid 函数找出每个国家的质心。 然后我们使用 ST_Y 函数提取质心的 Y 值。 我们可以使用该值作为纬度。

这是我们将运行的查询:

SELECT admin, ST_Y(ST_Centroid(wkb_geometry)) as latitude 
FROM ne_110m_admin_0_countries 
ORDER BY latitude DESC 
LIMIT 10;

我们按降序排列结果,因为最北的国家的纬度最高。

执行该查询,您将看到前十个最北的国家:

Output   admin   |    latitude
-----------+------------------
 Greenland | 74.7704876939899
 Norway    | 69.1568563971328
 Iceland   |  65.074276335291
 Finland   | 64.5040939185674
 Sweden    | 62.8114849680803
 Russia    | 61.9808407507127
 Canada    | 61.4690761453491
 Estonia   |  58.643695240707
 Latvia    | 56.8071751342793
 Denmark   | 56.0639344617945
(10 rows)

现在您有了答案,您可以使用以下命令退出数据库

\q

您可以在 PostGIS 文档的 PostGIS 参考 部分中找到有关各种 PostGIS 功能的更多信息。

结论

您现在已经为空间查询配置了启用空间的数据库,并且该数据库中有一些数据可用于进一步探索。

有关创建空间查询的更深入指南,请参阅 Boundless PostGIS 教程