PostgreSQL扩展之Postgis
存储类型
使用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) |
查看空间参考: ST_SRID(geometry): integer
设置空间参考: ST_SetSRID(geometry, integer): geometry
仅仅是设置,并未进行坐标转换。转换空间参考: ST_Transform(geometry, integer): geometry
返回一个新几何,其坐标已转换为不同的空间参考系。
常见几何类型
点:POINT(0 0)
点是一种 0 维几何图形,表示坐标空间中的单个位置。线:LINESTRING(0 0,1 1,1 2)
线串是由连续的线段序列形成的一维线。每个线段由两个点定义,一个线段的终点构成下一个线段的起点。OGC 有效的 LineString 具有零点、两点或更多点,但 PostGIS 还允许使用单点 LineStrings。线串可以交叉自身(自相交)。如果起点和终点相同,则 LineString 处于闭合状态。闭环线:LINEARRING (0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0)
线性环是一个既封闭又简单的线串。第一个点和最后一个点必须相等,并且线不能自相交。面(多边形):POLYGON((0 0,4 0,4 4,0 4,0 0))
多边形是一个二维平面区域,由外部边界(壳)和零个或多个内部边界(孔)分隔。每个边界都是一个线性环。多点:MULTIPOINT((0 0),(1 2))
点的集合。多线:MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
线的集合,如果线的每个元素是闭合的,则它也是闭合的。多面: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)))
面的集合。三角形:TRIANGLE ((0 0, 0 9, 9 0, 0 0))
三角形是由三个不同的非共线顶点定义的多边形。由于三角形是多边形,因此它由四个坐标指定,第一个和第四个坐标相等。几何集合:GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))
几何的异构(混合)集合。
常用Postgis函数
几何关系函数
获取两个几何间的距离(单位: 米): ST_Distance(geometry, geometry): float
返回float判断几何B是否在几何A给定范围内的(单位: 米):ST_DWithin(geometry A, geometry B, float): boolean
常用于类式”在距离道路500米的缓冲区内有多少棵树?”的问题,不必计算实际的缓冲区
如果要以米计算,需修改为地理类型geography判断两个几何是否相等: ST_Equals(geometry, geometry): boolean
如果任一几何图形无效,则此函数将返回 false,除非它们是二进制相等的判断两个几何是否分离: ST_Disjoint(geometry, geometry): boolean
判断两个几何是否相交: ST_Intersects(geometry, geometry): boolean
判断几何A是否被几何B包含: ST_Within(geometry A, geometry B): boolean
ST_Within(A, B)=ST_Contains(B, A)判断几何A是否包含几何B: ST_Contains(geometry A, geometry B): boolean
ST_Contains(A, B)=ST_Within(B, A)
几何处理函数
获取几何的中心: ST_Centroid(geometry): geometry(POINT)
计算一个点,它是几何体的几何质心。对于多点,质心是输入坐标的算术平均值;对于多线,使用每个线段的加权长度计算质心;对于多面,质心是根据面积计算的;如果提供了空几何,则返回空几何;如果提供NULL,则返回NULL获取几何的面积: ST_Area(geometry): float
获取几何的长度: ST_Length(geometry): float
获取缓冲后的几何: ST_Buffer(geometry, double, [integer]): geometry
一般将 geometry 转换为 geography 后第二个参数输入单位为米的值
详细说明:https://www.cnblogs.com/gisarmory/p/13964929.html获取两个几何相交的部分(交集): ST_Intersection(geometry, geometry): geometry
获取两个几何不相交的部分: ST_SymDifference(geometry, geometry): geometry
获取几何A的补集: ST_Difference(geometry A, geometry B): geometry
合并两个几何: ST_Union(geometry, geometry): geometry
合并一系列几何: ST_Union(geometry set): geometry
合并一系列几何: ST_MemUnion(geometry set): geometry
相较于 ST_Union : 内存更少,但时间更长
几何存取函数
获取几何的维数: ST_Dimension(geometry): integer
判断几何是否为空: ST_IsEmpty(geometry): boolean
判断几何是否不包含特殊点(比如自相交): ST_IsSimple(geometry): boolean
判断几何是否闭合: ST_IsClosed(geometry): boolean
判断几何是否闭合并且不包含特殊点: ST_IsClosed(geometry): boolean
既是 ST_IsSimple,又是 ST_IsClosed获取多几何中的对象个数: ST_NumGeometries(geometry): integer
返回几何图形的数目。如果几何图形是几何集合(或 MULTI*),则返回几何数,对于单个几何图形,将返回 1,否则返回 NULL获取多几何中第N个对象: ST_GeometryN(geometry, integer): geometry
返回输入几何体的从 1 开始的第 N 个元素几何图形,该几何图形是几何集合、多点、多线串、多曲线、多)多边形或多面体曲面。否则,返回空值获取几何中的点个数: ST_NumPoints(geometry): integer
返回 ST_LineString 或 ST_CircularString 值中的点数获取几何的第N个点: ST_PointN(geometry): geometry
返回几何中单个线串或圆形线串中的第 N 个点。负值从线串的末尾向后计数,因此 -1 是最后一个点。如果几何图形中没有线串,则返回 NULL获取线的起点: ST_StartPoint(geometry): geometry
为所有几何图形返回第一个点。如果输入不是线串,则将返回 NULL获取线的终点: ST_EndPoint(geometry): geometry
为所有几何图形返回最后一个点。如果输入不是线串,则将返回 NULL获取几何的类型: GeometryType(geometry): text
以字符串形式返回几何图形的类型。例如:LINESTRING, POLYGON, MULTIPOINT 等等获取点的X坐标: ST_X(geometry): geometry
返回点的 X 坐标,如果不可用,则返回 NULL;输入必须是一个点获取点的Y坐标: ST_Y(geometry): geometry
返回点的 Y 坐标,如果不可用,则返回 NULL;输入必须是一个点获取点的Z坐标: ST_Z(geometry): geometry
返回点的 Z 坐标,如果不可用,则返回 NULL;输入必须是一个点获取点的M坐标: ST_M(geometry): geometry
返回点的 M 坐标,如果不可用,则返回 NULL;输入必须是一个点
几何类型转换函数
geometry 转换为 geojson: ST_AsGeojson(geometry): text
geojson 转换为 geometry: ST_GeomFromGeojson(text): geometry
参考
postgis官网:http://www.postgis.org
postgis参考:https://postgis.net
函数说明(如ST_Centroid):https://postgis.net/docs/ST_Centroid.html







