介绍
PostGIS 是 PostgreSQL 关系数据库的空间扩展。PostGIS 允许您使用地理和地理数据类型存储空间数据,使用空间函数执行空间查询以确定区域,距离,长度和周围,并在数据上创建空间索引以加速空间查询。
在本指南中,您将安装PostGIS,为空间数据配置PostgreSQL,将一些空间对象加载到您的数据库中,并执行一个基本查询。
前提条件
在您开始本指南之前,您将需要以下内容:
- 一个 Ubuntu 14.04 服务器
- 具有 sudo 特权的非根用户. 该教程 Ubuntu 14.04 初始服务器设置指南解释了如何设置此设置。
- 一个 PostgreSQL 数据库。 遵循我们在 Ubuntu 14.04 上如何安装和使用 PostgreSQL 上的指南。 我们将使用您在本教程中设置的
test1
数据库和用户。
步骤 1 - 安装 PostGIS
PostGIS不包括在Ubuntu的默认存储库中,但我们可以通过UbuntuGIS(https://launchpad.net/~ubuntugis/)获取它,这是一个维护一些开源GIS包的外部存储库,虽然这个存储库中的PostGIS包可能并不总是最先进的版本,但它保持良好,并且消除了需要从源头编译PostGIS。
与您的非根用户登录您的服务器:
1ssh sammy@your_ip_address
由于我们正在使用Ubuntu 14.04,我们需要存储库的不稳定分支,执行以下命令将存储库添加到您的源:
1sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
您将看到以下输出:
1[secondary_label Output]
2Unstable 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.
3More info: https://launchpad.net/~ubuntugis/+archive/ubuntu/ubuntugis-unstable
4Press [ENTER] to continue or ctrl-c to cancel adding it
按「ENTER」來接受警告,將添加來源:
1[secondary_label Output]
2gpg: keyring `/tmp/tmpintg192h/secring.gpg' created
3gpg: keyring `/tmp/tmpintg192h/pubring.gpg' created
4gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
5gpg: /tmp/tmpintg192h/trustdb.gpg: trustdb created
6gpg: key 314DF160: public key "Launchpad ubuntugis-stable" imported
7gpg: Total number processed: 1
8gpg: imported: 1 (RSA: 1)
9OK
在您可以安装 PostGIS 之前,请更新可用的包列表,以便将新库中的包添加到列表中。
1sudo apt-get update
一旦您的來源更新,安裝 PostGIS。
1sudo apt-get install postgis
当被要求安装PostGIS时,输入Y
,以及其必要的依赖。
我们现在可以连接到PostgreSQL并集成PostGIS。
步骤 2 – 使用 PostGIS 启用空间功能
在您可以存储空间数据之前,必须在每个数据库的基础上激活PostGIS的功能,我们将与test1
数据库和postgres
用户合作,从您在开始本教程之前的如何安装和使用PostgreSQL
教程中。
使用sudo
命令,切换到postgres
用户:
1sudo -i -u postgres
然后连接到test1
数据库:
1psql -d test1
接下来,在数据库中启用 PostGIS 扩展:
1CREATE EXTENSION postgis;
让我们检查一切是否正确,执行以下命令:
1SELECT PostGIS_version();
你会看到这个输出:
1[secondary_label Output]
2 postgis_version
3---------------------------------------
4 2.2 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
5(1 row)
我们都设定了。类型
1\q
离开 SQL 会话并返回您的终端提示。
然后返回您的主要用户帐户:
1su sammy
我们现在有一个安装了PostGIS的数据库,但让我们调整一些PostgreSQL设置以使事情顺利运行。
步骤 3 – 优化 PostgreSQL 用于 GIS 数据库对象
PostgreSQL 旨在运行从集成系统到大型企业数据库的任何东西,但它是非常保守地配置的。
我们通过编辑postgresql.conf
文件来配置 PostgreSQL。
1sudo nano /etc/postgresql/9.3/main/postgresql.conf
我们需要对这个文件进行一些更改,以支持空间数据。
首先,‘shared_buffers’ 应该更改为大约 75% 的服务器的 RAM. 因此,‘200MB’ 对于具有 512MB 的 RAM 的服务器来说是一个很好的值。
1[label /etc/postgresql/9.3/main/postgresql.conf]
2shared_buffers = 200MB # min 128kB
接下来,找出从#work_mem
开始的行,此行是默认的评论,所以不评论此行,并将其值增加到16MB
:
1[label /etc/postgresql/9.3/main/postgresql.conf]
2work_mem = 16MB # min 64kB
然后找到#maintenance_work_mem
,删除评论,并将其值增加到128MB
:
1[label /etc/postgresql/9.3/main/postgresql.conf]
2maintenance_work_mem = 128MB # min 1MB
查找checkpoint_segments
,然后放弃评论并将其值更改为6
:
1[label /etc/postgresql/9.3/main/postgresql.conf]
2checkpoint_segments = 6 # in logfile segments, min 1, 16MB each
最后,搜索#random_page_cost
。当你找到它时,删除评论并将其值设置为2.0
:
1[label /etc/postgresql/9.3/main/postgresql.conf]
2random_page_cost = 2.0 # same scale as above
按CTRL+X
来退出,然后按Y
和ENTER
来保存该文件的更改。
您可以查看教程 Tuning PostgreSQL for Spatial 有关这些设置的更多信息。
重新启动 PostgreSQL 以便发生这些更改:
1sudo service postgresql restart
现在我们已经安装了PostGIS并配置了PostgreSQL,让我们把一些数据输入到数据库中,以便我们可以测试。
步骤4:加载空间数据
让我们将一些空间数据加载到我们的数据库中,以便我们可以熟悉将这些数据带入PostgreSQL的工具和流程,以便稍后进行一些空间查询。
Natural Earth为全世界提供各种规模的基本数据的绝佳来源。最重要的是,这些数据处于公共领域。
导航到您的主文件夹并创建一个名为nedata
的新文件夹,我们将使用这个文件夹来保存我们将下载的自然地球数据。
1cd ~
1mkdir nedata
然后导航到这个新文件夹:
1cd nedata
我们将从Natural Earth下载 1:110m 国家数据集. 使用wget
将该文件拖到您的服务器:
1wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip
您刚刚下载的文件已被压缩,因此您需要通过包管理器安装的unzip
命令。
1sudo apt-get install unzip
然后删除该文件:
1unzip 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软件。
要做到这一点,我们将安装 GDAL,地理空间数据抽象库. 当我们安装 GDAL时,我们还将获得OGR(OpenGIS Simple Features Reference Implementation)和命令ogr2ogr。
使用包管理器安装 GDAL:
1sudo apt-get install gdal-bin
现在再次切换到postgres
用户:
1sudo -i -u postgres
现在将您从自然地球获得的 Shapefile 转换为使用ogr2ogr
的 PostGIS 表,如下:
1ogr2ogr -f PostgreSQL PG:dbname=test1 -progress -nlt PROMOTE_TO_MULTI /home/sammy/nedata/ne_110m_admin_0_countries.shp
让我们打破这个命令,并仔细看看每个选项,首先,我们指定这个选项:
1-f PostgreSQL
此交换机表示输出文件类型为 PostgreSQL 表。
接下来,我们有这个选项:
1PG:dbname=test1
我们只是在这里指定数据库名称,但如果您想要使用不同的用户、主机和端口,则可以这样指定这些选项:
1PG:"dbname='databasename' host='addr' port='5432' user='x' password='y'"
下一个在我们的选项列表是这个:
1-progress
此选项显示进度栏,以便我们可以可视化进程。
接下来,我们通过这个论点:
1-nlt PROMOTE_TO_MULTI
PostgreSQL 对对象类型是严格的. 命令 ogr2ogr
将根据文件中的前几个特征对地理类型做一个假设. 我们导入的数据包含一个混合的 Polygon 类型和多部分多部分,或 MultiPolygons . 这些不能插入到同一个领域,所以我们将所有功能推广到多部分多部分,而地理领域将被创建为 MultiPolygon 。
最后,我们指定进入输入文件的路径:
1/home/sammy/nedata/ne_110m_admin_0_countries.shp
请访问 ogr2ogr网站以查看完整的选项。
当您运行完整的命令时,您将看到以下输出:
1[secondary_label Output]
20...10...20...30...40...50...60...70...80...90...100 - done.
我们可以通过使用ogrinfo
命令检查数据是否被导入,执行以下命令:
1ogrinfo -so PG:dbname=test1 ne_110m_admin_0_countries
这将显示以下输出:
1[secondary_label Output]
2INFO: Open of `PG:dbname=test1'
3 using driver `PostgreSQL' successful.
4
5Layer name: ne_110m_admin_0_countries
6Geometry: Multi Polygon
7Feature Count: 177
8Extent: (-180.000000, -90.000000) - (180.000000, 83.645130)
9Layer SRS WKT:
10GEOGCS["WGS 84",
11 DATUM["WGS_1984",
12 SPHEROID["WGS 84",6378137,298.257223563,
13 AUTHORITY["EPSG","7030"]],
14 AUTHORITY["EPSG","6326"]],
15 PRIMEM["Greenwich",0,
16 AUTHORITY["EPSG","8901"]],
17 UNIT["degree",0.0174532925199433,
18 AUTHORITY["EPSG","9122"]],
19 AUTHORITY["EPSG","4326"]]
20FID Column = ogc_fid
21Geometry Column = wkb_geometry
22scalerank: Integer (4.0)
23featurecla: String (30.0)
24
25...
26
27region_wb: String (254.0)
28name_len: Real (16.6)
29long_len: Real (16.6)
30abbrev_len: Real (16.6)
31tiny: Real (16.6)
32homepart: Real (16.6)
我们现在在我们的数据库中有空间数据,所以让我们看看如何使用它来解决问题。
步骤5:寻找空间数据
假设我们被要求找到世界上最北的十个国家,这很容易使用PostGIS和我们已经导入的数据。
重新登录到test1
数据库。
1psql -d test1
列出数据库中的表格:
1\dt
这将返回两个表:
1[secondary_label Output]
2 List of relations
3 Schema | Name | Type | Owner
4--------+---------------------------+-------+----------
5 public | ne_110m_admin_0_countries | table | postgres
6 public | spatial_ref_sys | table | postgres
7(2 rows)
我們將使用「ne_110m_admin_0_countries」表,其中包含能幫助我們解答問題的數據。本表包含包含國家名稱的「admin」列,以及包含地理數據的「wkb_gemoetry」列。如果您想在「ne_110m_admin_0_countries」表中查看所有列,您可以發出以下命令:
1\d ne_110m_admin_0_countries
您将看到列及其数据类型. wbk_geometry
列的数据类型看起来如下:
1wkb_geometry | geometry(MultiPolygon,4326) |
wbk_geometry
列包含多角形,我们处理国家及其不规则边界,因此我们数据库中的每个国家都没有一个宽度值,因此,为了获取每个国家的宽度,我们首先使用PostGIS的ST_Centroid
函数来找出每个国家的中心。
以下是我们将运行的查询:
1SELECT admin, ST_Y(ST_Centroid(wkb_geometry)) as latitude
2FROM ne_110m_admin_0_countries
3ORDER BY latitude DESC
4LIMIT 10;
我们以下降顺序排序结果,因为最北的国家将有最高的纬度。
运行该查询,你会看到十大最北的国家:
1[secondary_label Output]
2 admin | latitude
3-----------+------------------
4 Greenland | 74.7704876939899
5 Norway | 69.1568563971328
6 Iceland | 65.074276335291
7 Finland | 64.5040939185674
8 Sweden | 62.8114849680803
9 Russia | 61.9808407507127
10 Canada | 61.4690761453491
11 Estonia | 58.643695240707
12 Latvia | 56.8071751342793
13 Denmark | 56.0639344617945
14(10 rows)
现在你有你的答案,你可以离开数据库。
1\q
您可以在 PostGIS 文档的 PostGIS 参考部分找到有关不同 PostGIS 函数的更多信息。
结论
现在您已为空间查询配置了一个空间启用数据库,并且您可以在该数据库中使用一些数据来进一步探索。
对于创建空间查询的更深入的指南,请参阅 无限 PostGIS 教程