vlambda博客
学习文章列表

空间数据库 | SQL和空间数据类型

PostGIS03

参考:

https://zhuanlan.zhihu.com/p/62361189

SQL语句回顾

SQL,即"Structured Query Language-结构化查询语言",是对关系数据库操作数据的一种语言。

一般而言SQL语句操作数据库,包括增删改查四个类型,分别对应以下面四个SQL的动作:

  • SELECT——返回查询的记录
  • INSERT——向表中增加新记录
  • UPDATE——更新表中的记录
  • DELETE——删除表中的记录

对于空间数据来说,使用频率最多的动作为SELECT(查询),因此主要介绍SELECT系列语句。

SELECT

SELECT语句通用形式为:

SELECT some_columns FROM some_data_source WHERE some_condition;
  • some_columns :表中列名,也可以是由列值的函数(求和、均值等聚合函数或者空间函数)。
  • some_data_source:既可以是单张表,也可以是通过连接两个表而创建的组合表。
  • some_condition:限制条件,用于筛选出符合条件的记录

空间类型

常见的空间类型有:点(POINT)、线(LINESTRING)、多边形(POLYGON)、多点(MULTIPOINT)、多线(MULTILINESTRING)、多多边形(MULTIPOLYGON)和集合对象集(GEOMETRYCOLLECTION)等。

下面的示例展示,创建一个表,同时向该表插入点、线和多边形。

CREATE TABLE my_geometries (name varchar, geom geometry); INSERT INTO my_geometries VALUES ('Point', 'POINT(0 0)'), ('Linestring', 'LINESTRING(0 0, 1 1, 2 1, 2 2)'), ('Polygon', 'POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'); SELECT name, ST_AsText(geom) FROM my_geometries;

在PostGIS内每个空间数据库提供了两张表,作为元数据表来描述空间数据内的空间信息。

  • 第一张表 spatial_ref_sys —— 定义了数据库已知的所有 空间参照系统。
  • 第二张表(实际上是视图-view) geometry_columns —— 提供了数据库中所有空间数据表的描述信息。

可在每个数据库通过下列语句,查询数据库中所有空间数据表的描述信息。

SELECT * FROM geometry_columns;

空间数据库 | SQL和空间数据类型

  • f_table_catalog, f_table_schema,和 f_table_name分别是每张空间数据表的数据库名、模式名和空间数据库表名。
  • f_geometry_column指定空间数据库内用于记录几何信息的属性列的列名。
  • coord_dimension指名空间数据表内几何图像的维度(2维、3维或4维)。
  • srid指定空间数据表的空间参考。
  • type指名几何图形的类型。

点(Points)

空间点由单个坐标组成,一般当详细的细节(形状和大小)在目标空间尺度上不重要时,则真实世界中的对象可以直接用点表示。

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

  • ST_X(geometry) —— 返回X坐标
  • ST_Y(geometry) —— 返回Y坐标
  • ST_Z(geometry) —— 返回Z坐标
  • ST_M(geometry) —— 返回M信息
SELECT ST_X(geom), ST_Y(geom), ST_Z(geom), ST_M(geom) FROM my_geometries WHERE name = 'Point';

空间数据库 | SQL和空间数据类型

线(LineString)

线是表示两个或多个位置之间的路径,它的形式是由两个或多个点组成的有序序列。

  • 如果线不与自身交叉或者接触,则称简单的线(Simple),可用 ST_IsSimple来验证。
  • 如果线的起始点和结束点是同一个点,则称闭合的线(Closed),可用 ST_IsClosed来验证。

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

  • ST_Length(geometry) —— 返回线串的长度
  • ST_StartPoint(geometry) —— 将线串的第一个坐标作为点返回
  • ST_EndPoint(geometry) —— 将线串的最后一个坐标作为点返回
  • ST_NPoints(geometry) —— 返回线串的坐标数量
SELECT ST_Length(geom), ST_StartPoint(geom), ST_EndPoint(geom), ST_NPoints(geom) FROM my_geometries WHERE name = 'Linestring';

空间数据库 | SQL和空间数据类型

多边形(Polygon)

多边形(Polygon)是区域的表示形式。多边形用于表示地理对象的形状和大小,多边形可分为普通多边形和带孔多边形。

空间数据库 | SQL和空间数据类型

左侧蓝色多边形是普通多边形,只有一个外环组成。右侧红色多边形是带孔多边形,由一个外环和内环组成。

向空间数据库表内插入普通多边形和带孔多边形。

INSERT INTO my_geometries VALUES ('PolygonWithHole', 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))'), ('Collection', 'GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0 0)))');

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

  • ST_Area(geometry) —— 返回多边形的面积
  • ST_NRings(geometry) —— 返回多边形中环的数量(通常为1个,其他是孔)
  • ST_ExteriorRing(geometry) —— 以线串的形式返回多边形最外面的环
  • ST_InteriorRingN(geometry, n) —— 以线串形式返回指定的内部环
  • ST_Perimeter(geometry) —— 返回所有环的长度
SELECT name, ST_Area(geom), ST_NRings(geom), ST_Perimeter(geom)FROM my_geometriesWHERE name LIKE 'Polygon%';

带内环的多边形的面积是多边形外环的面积(10 x 10正方形)减去内环的面积(1 x 1正方形)

要素集合(Collection)

要素集合是指将简单要素图像组成为集合,通常用:

  • MultiPoint —— 点集合
  • MultiLineString —— 线串集合
  • MultiPolygon —— 多边形集合
  • GeometryCollection —— 由任意几何图形(包括其他GeometryCollection)组成的异构集合

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

  • ST_NumGeometries(geometry) —— 返回集合中的组成部分的数量
  • ST_GeometryN(geometry, n) —— 返回集合中指定的组成部分
  • ST_Area(geometry) —— 返回集合中所有多边形组成部分的总面积
  • ST_Length(geometry) —— 返回所有线段组成部分的总长度
SELECT name, ST_NumGeometries(geom), ST_Area(geom), ST_Length(geom)FROM my_geometriesWHERE name = 'Collection';

几何要素输入和输出

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

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

  • Well-known text(WKT)

    • ST_GeomFromText(text, srid) —— 从text(WKT格式)中创建geometry,并指定空间参考
    • ST_AsText(geometry) —— 将geometry转为text(WKT格式)
    • ST_AsEWKT(geometry) —— 将geometry转为text(WKT格式)
  • Well-known binary(WKB)

    • ST_GeomFromWKB(bytea) —— 从字节创建geometry
    • ST_AsBinary(geometry) —— 将geometry转为bytea
    • ST_AsEWKB(geometry) —— 将geometry转为bytea
  • Geographic Mark-up Language(GML)

    • ST_GeomFromGML(text) —— 从text(GML格式)中创建geometry
    • ST_ASGML(geometry) —— 将geometry转为text(GML格式)
  • Keyhole Mark-up Language(KML)

    • ST_GeomFromKML(text) —— 从text(KML格式)中创建geometry
    • ST_ASKML(geometry) ——  将geometry转为text(KML格式)
  • GeoJSON

    • ST_AsGeoJSON(geometry) —— 将geometry转为text(GeoJSON格式)
  • Scalable Vector Graphics(SVG)

    • ST_AsSVG(geometry) —— 将geometry转为text(SVG格式)