PostGIS是流行的PostgreSQL对象关系数据库的空间数据库扩展。PostGIS在PostgreSQL server上启用空间,允许它用作地理信息系统(GIS)和web地图应用程序的后端空间数据库,方式与Microsoft的SQL server spatial和Oracle的spatial database extension相同。PostGIS是一个开源项目,PostGIS源代码根据GNU通用公共许可证(GPL)发布。

存储类型

使用geography这种数据类型时,PostGIS的内部计算是基于实际地球球体来计算的。
使用geometry这种数据类型时,PostGIS的内部计算是基于平面来计算的。

WKT和WKB

OGC SFA 规范定义了两种格式,用于表示供外部使用的几何值:已知文本 (WKT) 和已知二进制 (WKB)。
WKT和WKB都包含有关对象类型和定义对象的坐标的信息。

–WKT的输入和输出由ST_AsText和ST_GeomFromText功能提供:
text WKT = ST_AsText(geometry geom);
geometry geom = ST_GeomFromText(text WKT, integer SRID);

–WKB的输入和输出由ST_AsBinary和ST_GeomFromWKB功能提供:
bytea WKB = ST_AsBinary(geometry geom);
geometry geom = ST_GeomFromWKB(bytea WKB, integer SRID);

空间参考

在PostGIS安装时,会创建一个 SPATIAL_REF_SYS 表,用于定义可用的空间参考系统,保存坐标系的数字 SRID 和文本描述。
常见的两种:

SRID 坐标系
3389 WGS84(World Geodetic System 1984)
4490 CGCS2000(China Geodetic Coordinate System 2000)
  1. 查看空间参考: ST_SRID(geometry): integer

  2. 设置空间参考: ST_SetSRID(geometry, integer): geometry
    仅仅是设置,并未进行坐标转换。

  3. 转换空间参考: ST_Transform(geometry, integer): geometry
    返回一个新几何,其坐标已转换为不同的空间参考系。

常见几何类型

  1. 点:POINT(0 0)
    点是一种 0 维几何图形,表示坐标空间中的单个位置。

  2. 线:LINESTRING(0 0,1 1,1 2)
    线串是由连续的线段序列形成的一维线。每个线段由两个点定义,一个线段的终点构成下一个线段的起点。OGC 有效的 LineString 具有零点、两点或更多点,但 PostGIS 还允许使用单点 LineStrings。线串可以交叉自身(自相交)。如果起点和终点相同,则 LineString 处于闭合状态。

  3. 闭环线:LINEARRING (0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0)
    线性环是一个既封闭又简单的线串。第一个点和最后一个点必须相等,并且线不能自相交。

  4. 面(多边形):POLYGON((0 0,4 0,4 4,0 4,0 0))
    多边形是一个二维平面区域,由外部边界(壳)和零个或多个内部边界(孔)分隔。每个边界都是一个线性环。

  5. 多点:MULTIPOINT((0 0),(1 2))
    点的集合。

  6. 多线:MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
    线的集合,如果线的每个元素是闭合的,则它也是闭合的。

  7. 多面:MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
    面的集合。

  8. 三角形:TRIANGLE ((0 0, 0 9, 9 0, 0 0))
    三角形是由三个不同的非共线顶点定义的多边形。由于三角形是多边形,因此它由四个坐标指定,第一个和第四个坐标相等。

  9. 几何集合:GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))
    几何的异构(混合)集合。

常用Postgis函数

几何关系函数

  1. 获取两个几何间的距离(单位: 米): ST_Distance(geometry, geometry): float
    返回float

  2. 判断几何B是否在几何A给定范围内的(单位: 米):ST_DWithin(geometry A, geometry B, float): boolean
    常用于类式”在距离道路500米的缓冲区内有多少棵树?”的问题,不必计算实际的缓冲区
    如果要以米计算,需修改为地理类型geography

  3. 判断两个几何是否相等: ST_Equals(geometry, geometry): boolean
    如果任一几何图形无效,则此函数将返回 false,除非它们是二进制相等的

  4. 判断两个几何是否分离: ST_Disjoint(geometry, geometry): boolean

  5. 判断两个几何是否相交: ST_Intersects(geometry, geometry): boolean

  6. 判断几何A是否被几何B包含: ST_Within(geometry A, geometry B): boolean
    ST_Within(A, B)=ST_Contains(B, A)

  7. 判断几何A是否包含几何B: ST_Contains(geometry A, geometry B): boolean
    ST_Contains(A, B)=ST_Within(B, A)

