参考: PostGIS官方教程
1、空间数据类型
( SFSQL ) 规范是 PostGIS 开发的原始指导标准,它定义了真实世界对象的表示方式。
PostGIS中使用geometry
和geography
这两种数据类型来表示所有的空间几何对象,包括:
- 原始类型:点
**Point**
、线**LineString**
、面**Polygon**
- 几何类型:
**MultiPoint**
、**MultiLineString**
、**MultiPolygon**
、任意集合图形集合**GeometryCollection**
- PostGIS拓展:
Triangle
和Tin
。
在GIS中集合是一个很重要的内容,比如:表示对被道路分割的宗地。
1.1 geometry与geography
与SQLSERVER空间数据类型一致,在PostGIS中,geometry
代表使用投影坐标系的矢量数据,geography
代表使用地理坐标系的矢量数据。
更推荐使用geometry类型,因为有更多的空间函数的支持。(因为投影坐标系下一些空间运算更方便)
1.2 3D支持
PostGIS支持3D以及更高维度的几何图形,通过对几何图形增加"Z"维度添加高程信息,增加“M”维度支持其他的额外信息。
使用WKT格式表示
以点图形为例,使用WKT格式:
- 2D:
Point(x,y)
- 3D:
Point Z(x,y,z)
- M:
POINT ZM (X,Y,Z,M)
2、空间参考系统(坐标系)
空间参考系统分为三种类型:
- 地理坐标系(经纬度)
- 投影坐标系
- 平面坐标系,在PostGIS中SRID为0
:::info postgis中,空间参考系不是与表关联的,是与表中表示几何图形的字段关联的。一个表可以有多个不同的坐标系的几何图形。 :::
2.1 坐标系相关的空间函数
- ST_SRID:查看坐标系
- ST_SetSRID:设置坐标系
- ST_Transform:转换坐标系
3、几何转换
在PostGIS中,空间数据geom是以仅供PostGIS使用的格式存储的,如何把他转换为我们熟知的格式哪?
有很多格式转换函数:
- Well-known text (WKT)
- ST_GeomFromText(text, srid) returns geometry
- ST_AsText(geometry) returns text
- ST_AsEWKT(geometry) returns text
- Well-known binary (WKB)
- ST_GeomFromWKB(bytea) returns geometry
- ST_AsBinary(geometry) returns bytea
- ST_AsEWKB(geometry) returns bytea
- Geographic Mark-up Language (GML)
- ST_GeomFromGML(text) returns geometry
- ST_AsGML(geometry) returns text
- Keyhole Mark-up Language (KML)
- ST_GeomFromKML(text) returns geometry
- ST_AsKML(geometry) returns text
- GeoJSON
- ST_AsGeoJSON(geometry) returns text
- Scalable Vector Graphics (SVG)
- ST_AsSVG(geometry) returns text
4、创建几何
2.2 直接指定几何对象
使用Well-Known Text (WKT
) and Well-Known Binary(WKB
)格式表示几何:
SELECT 'SRID=4;POINT(0 0)'::geometry;
geometry
----------------------------------------------------
01010000200400000000000000000000000000000000000000
2.3 通过空间函数构造几何
- ST_Collect — 从一组几何体创建一个 GeometryCollection 或 Multi* 几何体。
- ST_LineFromMultiPoint — 从多点几何创建一个 LineString。
- ST_MakeEnvelope — 从最小坐标和最大坐标创建矩形多边形。
- ST_MakeLine — 从点、多点或线串几何图形创建线串。
- ST_MakePoint — 创建 2D、3DZ 或 4D 点。
- ST_MakePointM — 从 X、Y 和 M 值创建一个点。
- ST_MakePolygon — 从壳和可选的孔列表创建多边形。
- ST_Point — 创建具有 X、Y 和 SRID 值的点。
- ST_PointZ — 创建具有 X、Y、Z 和 SRID 值的点。
- ST_PointM — 创建具有 X、Y、M 和 SRID 值的点。
- ST_PointZM — 创建具有 X、Y、Z、M 和 SRID 值的点。
- ST_Polygon — 从具有指定 SRID 的 LineString 创建多边形。
- ST_TileEnvelope — 使用 XYZ 瓦片系统在 Web Mercator (SRID:3857) 中创建一个矩形多边形。
- ST_HexagonGrid — 返回一组完全覆盖几何参数边界的六边形和单元格索引。
- ST_Hexagon — 返回单个六边形,使用六边形网格空间内提供的边尺寸和单元格坐标。
- ST_SquareGrid — 返回一组完全覆盖几何参数边界的网格正方形和单元格索引。
- ST_Square — 使用正方形网格空间内提供的边尺寸和单元格坐标返回单个正方形。
- ST_Letters — 返回呈现为几何图形的输入字母,默认起始位置在原点,默认文本高度为 100。
5、几何有效性
几何有效性主要适用于二维几何(Polygon和MutilPolygon)
有效的**polygon**
:
- 多边形边界环(外壳环和内孔环)很_简单_(不要交叉或自接触)。因此,多边形不能有切割线、尖峰或环。这意味着多边形孔必须表示为内环,而不是外环自接触(所谓的“倒孔”)。
- 边界环不交叉
- 边界环可能在点处接触但仅作为切线(即不在一条线上)
- 内环包含在外环中
- 多边形内部是简单连接的(即环不能以将多边形分成多个部分的方式接触)
有效的multipolygon :
6、空间索引
在标准数据库中,索引是通过B+树等结构实现数据的高效检索,那么对于几何图形数据,带有空间坐标的数据是如何进行检索哪?
:::info
空间索引是如何工作的哪?
使用R树索引,构建几何数据的最小外包矩形,在查找空间数据时,就可以先通过这个最小外包矩形来对数据进行筛选,从而实现数据的高效检索。
:::
7、元数据表
为了符合Simple Features for SQL(SFSQL)规范,PostGIS提供了两张表用于追踪和报告数据库中的几何图形:
- 第一张表spatial_ref_sys —— 定义了数据库已有的几何数据的所有空间参照系统;
- 第二张表**geometry_columns **—— 提供了数据库中所有空间数据的描述信息。
geometry_columns 提供了很多信息,包括:
- f_table_catalog:数据库名;f_table_schema:模式名:f_table_name:空间数据表名
- f_geometry_column:用于记录几何信息的属性列的列名**。**
- coord_dimension:几何图形的维度(2维、3维或4维)
- srid会引用自spatial_ref_sys表的空间参考标识符
- type列定义了几何图形的类型。比如"点(Point)"和"线串(Linestring)"等类型。