元数据表

为了符合Simple Features for SQLSFSQL)规范,PostGIS提供了两张表用于追踪和报告数据库中的几何图形(这两张表中的内容相当于元数据):

  • 第一张表spatial_ref_sys —— 定义了数据库已知的所有空间参照系统

  • 第二张表(实际上是视图-viewgeometry_columns —— 提供了数据库中所有空间数据表的描述信息。

数据库中的geometry_columns表

SELECT * FROM geometry_columns;
  • f_table_catalogf_table_schema,和f_table_name提供各个几何图形(geometry)的要素表(feature table)—— 即空间数据表 —— 的完全限定名称,分别是数据库名、模式名、空间数据表名。

  • f_geometry_column包含对应空间数据表中用于记录几何信息的属性列的列名

  • coord_dimension定义几何图形的维度(2维、3维或4维)

  • srid会引用自spatial_ref_sys表的空间参考标识符

  • type列定义了几何图形的类型。比如"点(Point)"和"线串(Linestring)"等类型。

通过查询该表,GIS客户端和数据库可以确定检索数据时的预期内容,并可以执行任何必要的投影、处理、渲染而无需检查每个几何图形

注意:如果nyc数据库没有指定26918的srid,通过更新很容易修复:

SELECT UpdateGeometrySRID('nyc_neighborhoods','geom',26918);

表示真实世界的对象

Simple Features for SQLSFSQL)规范是PostGIS开发的原始指导标准,它定义了如何表示真实世界的对象。

通过形成连续的图形并以固定的分辨率对其进行数字化,实现了对真实世界的合理表示。

SFSQL只规定了对真实世界对象的二维表示,然而,PostGIS已自行扩展了3维和4维的表示。

我们可以使用读取几何图形元数据的函数获取每个对象的基本信息:

  • ST_GeometryType(geometry) —— 返回几何图形的类型

  • ST_NDims(geometry) —— 返回几何图形的维数

  • ST_SRID(geometry) —— 返回几何图形的空间参考标识码

点(Points)

空间(Point)表示地球上的单个位置。由单个坐标表示(包括2维、3维或4维)。

当详细的细节(例如形状和大小)在目标空间尺度上不重要时,真实世界中的对象可以直接用表示。例如,世界地图上的城市可以描述为,而在一幅州地图中可以将城市表示为多边形

SELECT ST_AsText(geom)
FROM geometries
WHERE name = 'Point';

针对的一些特定空间函数包括:

  • ST_X(geometry) —— 返回X坐标

  • ST_Y(geometry) —— 返回Y坐标

  • ST_Z(geometry) —— 返回Z坐标

  • ST_M(geometry) —— 返回M信息

所以,我们这样来读取一个图形的坐标值:

SELECT ST_X(geom), ST_Y(geom)
FROM geometries
WHERE name = 'Point';

纽约市地铁站(nyc_subway_stations)表是一个以表示的数据集。以下SQL查询将返回一个图形数据(在ST_AsText列中):

SELECT name, ST_AsText(geom)
FROM nyc_subway_stations
LIMIT 1;

线串(Linestring)

线串(Linestring)是表示两个或多个位置之间的路径,它的形式是由两个或多个组成的有序序列。道路和河流通常表示为线串

如果线串的起始点和结束点是同一个,则称其是闭合的(closed),可以使用ST_IsClosed函数进行测试。

如果线串不与自身交叉或接触(如果线串是闭合的,则排除结束点),则称其是简单的(simple),可以使用ST_IsSimple函数进行测试。

线串既可以是闭合的,也可以是简单的

一条真实的街道可能由许多线串组成,每条线串代表一段具有不同属性特征的道路。

以下SQL查询将返回一个线串图形的信息(在ST_AsText列中)

SELECT ST_AsText(geom)
FROM geometries
WHERE name = 'Linestring';

用于处理线串的一些特定空间函数包括:

  • ST_Length(geometry) —— 返回线串的长度

  • ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回

  • ST_EndPoint(geometry) —— 将线串的最后一个坐标作为点返回

  • ST_NPoints(geometry) —— 返回线串的坐标数量

所以,我们的线串的长度为:

SELECT ST_Length(geom)
FROM geometries
WHERE name = 'Linestring';

多边形(Polygon)

