GEOMETRY类型
📄字数 4.3K
👁️阅读量 加载中...
功能说明
GEOMETRY数据类型,即几何数据类型,实现了OGC简单要素模型。它是抽象类型,包含多种几何子类型。
语法格式
sql
GEOMETRY[(TYPMOD,SRID)]参数说明
TYPMOD:空间类型修饰符,即几何子类型,表示各种类型和各种维度的几何形状。SRID:空间参考系统标识符,默认为:0。
几何子类型
几何子类型实现了SFA的几何对象模型。
基础类型
| 类型名称 | 功能说明 | WKT示例 |
|---|---|---|
| Point | 点是表示坐标空间中单个位置。 一个点是一个零维的对象。 | POINT (1 2)POINT Z (1 2 3)POINT M (1 2 3)POINT ZM (1 2 3 4) |
| LineString | 线串是表示两个或多个位置之间的路径,它的形式是由两个或多个点组成的有序序列。 | 有3个节点的线:LINESTRING (1 2, 3 4, 5 6) |
| LinearRing | 线性环是一个既闭合又简单的线串。第一个点和最后一个点必须相等,并且线不得自相交 | 1个线环:LINEARRING (0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0) |
| Polygon | 多边形是一个二维平面区域,包含一个外部边界(即外壳)以及可能存在的一个或多个内部边界(即孔)。这些边界都是线性环(LinearRing)。 | 有1个外环和1个内环的多边形:POLYGON ((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)) |
| Triangle | 三角形是由三个不同的非共线顶点定义的多边形,是一个多边形的子类型,第一和第四个相等。 | 1个三角形:TRIANGLE ((0 0, 0 9, 9 0, 0 0)) |
集合类型
| 类型名称 | 功能说明 | WKT示例 |
|---|---|---|
| MultiPoint | 多点是点的集合。 | 有2个点的多点:MULTIPOINT ( (0 0), (1 2) ) |
| MultiLineString | 多线是线串的集合,如果多线的每个元素都已闭合,则该多线闭合。 | 有2条线的多线:MULTILINESTRING ( (0 0,1 1,1 2), (2 3,3 2,5 4) ) |
| MultiPolygon | 多多边形是非重叠、不相邻多边形的集合。集合中的多边形只能在有限数量的点处接触。 | 有2个多边形的多多边形(只有一个外环的多边形+三角形):MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), ((6 5, 9 1, 6 1, 6 5))) |
| GeometryCollection | 几何集合是任意几何图形的异构(混合)集合。 | 有1个点和1条线的几何集合:GEOMETRYCOLLECTION ( POINT(2 3), LINESTRING(2 3, 3 4)) |
| PolyhedralSurface | 多面体表面是多边形的集合,且他们共享共同的边界。如果多边形坐标具有 Z 坐标,则表面是三维的。 | 1个立方体的体表面: POLYHEDRALSURFACE Z ( |
| TIN | 不规则三角网是一组不重叠的三角形,表示了一个三角不规则网络的结构。 | 有2个三角形的TIN:TIN Z ( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) ) |
曲线类型
支持参数化存储圆、圆弧、椭圆、椭圆弧几何对象,支持由这些对象组合成的复合线和复合面。
| 类型名称 | 功能说明 | WKT 示例 |
|---|---|---|
| CircularString | 圆弧是基本曲线类型,类似于线性世界中的线串。 单个圆弧段由三个点指定:起点、控制点和终点,控制点是控制弧线的曲率。 要指定闭合圆,起点和终点相同,中点是圆直径上的相对点(即圆弧的中心)。 在弧序列中,前一个弧的终点是下一个弧的起点。 圆弧串必须具有大于1的奇数个点。 | CIRCULARSTRING(0 0, 1 1, 1 0)CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0) |
| CompoundCurve | 复合曲线是一条连续曲线,可以包含圆弧段和直线段。 每个线段(最后一个除外)的终点必须与下一个线段的起点重合。 | 1个圆弧(CircularString)和1个线串(LineString)组成的复合曲线:COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1)) |
| CurvePolygon | 曲线多边形与多边形相似,有一个外环和零个或多个内环。区别在于多边形的环是线串,而曲线多边形环是复合曲线或圆弧。 | CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1) ) CURVEPOLYGON(COMPOUNDCURVE( CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)),CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1) ) |
| MultiCurve | 多曲线是曲线的集合,可以包括线串、圆弧或复合曲线。 | 1个线串(LineString)和一个圆弧(CircularString)组成的多曲线:MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4)) |
| MultiSurface | 多曲面是曲面的集合,可以是多边形(Polygon)或曲线多边形(CurvePolygon)。 | 1个曲线多边形(CurvePolygon)和2个不同大小的多边形(Polygon)组成的多曲面: MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING( 0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10), (11 11, 11.5 11, 11 11.5, 11 11))) |
使用说明
- 几何子类型的WKT格式,类型名称只支持大写。
- 几何子类型可以使用
GeometryType和ST_GeometryType查询。 - 几何维度:几何子类型的属性。
- 几何图形在二维笛卡尔平面上对形状进行建模,每个坐标都有X和Y坐标轴值。
- 点类型的维度为0,线性类型的维度为1,多边形类型的维度为2,集合具有最大元素维度的维度。
- 坐标可包含Z或M纵坐标值。Z值通常用于表示高程。M值表示测量值,可表示时间或距离。
- 如果具有Z或M纵坐标,则坐标尺寸为3D;如果同时具有Z和M,则坐标尺寸为4D。
- 几何值可以为空。空值不包含顶点(对于原子几何类型)或不包含元素(对于集合)。
- SRID详细信息请参见空间参考系统章节和
ST_SRID。 - 不推荐将GEOMETRY类型作为主键、分区建、约束使用。
- GEOMETRY类型支持UNION ALL操作,但不支持UNION操作。
地理类型与几何类型区别
- 地理类型的函数少于几何类型。
- 地理类型支持存储经度/纬度坐标,基于球面模型,计算更精确,更占用CPU资源。
- 根据工作范围选择数据类型,以确保性能和功能的最大化。
- 对于局限于较小的地理区域数据集,如州、县或直辖市,推荐使用投影和几何类型。
- 对于覆盖全球或广大大陆的数据集,推荐使用地理数据类型。
示例
创建空间表
创建了一个带有几何列的表,该列存储具有CGCS2000椭球地理坐标系(SRID 4490)的2D线串:
sql
CREATE TABLE roads (
id INTEGER IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(64),
geom GEOMETRY(LINESTRING,4490)
);创建一个表,其中包含具有默认SRID的任何类型的几何图形:
sql
CREATE TABLE geoms(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY );为2D点创建具有SRID默认值的表:
sql
CREATE TABLE pts(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY(POINT) );创建一个包含3D(XYZ)点和显式SRID 4490的表:
sql
CREATE TABLE pts(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY(POINTZ,4490) );使用默认SRID创建具有4D(XYZM)LINESTRING几何图形的表:
sql
CREATE TABLE lines(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY(LINESTRINGZM) );使用SRID 3857(Web 墨卡托)创建包含2D POLYGON几何图形的表:
sql
CREATE TABLE polys(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY(POLYGON,3857) );一个表可以有多个几何列。可以在创建表时指定,或使用ALTER TABLE语句添加。
下面的示例演示如何添加列以存储3D LineStrings:
sql
ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);加载空间数据
空间数据可以转换为文本表示(如WKT或WKB),可以使用SQL INSERT语句将数据插入到空间库。
SQL加载文件:
sql
INSERT INTO roads ( NAME,geom) VALUES
('Jeff Rd','LINESTRING(191232 243118,191108 243242)'),
('Geordie Rd','LINESTRING(189141 244158,189265 244817)'),
('Paul St','LINESTRING(192783 228138,192612 229814)'),
('Graeme Ave','LINESTRING(189412 252431,189631 259122)'),
('Phil Tce','LINESTRING(190131 224148,190871 228134)'),
('Dave Cres','LINESTRING(198231 263418,198213 268322)');提取空间数据
使用SQL SELECT查询来获取要提取的数据集:
sql
SQL> SELECT id, name, TO_CHAR(ST_AsText(geom)) AS geom FROM roads;
+----+------------+-----------------------------------------+
| ID | NAME | GEOM |
+----+------------+-----------------------------------------+
| 1 | Jeff Rd | LINESTRING(191232 243118,191108 243242) |
| 2 | Geordie Rd | LINESTRING(189141 244158,189265 244817) |
| 3 | Paul St | LINESTRING(192783 228138,192612 229814) |
| 4 | Graeme Ave | LINESTRING(189412 252431,189631 259122) |
| 5 | Phil Tce | LINESTRING(190131 224148,190871 228134) |
| 6 | Dave Cres | LINESTRING(198231 263418,198213 268322) |
+----+------------+-----------------------------------------+