前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何在Ubuntu 14.04上安装和配置PostGIS

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

原创
作者头像
物花无语
修改于 2018-09-30 02:39:57
修改于 2018-09-30 02:39:57
2.5K00
代码可运行
举报
运行总次数:0
代码可运行

介绍

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

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

准备

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

第一步 - 安装PostGIS

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssh sammy@your_ip_address

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable

您将看到以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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接受警告,将添加源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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之前,请更新可用软件包列表,以便将新存储库中的软件包添加到列表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get update

更新源后,安装PostGIS。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install postgis

提示其必要的依赖一起安装PostGIS的时候输入Y

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

第二步 - 使用PostGIS启用Spacial功能

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo -i -u postgres

然后连接到test1数据库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
psql -d test1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE EXTENSION postgis;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT PostGIS_version();

你会看到这个输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            postgis_version
---------------------------------------
 2.2 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

我们都准备好了,输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\q

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
su sammy

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

第三步 - 为GIS数据库对象优化PostgreSQL

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo nano /etc/postgresql/9.3/main/postgresql.conf

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

首先,shared_buffers应该更改为服务器RAM的75%左右。200MB对于具有512MB RAM的服务器来说,这是一个很好的价值。找到该shared_buffers行并按如下所示进行修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shared_buffers = 200MB                  # min 128kB

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
work_mem = 16MB                         # min 64kB

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
maintenance_work_mem = 128MB            # min 1MB

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
checkpoint_segments = 6         # in logfile segments, min 1, 16MB each

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
random_page_cost = 2.0                 # same scale as above

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo service postgresql restart

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

第四步 - 加载空间数据

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

[Natural Earth]是为全球提供不同尺度的重要的基础数据来源。最重要的是,这些数据属于公共领域。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ~
mkdir nedata

然后切换到这个新文件夹:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd nedata

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install unzip

然后解压缩文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install gdal-bin

现在再次切换到postgres用户:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo -i -u postgres

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ogr2ogr -f PostgreSQL PG:dbname=test1 -progress -nlt PROMOTE_TO_MULTI /home/sammy/nedata/ne_110m_admin_0_countries.shp

让我们输入这个命令,详细查看每个选项。首先,我们指定此选项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-f PostgreSQL

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PG:dbname=test1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PG:"dbname='databasename' host='addr' port='5432' user='x' password='y'"

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-progress

此选项显示进度条,以便我们可以看到该过程。

接下来,我们传递这个论点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-nlt PROMOTE_TO_MULTI

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/home/sammy/nedata/ne_110m_admin_0_countries.shp

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
0...10...20...30...40...50...60...70...80...90...100 - done.

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ogrinfo -so PG:dbname=test1 ne_110m_admin_0_countries

这将显示以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

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

第五步 - 查询空间数据

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

重新登录test1数据库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
psql -d test1

列出数据库中的表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\dt 

这将返回两个表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                   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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\d ne_110m_admin_0_countries

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 wkb_geometry | geometry(MultiPolygon,4326) |

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

这是我们将运行的查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT admin, ST_Y(ST_Centroid(wkb_geometry)) as latitude 
FROM ne_110m_admin_0_countries 
ORDER BY latitude DESC 
LIMIT 10;

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   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)

现在您有了答案,可以退出数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\q

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

结论

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

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

