../_images/logo_postgis.png ../_images/OSGeo_project.png

PostGIS Quickstart

PostGIS为PostgreSQL关系数据库添加了空间功能。它扩展了PostgreSQL,以便存储、查询和操作空间数据。在这个快速启动中,我们将在描述一般数据库函数时使用“PostgreSQL”,在描述Postgis提供的额外空间功能时使用“Postgis”。

此快速入门介绍了如何:

  • 从命令行创建和查询空间数据库 QGIS 图形客户端。
  • 管理来自的数据 pgAdmin 客户端。

客户机-服务器体系结构

PostgreSQL和许多数据库一样,在客户机-服务器系统中充当服务器。客户机向服务器发出请求并返回响应。这与Internet的工作方式相同-您的浏览器是客户端,Web服务器将发送回网页。对于PostgreSQL,请求使用SQL语言,响应通常是来自数据库的数据表。

没有什么可以阻止服务器与客户机在同一台计算机上,这使您能够在一台计算机上使用PostgreSQL。您的客户机通过内部“环回”网络连接连接到服务器,除非您将其配置为这样,否则对其他计算机不可见。

创建支持空间的数据库

命令行客户端从终端模拟器窗口中运行。

从“附件”部分的“应用程序”菜单启动终端仿真器(目前为LXTerminal)。这将为您提供一个unixshell命令提示符。类型:

psql -V

点击Enter查看PostgreSQL版本号。

一个单一的PostgreSQL服务器允许您通过将工作安排到单独的数据库中来组织工作。每个数据库都是一个独立的系统,有自己的表、视图、用户等。当连接到PostgreSQL服务器时,必须指定一个数据库。

您可以使用以下命令获取服务器上的数据库列表:

psql -l

命令。您应该看到系统上的一些项目使用的几个数据库。我们将为这个快速入门创建一个新的。

小技巧

列表使用标准的Unix寻呼机-下一页使用空格, b 回去, q 退出,H寻求帮助。

PostgreSQL为我们提供了一个用于创建数据库的实用程序, createdb . 在添加PostGIS扩展之前,我们需要创建一个数据库。我们将调用我们的数据库 demo . 命令是:

createdb demo

小技巧

通常可以通过使用 --help 选择权。

如果你现在运行 psql -l 你应该看看你的 demo 列表中的数据库。我们还没有添加postgis扩展,但是在下一节中您将了解如何添加。

可以使用SQL语言创建PostGIS数据库。首先,我们将删除刚才使用 dropdb 命令,然后使用 psql 获取SQL命令解释器的命令:

dropdb demo
psql -d postgres

这连接到核心系统数据库 postgres . 现在输入SQL以创建新数据库:

postgres=# CREATE DATABASE demo;

现在从 postgres 数据库到新的 demo 数据库。将来,您可以直接使用 psql -d demo 但是这里有一个在 psql 命令行:

postgres=# \c demo

小技巧

击中 CTRL + C 如果按回车键后psql提示继续出现。它将清除您的输入并重新开始。它可能正在等待右引号、分号或其他内容。

您将看到一条信息性消息,提示将更改为显示您现在已连接到 demo 数据库。

接下来,添加PostGIS扩展:

demo=# create extension postgis;

要验证是否已安装PostGIS,请运行以下查询:

demo=# SELECT postgis_version();

           postgis_version
---------------------------------------
 2.3 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

Postgis安装了许多函数、一个表和多个视图

类型 \dt 列出数据库中的表。你应该看到这样的东西:

demo=# \dt
             List of relations
 Schema |       Name       | Type  | Owner
--------+------------------+-------+-------
 public | spatial_ref_sys  | table | user
(1 row)

这个 spatial_ref_sys PostGIS使用表在不同的空间参考系统之间进行转换。这个 spatial_ref_sys 表存储有关有效空间引用系统的信息,我们可以使用一些SQL快速查看:

demo=# SELECT srid, auth_name, proj4text FROM spatial_ref_sys LIMIT 10;

 srid | auth_name |          proj4text
