如何在Ubuntu 14.04上安装和配置PostGIS

介绍

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

在本教程中,您将安装PostGIS,为空间数据配置PostgreSQL,将一些空间对象加载到数据库中,以及执行基本查询。

准备

在开始本教程之前,您需要以下内容:

  • 一个Ubuntu 14.04服务器。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 具有sudo权限的非root用户。
  • 一个PostgreSQL数据库。我们将使用您为本教程设置的test1数据库和用户。如果您在生产环境使用,我还是建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。

第1步 - 安装PostGIS

PostGIS不包含在Ubuntu的默认存储库中,但是我们可以通过UbuntuGIS获得它, UbuntuGIS是一个维护许多开源GIS软件包的外部存储库。虽然此存储库中的PostGIS软件包可能并不总是最新版本,但它维护得很好,并且无需从源代码编译PostGIS。因此,要安装PostGIS,我们会将此存储库添加到我们的源中,然后使用我们的包管理器进行安装。

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

ssh sammy@your_ip_address

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

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

您将看到以下输出:

Unstable 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接受警告,将添加源:

gpg: 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启用Spacial功能

必须先基于每个数据库激活PostGIS的功能,然后才能存储空间数据。在开始本教程之前,我们将使用您之前设置的test1数据库和postgres用户。

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

sudo -i -u postgres

然后连接到test1数据库:

psql -d test1

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

CREATE EXTENSION postgis;

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

SELECT PostGIS_version();

你会看到这个输出:

         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%左右。200MB对于具有512MB RAM的服务器来说,这是一个很好的值。找到shared_buffers行并按如下所示进行修改:

shared_buffers = 200MB                  # min 128kB

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

work_mem = 16MB                         # min 64kB

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

maintenance_work_mem = 128MB            # min 1MB

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

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

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

random_page_cost = 2.0                 # same scale as above

CTRL+X退出,然后按YENTER将更改保存到此文件。

重新启动PostgreSQL以进行以下更改:

sudo service postgresql restart

我们现在安装了PostGIS并配置了PostgreSQL。让我们将一些数据输入数据库,这样我们就可以测试出来了。

第4步 - 加载空间数据

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

Natural Earth为不同尺度的整个世界提供了重要的基础数据来源。最重要的是,这些数据属于公共领域。

导航到您的主文件夹并创建一个名为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命令将基于文件中的前几个特征对几何类型进行假设。我们导入的数据包含多边形类型和多部分多边形或MultiPolygons的混合。这些不能插入到同一个字段中,因此我们将所有要素提升为多部分多边形,并将几何字段创建为MultiPolygon

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

/home/sammy/nedata/ne_110m_admin_0_countries.shp

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

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

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

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

ogrinfo -so PG:dbname=test1 ne_110m_admin_0_countries

这将显示以下输出:

INFO: 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 

这将返回两个表:

                   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;

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

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

   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的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How to Install and Configure PostGIS on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

软件工程师如果没有自学的能力,还是转行吧

网络工程师和其他工程师有一些很微妙的差异,这个差异就是,网络世界变化极快,范围极广,涉及可深可浅,就取决于你要放自己在那个位置。

46620
来自专栏奇点大数据

话说量化(2)

市场,是一个很古老的概念了,至少已经有三四千年以上的历史了。较早的关于市场的记录是在古埃及时期,公元前两千多年之前,就已经有“Bazar”这个概念了,汉语里面也...

12620
来自专栏用户3254834的专栏

要钱有错吗?!

网络课堂的兴起,音频视频的商业化展示,当“白看”的电子书收取费用,当平民化的问答找不到答案,那些深耕领域作业的从业者执笔论经验、支桌开讲堂,富有阶层性的知识获取...

7610
来自专栏奇点大数据

话说量化(1)

从今天开始,我来写一个叫做《话说量化》的随笔。主要是最近自己业余也在玩量化交易的模型,那就把一路玩的过程中的感想和碰到的问题记下来,和一起玩的朋友们做个分享。既...

13620
来自专栏java一日一条

如何写出漂亮的 React 组件

在Walmart Labs的产品开发中,我们进行了大量的Code Review工作,这也保证了我有机会从很多优秀的工程师的代码中学习他们的代码风格与样式。在这篇...

13130
来自专栏令仔很忙

知识扩展----快速阅读

而快速阅读就是充分利用左右脑,协调快速处理视觉信息。快速阅读也叫“全脑速读”。

9910
来自专栏程序员的知识天地

阿里巴巴程序员吐槽不加班的工作辞职吧!这是嫉妒还是被洗脑了?

在编程界,加班就是潜规则。程序员加班还有加班费,一个月下来薪资收入颇为丰厚。有人说,程序员就是把咖啡变成代码的机器。我想说,程序员就是满天星辰下敲着代码、喝咖啡...

23010
来自专栏程序员的知识天地

阿里员工揭秘:很多程序员离职,在小公司当领导,只动嘴不动手!

阿里巴巴是中国知名的互联网公司,每个人或多或少的都从淘宝上购买的物品,自从1998年成立到现在,里面人才济济,里面的程序员不仅工资非常的高,不少程序员年收入竟然...

16520
来自专栏程序员的知识天地

这些拍案惊奇的智障桥段,分明是在蔑视我作为程序员的debug

作为在网络高速发展的时代背景下成长起来的一代人,网络文学几乎伴随着我们的整个青春。

12920
来自专栏令仔很忙

这一年----On The Way

其实每次写总结,首先都要感叹一把,时间过的真的是太快了,当我们处于青春期的时候,总觉得时间过的好慢,什么时候能快点,早点上学,早点上高中,早点上大学,早点工作...

13020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励