

PostGIS Quickstart¶
PostGIS为PostgreSQL关系数据库添加了空间功能。它扩展了PostgreSQL,以便存储、查询和操作空间数据。在这个快速启动中,我们将在描述一般数据库函数时使用“PostgreSQL”,在描述Postgis提供的额外空间功能时使用“Postgis”。
此快速入门介绍了如何:
- 从命令行创建和查询空间数据库 QGIS 图形客户端。
- 管理来自的数据
pgAdmin
客户端。
Contents
客户机-服务器体系结构¶
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_columns
, geography_columns
和 raster_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
继续:

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

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

你现在应该看到一张湖泊地图。QGIS不知道它们是湖泊,所以可能不会为您将它们涂成蓝色-使用QGIS文档来解决如何更改这一点。放大到加拿大著名的湖泊群。
将空间数据导入数据库¶
大多数OSGeo桌面工具都具有将其他格式(如ESRI Shape)的空间数据导入数据库的功能。再次,我们将使用QGIS来展示这一点。
可以通过便捷的QGIS数据库管理器将形状文件导入到QGIS。你可以在菜单里找到经理。去 Database -> DB Manager -> DB Manager
.
部署PostGIS项目,然后部署NaturalEarth项目。然后它将连接到自然地球数据库。如果需要,请将密码留空。在公共项中,有数据库提供的层列表。您将看到主管理器窗口。在左侧,您可以从数据库中选择表,然后使用右侧的选项卡来查找它们。预览选项卡将显示一个小地图。

我们现在将使用数据库管理器将形状文件导入数据库。我们将使用北卡罗莱纳州婴儿猝死综合症(SIDS)数据,该数据包含在一个R统计数据包附加组件中。
从 Table
菜单选择 Import layer/file
选择权。击中 ...
按钮并浏览到 sids.shp
R中的形状文件 maptools
包(位于/usr/local/lib/r/site library/spdata/shapes中):

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

让坐标参考系选择器默认为(wgs 84 epsg:4326),然后点击 OK
. 应将形状文件导入Postgis,且不出现错误。关闭Postgis管理器并返回主Qgis窗口。
现在,使用“添加PostGIS层”选项将SID数据加载到地图中。通过重新排列图层和一些颜色,您应该能够绘制北卡罗来纳州婴儿猝死综合征计数(SID74或SID79字段)的脊索动物地图:

了解PGADMIN III¶
您可以使用图形数据库客户端 pgAdmin III
从“数据库”菜单中查询和修改数据库。这是PostgreSQL的官方客户端。
小技巧
请注意,有一个名为pgAdmin4的新版本可以通过apt install pgAdmin4安装
pgAdmin III允许您使用SQL操作数据表。您可以从OSGeoLive桌面上的Databases文件夹中找到并启动pgAdmin III。

在这里,您可以选择创建到PostgreSQL服务器的新连接,或者连接到现有服务器。在这种情况下,我们将连接到 local
服务器。
建立连接后,您可以看到系统中已经存在的数据库的列表。

大多数数据库图像上的红色“X”表示您尚未连接到其中任何一个数据库(您仅连接到默认数据库 postgres
数据库)。此时,您只能看到系统上现有的数据库。您可以通过双击数据库的名称进行连接。为自然地球2数据库做。
现在你可以看到红色的X消失了,一个“+”出现在左边。按下它,一棵树就会出现,显示数据库的内容。
导航在 schemas
子树,展开它。然后展开 public
图式。通过导航和扩展 Tables
,您可以看到此架构中包含的所有表。

从pgAdmin III执行SQL查询¶
pgadminIII提供了对关系数据库执行查询的能力。
要对数据库执行查询,必须按 SQL
主工具栏上的按钮(带有黄色放大镜的按钮)。
我们将找出1974年每个城市的儿童出生率。此外,我们将根据计算出的速率对结果进行排序。为此,我们需要执行以下查询(在SQL窗口的文本编辑器上提交):
select name, 1000*sid74/bir74 as rate from sids order by rate;
然后,您应该按绿色箭头按钮,指向右边(执行查询)。

了解外国数据包装器(FDW)¶
从您的数据库,您可以访问远程对象,如来自其他PostgreSQL数据库的表,或连接到远程数据库,如Oracle、MySQL、MS SQL或CouchDB。您还可以通过ODBC连接,连接到CSV、地理空间数据甚至twitter。
您可以在以下网址找到不同FDW的列表:
让我们看看它是怎么工作的!最简单的方法是连接到另一个PostgreSQL数据库。
步骤如下:
首先加载要使用的外部数据包装器的扩展名。为了连接到另一个PostgreSQL数据库,您需要 postgres_fdw
CREATE EXTENSION postgres_fdw;
小技巧
请注意,在pgAdmin III中,默认情况下,外部数据包装器、外部服务器、用户映射和外部表不会显示在树中。你必须通过菜单激活它们
创建一个外部服务器,告诉您在何处找到要连接的数据源
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
- 打开GeoServerhttp://localhost:8082/geoserver/web/
- GeoServer WFS获取功能http://localhost:8082/geoserver/ows?service=wfs&version=2.0.0&request=GetCapabilities
- 的GeoServer WFS DescribeFeatureTypetopp:州 http://localhost:8082/geoserver/ows?service=wfs&version=2.0.0&request=DescribeFeatureType&typename=topp:states
- GeoServer WFS GetFeaturetopp:州 http://localhost:8082/geoserver/ows?service=wfs&version=2.0.0&request=GetFeature&typename=topp:states
创建引用要连接的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的第一步。您可以尝试更多的功能。
- PostGIS项目主页-http://postgis.net
- PostGIS文档-http://postgis.net/documentation/