------+-----------+--------------------------------------
 3819 | EPSG      | +proj=longlat +ellps=bessel +towgs...
 3821 | EPSG      | +proj=longlat +ellps=aust_SA +no_d...
 3824 | EPSG      | +proj=longlat +ellps=GRS80 +towgs8...
 3889 | EPSG      | +proj=longlat +ellps=GRS80 +towgs8...
 3906 | EPSG      | +proj=longlat +ellps=bessel +no_de...
 4001 | EPSG      | +proj=longlat +ellps=airy +no_defs...
 4002 | EPSG      | +proj=longlat +a=6377340.189 +b=63...
 4003 | EPSG      | +proj=longlat +ellps=aust_SA +no_d...
 4004 | EPSG      | +proj=longlat +ellps=bessel +no_de...
 4005 | EPSG      | +proj=longlat +a=6377492.018 +b=63...
(10 rows)

这证实了我们有一个空间数据库。

除此表外,您还可以在数据库中启用PostGIS时找到几个创建的视图。

类型 \dv 列出数据库中的视图。你应该看到这样的东西:

demo=# \dv
                                                                List of relations
 Schema |       Name        | Type |  Owner
--------+-------------------+------+----------
 public | geography_columns | view | postgres
 public | geometry_columns  | view | postgres
 public | raster_columns    | view | postgres
 public | raster_overviews  | view | postgres
(4 rows)

PostGIS支持几种空间数据类型:

geometry -是将数据存储为在平面上绘制的向量的数据类型

geography -是一种数据类型,它将数据存储为在球体表面上绘制的向量

raster -是将数据存储为n维矩阵的数据类型,其中每个位置(像素)表示
空间的一个区域,每个带(维度)都有每个像素空间的值。

这个 geometry_columnsgeography_columnsraster_columns 视图可以告诉Postgis哪些表具有Postgis几何、地理和栅格列。

概述是栅格数据的低分辨率表。这个 raster_overviews 列出这些表及其栅格列,每个表都是的概述。QGIS等工具使用栅格概述表来提供较低分辨率的栅格数据版本,以便更快地加载。

Postgis几何类型是Postgis用户使用的第一个也是最流行的类型。我们会把注意力集中在那个类型上。

使用SQL创建空间表

现在我们有了一个空间数据库,可以创建一些空间表。

首先,我们创建一个普通的数据库表来存储一些城市数据。此表有三个字段-一个用于标识城市的数字ID,一个用于城市名称,另一个用于几何图形列:

demo=# CREATE TABLE cities ( id int4 primary key, name varchar(50), geom geometry(POINT,4326) );

通常,此几何列命名为 geom (旧的Postgis公约是 the_geom )这告诉Postgis每个特征有什么样的几何体(点、线、多边形等),有多少维度(在本例中是2,如果它有3或4个维度,我们将使用PointZ、PointM或PointZM),以及空间参考系统。我们用epsg:4326坐标表示我们的城市。

现在,如果检查cities表,您应该看到新列,并被告知该表当前不包含任何行。

demo=# SELECT * from cities;
 id | name | geom
----+------+----------
(0 rows)

为了向表中添加行,我们使用了一些SQL语句。为了将几何图形输入到几何列中,我们使用PostGIS ST_GeomFromText 函数从提供坐标和空间参考系统ID的文本格式转换:

demo=# INSERT INTO cities (id, geom, name) VALUES (1,ST_GeomFromText('POINT(-0.1257 51.508)',4326),'London, England');
demo=# INSERT INTO cities (id, geom, name) VALUES (2,ST_GeomFromText('POINT(-81.233 42.983)',4326),'London, Ontario');
demo=# INSERT INTO cities (id, geom, name) VALUES (3,ST_GeomFromText('POINT(27.91162491 -33.01529)',4326),'East London,SA');

小技巧

使用箭头键调用和编辑命令行。

正如你所看到的,这很快变得越来越乏味。幸运的是,有其他方法可以更容易地将数据导入Postgis表。但是现在我们的数据库中有三个城市,我们可以使用它们。