几何处理函数

  1. 获取几何的中心: ST_Centroid(geometry): geometry(POINT)
    计算一个点,它是几何体的几何质心。对于多点,质心是输入坐标的算术平均值;对于多线,使用每个线段的加权长度计算质心;对于多面,质心是根据面积计算的;如果提供了空几何,则返回空几何;如果提供NULL,则返回NULL

  2. 获取几何的面积: ST_Area(geometry): float

  3. 获取几何的长度: ST_Length(geometry): float

  4. 获取缓冲后的几何: ST_Buffer(geometry, double, [integer]): geometry
    一般将 geometry 转换为 geography 后第二个参数输入单位为米的值
    详细说明:https://www.cnblogs.com/gisarmory/p/13964929.html

  5. 获取两个几何相交的部分(交集): ST_Intersection(geometry, geometry): geometry

  6. 获取两个几何不相交的部分: ST_SymDifference(geometry, geometry): geometry

  7. 获取几何A的补集: ST_Difference(geometry A, geometry B): geometry

  8. 合并两个几何: ST_Union(geometry, geometry): geometry

  9. 合并一系列几何: ST_Union(geometry set): geometry

  10. 合并一系列几何: ST_MemUnion(geometry set): geometry
    相较于 ST_Union : 内存更少,但时间更长

几何存取函数

  1. 获取几何的维数: ST_Dimension(geometry): integer

  2. 判断几何是否为空: ST_IsEmpty(geometry): boolean

  3. 判断几何是否不包含特殊点(比如自相交): ST_IsSimple(geometry): boolean

  4. 判断几何是否闭合: ST_IsClosed(geometry): boolean

  5. 判断几何是否闭合并且不包含特殊点: ST_IsClosed(geometry): boolean
    既是 ST_IsSimple,又是 ST_IsClosed

  6. 获取多几何中的对象个数: ST_NumGeometries(geometry): integer
    返回几何图形的数目。如果几何图形是几何集合(或 MULTI*),则返回几何数,对于单个几何图形,将返回 1,否则返回 NULL

  7. 获取多几何中第N个对象: ST_GeometryN(geometry, integer): geometry
    返回输入几何体的从 1 开始的第 N 个元素几何图形,该几何图形是几何集合、多点、多线串、多曲线、多)多边形或多面体曲面。否则,返回空值

  8. 获取几何中的点个数: ST_NumPoints(geometry): integer
    返回 ST_LineString 或 ST_CircularString 值中的点数

  9. 获取几何的第N个点: ST_PointN(geometry): geometry
    返回几何中单个线串或圆形线串中的第 N 个点。负值从线串的末尾向后计数,因此 -1 是最后一个点。如果几何图形中没有线串,则返回 NULL

  10. 获取线的起点: ST_StartPoint(geometry): geometry
    为所有几何图形返回第一个点。如果输入不是线串,则将返回 NULL

  11. 获取线的终点: ST_EndPoint(geometry): geometry
    为所有几何图形返回最后一个点。如果输入不是线串,则将返回 NULL

  12. 获取几何的类型: GeometryType(geometry): text
    以字符串形式返回几何图形的类型。例如:LINESTRING, POLYGON, MULTIPOINT 等等

  13. 获取点的X坐标: ST_X(geometry): geometry
    返回点的 X 坐标,如果不可用,则返回 NULL;输入必须是一个点

  14. 获取点的Y坐标: ST_Y(geometry): geometry
    返回点的 Y 坐标,如果不可用,则返回 NULL;输入必须是一个点

  15. 获取点的Z坐标: ST_Z(geometry): geometry
    返回点的 Z 坐标,如果不可用,则返回 NULL;输入必须是一个点

  16. 获取点的M坐标: ST_M(geometry): geometry
    返回点的 M 坐标,如果不可用,则返回 NULL;输入必须是一个点

几何类型转换函数

  1. geometry 转换为 geojson: ST_AsGeojson(geometry): text

  2. geojson 转换为 geometry: ST_GeomFromGeojson(text): geometry

参考

postgis官网:http://www.postgis.org
postgis参考:https://postgis.net
函数说明(如ST_Centroid):https://postgis.net/docs/ST_Centroid.html