空间数据库 | 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;
-
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';
线(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';
多边形(Polygon)
多边形(Polygon)是区域的表示形式。多边形用于表示地理对象的形状和大小,多边形可分为普通多边形和带孔多边形。
左侧蓝色多边形是普通多边形,只有一个外环组成。右侧红色多边形是带孔多边形,由一个外环和内环组成。
向空间数据库表内插入普通多边形和带孔多边形。
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_geometries
WHERE 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_geometries
WHERE 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格式)