简单查询

所有常见的SQL操作都可以应用于从PostGIS表中选择数据:

demo=# SELECT * FROM cities;
 id |      name       |                      geom
----+-----------------+----------------------------------------------------
  1 | London, England | 0101000020E6100000BBB88D06F016C0BF1B2FDD2406C14940
  2 | London, Ontario | 0101000020E6100000F4FDD478E94E54C0E7FBA9F1D27D4540
  3 | East London,SA  | 0101000020E610000040AB064060E93B4059FAD005F58140C0
(3 rows)

这给了我们一个编码的十六进制版本的坐标,对人类来说不太有用。

如果您想再次查看WKT格式的几何图形,可以使用函数ST ASTEXT(GEOM)或ST ASEWKT(GEOM)。您还可以使用st_x(geom)、st_y(geom)获取坐标的数值:

demo=# SELECT id, ST_AsText(geom), ST_AsEwkt(geom), ST_X(geom), ST_Y(geom) FROM cities;
 id |          st_astext           |               st_asewkt                |    st_x     |   st_y
----+------------------------------+----------------------------------------+-------------+-----------
  1 | POINT(-0.1257 51.508)        | SRID=4326;POINT(-0.1257 51.508)        |     -0.1257 |    51.508
  2 | POINT(-81.233 42.983)        | SRID=4326;POINT(-81.233 42.983)        |     -81.233 |    42.983
  3 | POINT(27.91162491 -33.01529) | SRID=4326;POINT(27.91162491 -33.01529) | 27.91162491 | -33.01529
(3 rows)

空间查询

PostGIS在PostgreSQL中添加了许多具有空间功能的函数。我们已经看到了将WKT转换为几何的St_GeomFromText。其中大多数以ST(空间类型)开头,并在PostGIS文档的一节中列出。我们现在用一个来回答一个实际的问题——假设地球是球形的,这三个伦敦人相距有多远,以米为单位?

demo=# SELECT p1.name,p2.name,ST_DistanceSphere(p1.geom,p2.geom) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
      name       |      name       | st_distancesphere
-----------------+-----------------+--------------------
 London, Ontario | London, England |   5875766.85191657
 East London,SA  | London, England |   9789646.96784908
 East London,SA  | London, Ontario |   13892160.9525778
 (3 rows)

这给了我们每对城市之间的距离,以米为单位。请注意,这条线的“位置”部分是如何阻止我们返回城市与自身的距离(均为零)或与上表中的距离相反的距离(伦敦、英格兰到伦敦、安大略省与伦敦、安大略省与伦敦、英格兰的距离相同)。试着不带“哪儿”部分,看看会发生什么。

我们还可以通过使用不同的函数并指定球体名称、半长轴和反向展平参数来使用球体计算距离:

demo=# SELECT p1.name,p2.name,ST_DistanceSpheroid(
        p1.geom,p2.geom, 'SPHEROID["GRS_1980",6378137,298.257222]'
        )
       FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
      name       |      name       | st_distancespheroid
-----------------+-----------------+----------------------
 London, Ontario | London, England |     5892413.63776489
 East London,SA  | London, England |     9756842.65711931
 East London,SA  | London, Ontario |     13884149.4140698
(3 rows)

要退出PostgreSQL命令行,请输入:

\q

现在返回系统控制台:

user@osgeolive:~$

映射

要从PostGIS数据生成地图,您需要一个能够获取数据的客户机。大多数开源桌面地理信息系统程序都能做到这一点——例如,qgis、gvsig、udig。现在我们将向您展示如何使用QGIS制作地图。

从桌面GIS菜单启动QGIS并选择 Add PostGIS layers 从图层菜单。PostGIS中用于连接自然地球数据的参数已在“连接”下拉菜单中定义。您可以在此处定义新的服务器连接,并存储设置以便于调用。点击连接下拉菜单,选择自然地球。击中 Edit 如果你想知道这些参数对于自然地球是什么,或者直接点击 Connect 继续:

Connect to Natural Earth

现在,您将获得数据库中空间表的列表:

Natural Earth Layers

选择Ne_10M_Lakes表并点击 Add 在底部(不是 Load 在顶部-加载数据库连接参数),应将其加载到qgis中:

My First PostGIS layer

你现在应该看到一张湖泊地图。QGIS不知道它们是湖泊,所以可能不会为您将它们涂成蓝色-使用QGIS文档来解决如何更改这一点。放大到加拿大著名的湖泊群。

将空间数据导入数据库

大多数OSGeo桌面工具都具有将其他格式(如ESRI Shape)的空间数据导入数据库的功能。再次,我们将使用QGIS来展示这一点。

可以通过便捷的QGIS数据库管理器将形状文件导入到QGIS。你可以在菜单里找到经理。去 Database -> DB Manager -> DB Manager .

部署PostGIS项目,然后部署NaturalEarth项目。然后它将连接到自然地球数据库。如果需要,请将密码留空。在公共项中,有数据库提供的层列表。您将看到主管理器窗口。在左侧,您可以从数据库中选择表,然后使用右侧的选项卡来查找它们。预览选项卡将显示一个小地图。

QGIS Manager Preview

我们现在将使用数据库管理器将形状文件导入数据库。我们将使用北卡罗莱纳州婴儿猝死综合症(SIDS)数据,该数据包含在一个R统计数据包附加组件中。

Table 菜单选择 Import layer/file 选择权。击中 ... 按钮并浏览到 sids.shp R中的形状文件 maptools 包(位于/usr/local/lib/r/site library/spdata/shapes中):

Find the shapefile

把其他东西放在原处,然后点击 Load

Import a shapefile

让坐标参考系选择器默认为(wgs 84 epsg:4326),然后点击 OK . 应将形状文件导入Postgis,且不出现错误。关闭Postgis管理器并返回主Qgis窗口。

现在,使用“添加PostGIS层”选项将SID数据加载到地图中。通过重新排列图层和一些颜色,您应该能够绘制北卡罗来纳州婴儿猝死综合征计数(SID74或SID79字段)的脊索动物地图:

SIDS data mapped

了解PGADMIN III

您可以使用图形数据库客户端 pgAdmin III 从“数据库”菜单中查询和修改数据库。这是PostgreSQL的官方客户端。

小技巧

请注意,有一个名为pgAdmin4的新版本可以通过apt install pgAdmin4安装

pgAdmin III允许您使用SQL操作数据表。您可以从OSGeoLive桌面上的Databases文件夹中找到并启动pgAdmin III。

pgAdmin III

在这里,您可以选择创建到PostgreSQL服务器的新连接,或者连接到现有服务器。在这种情况下,我们将连接到 local 服务器。

建立连接后,您可以看到系统中已经存在的数据库的列表。

pgAdmin III

大多数数据库图像上的红色“X”表示您尚未连接到其中任何一个数据库(您仅连接到默认数据库 postgres 数据库)。此时,您只能看到系统上现有的数据库。您可以通过双击数据库的名称进行连接。为自然地球2数据库做。

现在你可以看到红色的X消失了,一个“+”出现在左边。按下它,一棵树就会出现,显示数据库的内容。

导航在 schemas 子树,展开它。然后展开 public 图式。通过导航和扩展 Tables ,您可以看到此架构中包含的所有表。

pgAdmin III

从pgAdmin III执行SQL查询

pgadminIII提供了对关系数据库执行查询的能力。

要对数据库执行查询,必须按 SQL 主工具栏上的按钮(带有黄色放大镜的按钮)。

我们将找出1974年每个城市的儿童出生率。此外,我们将根据计算出的速率对结果进行排序。为此,我们需要执行以下查询(在SQL窗口的文本编辑器上提交):

select name, 1000*sid74/bir74 as rate from sids order by rate;

然后,您应该按绿色箭头按钮,指向右边(执行查询)。

pgAdmin III

了解外国数据包装器(FDW)