想要了解更多关于Linux的开源信息教程,请前往腾讯云+社区学习更多知识。

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PostGIS导入导出ESRI Shapefile数据
PostGIS作为PostgreSQL数据库的空间扩展,提供了对空间数据管理的支持。对于空间矢量数据,PostGIS提供了Geometry和Geography俩种类型用于空间对象的存储,Geometry使用笛卡尔坐标系,而Geography使用球面坐标系(默认是WGS84坐标系)。对于空间栅格数据,则提供了Raster类型。
卡尔曼和玻尔兹曼谁曼
2019/01/22
3.8K0
PostGIS导入导出ESRI Shapefile数据
PostgreSQL与PostGIS的基础入门
PostgreSQL是一个功能强大的对象关系型数据库管理系统(ORDBMS)。用于安全地存储数据,支持最佳做法,并允许在处理请求时检索它们。
create17
2019/04/17
5.9K0
PostgreSQL与PostGIS的基础入门
python与地理空间分析(3)shp文件操作
在python与地理空间分析(1)与(2)中我们介绍了GIS中常用的数据类型、python在处理地理空间数据时用到的包以及给定经纬度计算空间距离的算法,本期我们主要介绍对地理空间分析中常用到的矢量数据shp文件的处理,在捍卫祖国领土从每一张地图开始我们也提供较为精准的包括南海九段线的中国地图,大家可以自行下载。
MeteoAI
2019/08/19
15.2K1
python与地理空间分析(3)shp文件操作
RedHat7下PostGIS源码安装
顺便安装postgresql-devel、libxml2-devel,后边编译安装PostGIS会用到。
Florian
2018/02/05
1.4K0
POSTGIS 总结
PostGIS是一个空间数据库,空间数据库像存储和操作数据库中其他任何对象一样去存储和操作空间对象。
小石头
2022/11/10
6.4K0
POSTGIS 总结
一篇文章带你玩转PostGIS空间数据库
人类理解世界其实是按照三维的角度,而传统的关系型数据库是二维的,要想描述空间地理位置,点、线、面,我们就需要一个三维数据库,即所谓空间数据库。
半旧518
2023/10/17
8.5K0
一篇文章带你玩转PostGIS空间数据库
矢量数据空间查询
在前面四篇博客中我们主要讲了对于空间矢量数据的属性数据的增删改查,在这篇博文中我们要讲解空间查询–GIS系统很重要的一项功能。空间查询就是根据地物的空间位置进行查询的一种数据检索方式。比如,我们要查询一条河流经的城市;一个公园内的所有路灯;离当前位置最近的公共卫生间等等都属于常用的空间查询。
卡尔曼和玻尔兹曼谁曼
2020/06/16
1.7K0
利用python把shp文件写入PostgresSQL数据库
把shp文件写入pg数据库。注意:shp文件含点、线、面(‘POINT’,'LINESTRING','POLYGON')~这是重点。
一个有趣的灵魂W
2020/09/15
2.5K0
利用python把shp文件写入PostgresSQL数据库
构建自己的地理信息空间数据库及与客户端简单交互
最近研究了下postgresql数据库及其空间地理信息拓展插件——postgis。
数据小磨坊
2018/07/25
6.1K0
构建自己的地理信息空间数据库及与客户端简单交互
批量将本地gis数据导入postgis数据库
以前在处理gis数据的时候,都是直接导入本地shp素材、本地geojson素材,本地topojson素材,自从接触postgis数据之后,深感使用规范的存储系统来统一管理gis数据的好处,特别是数据量大了之后,优势便更加明显,你可以选择将很多需要做空间计算的步骤转移到Postgis数据库内进行计算,要知道Postgis提供的空间计算能力与R和Python这种应用导向的工具相比,优势要大得多。
数据小磨坊
2018/08/16
2.5K0
批量将本地gis数据导入postgis数据库
Python | GDAL处理矢量数据
GDAL矢量数据处理 为什么要学GDAL? GDAL是什么? (Geospatial Data Abstraction Library) 地理空间数据抽象库 用C/C++编写,支持多种矢量/栅格数据,支持python、.NET、Ruby等语言绑定,开放源码。 传统上GDAL指的是栅格支持库 from osgeo import gdal 矢量支持使用OGR简单要素库 (OpenGIS Simple Features Reference Implementation) 但由于OGR与OpenGIS的规范并不完全
GIS与遥感开发平台
2022/04/29
10.1K0
Python | GDAL处理矢量数据
【C++】基础:开源GIS平台开发基础(MapServer+QGIS+PostGIS+OpenLayers)
在GIS数据处理时,我们最熟悉的就是ArcGIS了,它的功能十分强大,但同时对电脑性能要求也挺高,而且很多功能我们其实用不上;其他类似的GIS软件还有:GeoDa、LocaSpace图新地球、uDig、OpenJump、QGIS、gVSIG、Whitebox GAT、SAGA GIS、GRASS GIS、MapWindow、ILWIS、Diva GIS。
DevFrank
2024/07/24
5340
【C++】基础:开源GIS平台开发基础(MapServer+QGIS+PostGIS+OpenLayers)
超融合时序数据库YMatrixDB与PostGIS案例
YMatrix适用于各种规模设备的数据融合与物联网时序应用场景,本案例以具体的案例来说明YMatrix在PostGIS中的数据加载、处理和分析的能力以及时空数据的具体使用方法,首先我们先了解下PostGIS,然后再分享几个PostGIS在YMatrixDB的案例。
小徐
2022/12/01
1.8K0
YashanDB在地理信息系统(GIS)领域的关键功能和技术优势
地理信息系统(Geographic Information System,简称GIS)是⼀种集成的计算机系统,⽤于捕获、存储、分析、管理和展⽰所有类型的地理数据。GIS的核⼼功能和原理可以从以下⼏个⽅⾯进⾏详细阐述:
用户10349277
2025/02/25
910
PostGIS初探
PostGIS是PostgreSQL的空间扩展,他使得PostgreSQL支持空间数据类型,比如点、线段、折线段、多边形、椭圆等等,并且能够使用高效的空间索引进行存储和查找。
mythsman
2022/11/14
1.1K0
postgis常用函数介绍(一)
在进行地理信息系统开发的过程中,常用的空间数据库有esri的sde,postgres的postgis以及mySQL的mysql gis等等,在本文,给大家介绍的是有关postgis的一些常用函数的意思以及使用。
牛老师讲GIS
2018/10/23
3.2K0
postgis常用函数介绍(一)
PostGIS空间数据库简明教程
在本文中,我们将介绍 PostGIS 的一些基础知识及其功能,以及一些可用于简化解决方案或提高性能的提示和技巧。
用户1758543
2023/05/09
3.2K0
PostGIS空间数据库简明教程
Windows配置PostgreSQL与PostGIS数据库的方法
  本文介绍在Windows电脑中,下载、安装、部署并运行PostgreSQL与PostGIS数据库服务的方法。
疯狂学习GIS
2025/01/09
5040
Windows配置PostgreSQL与PostGIS数据库的方法
空间索引 - 各数据库空间索引使用报告
本文介绍了Redis、MongoDB、PostgreSQL、MySQL这四种数据库的基本特性,包括数据类型、持久化方式、事务支持、分区和分片等特性。每种数据库都有其适用的场景,例如Redis适合用于缓存和计数器,MongoDB适合用于高并发的读写,PostgreSQL适合用于事务处理和数据仓库,MySQL适合用于关系型数据库和事务处理。每种数据库都有其优缺点,需要根据具体的需求和场景来选择合适的数据库。
枕边书
2018/01/04
7.7K2
win10安装PostgreSQL12.6
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
静谧星空TEL
2022/01/05
2.1K0
win10安装PostgreSQL12.6
相关推荐
PostGIS导入导出ESRI Shapefile数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档