多边形(Polygon)是区域的表示形式。多边形的外部边界由一个(Ring)表示(外环),这个是一个线串,如上面定义的,它既是闭合的,又是简单的。多边形中的(hole)也由表示(内环

多边形用于表示重视大小形状这两个特征的地理对象。城市边界、公园、建筑或水体都通常需要表示为多边形,当比例尺足够大时,可以观测它们的面积。道路和河流有时也可以表示为多边形

以下SQL查询将返回两个多边形图形的信息(在ST_AsText列中):

SELECT ST_AsText(geom)
FROM geometries
WHERE name LIKE 'Polygon%';

关于多边形图形的一些特定空间函数包括:

  • ST_Area(geometry) —— 返回多边形的面积

  • ST_NRings(geometry) —— 返回多边形中环的数量(通常为1个,其他是孔)

  • ST_ExteriorRing(geometry) —— 以线串的形式返回多边形最外面的环

  • ST_InteriorRingN(geometry, n) —— 以线串形式返回指定的内部环

  • ST_Perimeter(geometry) —— 返回所有环的长度

我们可以使用空间函数计算多边形的面积:

SELECT name, ST_Area(geom)
FROM geometries
WHERE name LIKE 'Polygon%';

图形集合(Collection)

有四种图形集合(Collection)类型,它们将多个简单几何图形组合为图形集合

  • MultiPoint —— 点集合

  • MultiLineString —— 线串集合

  • MultiPolygon —— 多边形集合

  • GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合

集合更多地出现在GIS软件中,而不是在通用图形软件中。

SELECT name, ST_AsText(geom)
FROM geometries
WHERE name = 'Collection';

用于处理图形集合的一些特定空间函数

  • ST_NumGeometries(geometry) —— 返回集合中的组成部分的数量

  • ST_GeometryN(geometry, n) —— 返回集合中指定的组成部分

  • ST_Area(geometry) —— 返回集合中所有多边形组成部分的总面积

  • ST_Length(geometry) —— 返回所有线段组成部分的总长度

几何图形输入和输出

在数据库中,几何图形(Geometry)以仅供PostGIS使用的格式存储在磁盘上。为了让外部程序插入和检索有用的几何图形信息,需要将它们转换为其他应用程序可以理解和解析的格式。

幸运的是,PostGIS支持以多种格式进行几何图形的输入和输出。

①Well-known text(WKT

  • ST_GeomFromText(text, srid) —— 返回geometry

  • ST_AsText(geometry) —— 返回text

  • ST_AsEWKT(geometry) —— 返回text

②Well-known binary(WKB

  • ST_GeomFromWKB(bytea) —— 返回geometry

  • ST_AsBinary(geometry) —— 返回bytea

  • ST_AsEWKB(geometry) —— 返回bytea

③Geographic Mark-up Language(GML

  • ST_GeomFromGML(text) —— 返回geometry

  • ST_ASGML(geometry) —— 返回text

④Keyhole Mark-up Language(KML

  • ST_GeomFromKML(text) —— 返回geometry

  • ST_ASKML(geometry) —— 返回text

GeoJson

  • ST_AsGeoJSON(geometry) —— 返回text

⑥Scalable Vector Graphics(SVG

  • ST_AsSVG(geometry) —— 返回text

以上函数最常见的用法是将几何图形文本(text)表示形式转换为内部表示形式:

除了具有几何图形表示形式的文本参数外,还可以指定一个提供几何图形SRID的数字参数。

以下SQL查询展示了一个WKB表示形式的示例(将二进制输出转换为ASCII格式以进行打印时,需要调用encode()):

SELECT encode(
  ST_AsBinary(ST_GeometryFromText('LINESTRING(0 0,1 0)')),
  'hex');

由于WKT和WKB是在SFSQL规范中定义的,因此它们不能处理3维或4维的几何图形。对于这些情况,PostGIS定义了Extended Well Known Text(EWKT)Extended Well Known Binary(EWKB)格式以用于处理3维或4维的几何图形

它们提供了与WKT和WKB相同的格式化功能,并且是在增加了维度的情况下。

以下是WKT中三维(3D)线串示例:

SELECT ST_AsText(ST_GeometryFromText('LINESTRING(0 0 0,1 0 0,1 1 2)'));

从文本转换

到目前为止,我们看到的WKT字符串都是'text'类型,我们使用PostGIS的函数ST_GeomFromText()将它们转换为'gometry'类型。

PostgreSQL包含一个简短形式的语法,允许数据从一种类型转换到另一种类型,即类型转换语法:

olddata::newtype

例如,将double类型转换为文本字符串类型:

SELECT 0.9::text;

以下SQL语句将一个WKT字符串转换成一个几何图形(geometry):

SELECT 'POINT(0 0)'::geometry;

关于使用类型转换语法创建几何图形,需要注意一点:除非指定SRID,否则将得到一个包含未知SRID的几何图形

可以使用EWKT形式指定SRID,该形式可以在前面包含一个SRID:

SELECT 'SRID=4326;POINT(0 0)'::geometry;