从您的数据库,您可以访问远程对象,如来自其他PostgreSQL数据库的表,或连接到远程数据库,如Oracle、MySQL、MS SQL或CouchDB。您还可以通过ODBC连接,连接到CSV、地理空间数据甚至twitter。

您可以在以下网址找到不同FDW的列表:

让我们看看它是怎么工作的!最简单的方法是连接到另一个PostgreSQL数据库。

步骤如下:

首先加载要使用的外部数据包装器的扩展名。为了连接到另一个PostgreSQL数据库,您需要 postgres_fdw

CREATE EXTENSION postgres_fdw;

小技巧

请注意,在pgAdmin III中,默认情况下,外部数据包装器、外部服务器、用户映射和外部表不会显示在树中。你必须通过菜单激活它们 File ‣ Options ‣ Browser ‣ Display

创建一个外部服务器,告诉您在何处找到要连接的数据源

CREATE SERVER fdw_pg_server_osm_local
 FOREIGN DATA WRAPPER postgres_fdw
 OPTIONS (host '127.0.0.1', port '5432', dbname 'osm_local');

定义连接到外部服务器时应使用的用户

CREATE USER MAPPING FOR user
      SERVER fdw_pg_server_osm_local
      OPTIONS (user 'user', password 'user');

现在可以创建一个外部表。

IMPORT FOREIGN SCHEMA public
  LIMIT TO (planet_osm_polygon, planet_osm_point) -- or EXCEPT
  FROM SERVER fdw_pg_server_osm_local
  INTO public;

在数据库中查找新表,并查看来自外部表的数据。

Select * from planet_osm_polygon limit 10;

通过OGR_fdw连接到远程OGR数据源

分机 ogr_fdw 允许连接多种地理数据格式,如KML、GeoPackage、WFS、GeoJSON、GPX、GML等。

阅读更多有关 ogr_fdw : * Repository: https://github.com/pramsey/pgsql-ogr-fdw * 新的和改进的:http://blog.cleverelephant.ca/2016/04/ogr-fdw-update.html

安装接长件 ogr_fdw 在你的数据库中。

在数据库提示符上键入:

CREATE EXTENSION ogr_fdw;

检查支持哪些格式:

打开终端并搜索ogr_fdw_信息:

locate ogr_fdw_info
/usr/lib/postgresql/10/bin/ogr_fdw_info -f

结果可能如下:::

Supported Formats:
 -> "OGR_GRASS" (readonly)
 -> "PCIDSK" (read/write)
 -> "netCDF" (read/write)
 -> "JP2OpenJPEG" (readonly)
 -> "PDF" (read/write)
 -> "MBTiles" (read/write)
 -> "EEDA" (readonly)
 -> "ESRI Shapefile" (read/write)
 -> "MapInfo File" (read/write)
 .... many more

为WFS创建FDW

通过启动Geoserver Geospatial ‣ Web Services ‣ GeoServer ‣ Start GeoServer

创建引用要连接的WFS的外部服务器

CREATE SERVER fdw_ogr_server_wfs
FOREIGN DATA WRAPPER ogr_fdw
OPTIONS ( datasource 'WFS:http://localhost:8082/geoserver/ows', format 'WFS' );

使用一个命令将所有WFS要素类型导入为外部表。

导入之后,您将在模式中看到几个新的外部表。

IMPORT FOREIGN SCHEMA ogr_all
FROM SERVER fdw_ogr_server_wfs
   INTO public;

检查外部数据表 topp_states

SELECT * FROM topp_states WHERE state_name = 'Minnesota';

尝试的东西

以下是您要尝试的其他一些挑战:

  • 尝试更多的空间功能,比如 st_buffer(geom)st_transform(geom,25831)st_x(geom) -您可以在http://postgis.net/documentation上找到完整的文档/
  • 将表导出到shapefiles pgsql2shp 在命令行上。
  • 尝试 ogr2ogr 在命令行上导入/导出数据到数据库。
  • 尝试导入数据 shp2pgsql 在数据库的命令行上。
  • 尝试使用 pgRouting .

接下来呢?

这只是使用PostGIS的第一步。您可以尝试更多的功能。