简单要素模型 SFA

本文档主要参考了原文:简单要素模型 ,建议直接阅读原链接,这里仅作简单总结。

概述

OGC 的 SFA(简单要素访问)标准第一部分定义了一个简单的地理空间数据模型和操作接口,主要用于描述和操作二维几何对象。其核心是定义了几何对象的类型(如点、线、面等)以及它们之间的空间关系(比如判断是否相交、是否包含、计算距离等)。

SFA 标准第一部分主要包括以下内容:

  • 几何对象类型:定义了基本的几何类型,例如点(Point)、线(LineString)、多边形(Polygon),以及它们的集合形式(如MultiPoint、MultiLineString、MultiPolygon)。

  • 空间参考系统:支持将几何对象与特定的空间参考系统(SRS)关联,确保几何数据具有明确的地理坐标信息。

  • 空间操作:提供了一组空间操作函数,用于计算几何对象的面积、长度,进行缓冲区分析,以及判断空间关系(如相交、包含、重叠等)。

  • 数据格式:定义了几何对象的文本和二进制表示形式。常用的文本格式是 WKT(熟知文本),二进制格式是 WKB(熟知二进制)。

SFA 标准的优点是简单易用,能满足大多数GIS应用的需求。它为不同系统之间的几何数据交换提供了统一的标准,大大增强了数据的互操作性。

几何对象模型

几何对象模型

SFA 定义的几何对象模型如上图所示,它是一个层次化的结构,用于表示二维空间中的各种几何图形。这个模型以几何类型为基础,能够描述从简单到复杂的几何对象。

所有几何对象的基类都是 Geometry,它是一个抽象类,具体的几何类型都继承自它。模型主要包括以下几种类型:

  1. 点(Point):表示空间中的一个单一位置,由一对坐标 (x, y) 定义。它是最简单的几何类型。

  2. 线(LineString):由一系列有序的点连接而成,表示一条线。它可以是直线或折线,至少需要两个点来定义。

  3. 多边形(Polygon):由一个外部边界和零个或多个内部边界(孔洞)组成。外部边界和内部边界都是闭合的线(LineString),且内部边界必须完全位于外部边界之内。

  4. 多点(MultiPoint):多个点的集合,这些点之间没有连接关系。

  5. 多线(MultiLineString):多条线的集合,每条线是独立的。

  6. 多面(MultiPolygon):多个多边形的集合,每个多边形是独立的。

  7. 几何集合(GeometryCollection):可以包含任意类型几何对象(点、线、面等)的混合集合。

这个模型还定义了空间参考系统(SRS),用于将几何对象与地理坐标系关联起来,确保数据具有明确的空间位置。同时,模型支持几何对象的文本(WKT)和二进制(WKB)表示,便于数据的存储和交换。

这种层次化的模型既简单又灵活,能够满足大多数二维空间数据的表示需求,也为空间分析和操作打下了基础。

几何对象操作部分定义了一系列用于处理和分析几何对象的接口,主要可以分为以下几类:

  1. 空间关系判断:提供判断两个几何对象之间空间关系的函数。例如: * Equals :判断两个几何对象是否相等。 * Disjoint :判断是否完全不相交。 * Intersects :判断是否相交。 * Touches :判断是否接触。 * Crosses :判断是否交叉。 * Within :判断一个是否在另一个内部。 * Contains :判断一个是否包含另一个。 * Overlaps :判断是否部分重叠。

  2. 空间分析操作:用于计算几何对象的属性或生成新的几何对象。例如: * Distance :计算两个几何对象之间的最短距离。 * Buffer :生成几何对象周围指定距离的缓冲区。 * ConvexHull :生成几何对象的凸包。 * Intersection :计算两个几何对象的交集。 * Union :计算并集。 * Difference :计算差集。 * SymDifference :计算对称差集。

  3. 几何属性计算:提供计算几何对象基本属性的函数。例如: * Area :计算面积(适用于面)。 * Length :计算长度(适用于线)。 * Centroid :计算几何中心。

  4. 几何对象操作:包括对几何对象进行修改或转换的函数。例如: * Simplify :简化几何形状。 * Boundary :获取几何对象的边界。 * Envelope :获取几何对象的最小外接矩形。

这些标准化的接口为GIS和空间数据库等应用中的空间数据分析与处理提供了有力支持。

注意

需要注意的是,SFA标准本身没有定义曲线(如圆弧)类型,但很多GIS软件都对其进行了扩展支持。

WKT 描述的几何对象

WKT(熟知文本)是一种用文本字符串描述几何对象的格式,非常直观易读。

WKT 几何对象描述

几何类型, WKT 格式示例

点 (Point)

POINT (30 10)

点Z (PointZ)

POINT Z (10 20 30)

点ZM (PointZM)

POINT ZM (10 20 30 40)

线 (LineString)

LINESTRING (30 10, 10 30, 40 40)

多边形 (Polygon)

POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))

多点 (MultiPoint)

MULTIPOINT ((10 40), (40 30), (20 20), (30 10))

多线 (MultiLineString)

MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10))

多面 (MultiPolygon)

MULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)), ((15 5, 40 10, 10 20, 5 10, 15 5)))

几何集合 (GeometryCollection)

GEOMETRYCOLLECTION (POINT (40 10), LINESTRING (10 10, 20 20, 10 40))

多面体表面 (PolyhedralSurface)

POLYHEDRALSURFACE Z (((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)))

三角不规则网络 (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)))

WKB 描述的几何对象

WKB(熟知二进制)是一种用于描述几何对象的二进制格式,适合高效存储和传输。以下是各种几何类型在WKB中的基本结构说明。

WKB 几何对象描述

几何类型

WKB 格式说明

点 (Point)

字节顺序(1字节) + 类型标识(4字节,值为1) + X坐标(8字节) + Y坐标(8字节)

点Z (PointZ)

字节顺序(1字节) + 类型标识(4字节,值为1001) + X坐标(8字节) + Y坐标(8字节) + Z坐标(8字节)

点ZM (PointZM)

字节顺序(1字节) + 类型标识(4字节,值为3001) + X坐标(8字节) + Y坐标(8字节) + Z坐标(8字节) + M坐标(8字节)

线 (LineString)

字节顺序(1字节) + 类型标识(4字节,值为2) + 点数(4字节) + 点列表(每个点包含X和Y坐标,各8字节)

多边形 (Polygon)

字节顺序(1字节) + 类型标识(4字节,值为3) + 环数(4字节) + 每个环的点列表(每个点包含X和Y坐标,各8字节)

多点 (MultiPoint)

字节顺序(1字节) + 类型标识(4字节,值为4) + 点数(4字节) + 每个点的WKB表示

多线 (MultiLineString)

字节顺序(1字节) + 类型标识(4字节,值为5) + 线数(4字节) + 每条线的WKB表示

多面 (MultiPolygon)

字节顺序(1字节) + 类型标识(4字节,值为6) + 多边形数(4字节) + 每个多边形的WKB表示

几何集合 (GeometryCollection)

字节顺序(1字节) + 类型标识(4字节,值为7) + 几何对象数(4字节) + 每个几何对象的WKB表示

多面体表面 (PolyhedralSurface)

字节顺序(1字节) + 类型标识(4字节,值为15) + 多边形数(4字节) + 每个多边形的WKB表示

三角不规则网络 (TIN)

字节顺序(1字节) + 类型标识(4字节,值为16) + 三角形数(4字节) + 每个三角形的WKB表示

说明:

  1. 字节顺序:1个字节,表示数据的字节序(0代表大端序,1代表小端序)。

  2. 类型标识:4个字节,用来标识几何对象的类型(如点、线、面等)。

  3. 坐标值:根据几何类型,可能包含X、Y、Z和M坐标,每个坐标值通常占用8字节(双精度浮点数)。

  4. WKB 格式的优势:适合高效存储和网络传输,广泛应用于空间数据库和GIS系统。

WKT 描述的空间参考

在 SFA 标准中,WKT(熟知文本)不仅可以描述几何对象,还可以用来描述空间参考系统(SRS)。

WKT 描述空间参考系统的基本结构

描述地理坐标系的WKT格式如下:

GEOGCS["<地理坐标系名称>",
  DATUM["<基准面名称>",
    SPHEROID["<椭球体名称>", <长半轴>, <扁率>]
  ],
  PRIMEM["<本初子午线>", <经度>],
  UNIT["<单位名称>", <转换因子>],
  AXIS["<轴名称>", <方向>],
  AUTHORITY["<权威机构>", "<代码>"]
]

描述投影坐标系的WKT格式如下:

PROJCS["<投影坐标系名称>",
  GEOGCS["<地理坐标系名称>",
    DATUM["<基准面名称>",
      SPHEROID["<椭球体名称>", <长半轴>, <扁率>]
    ],
    PRIMEM["<本初子午线>", <经度>],
    UNIT["<单位名称>", <转换因子>]
  ],
  PROJECTION["<投影方法名称>"],
  PARAMETER["<参数名称>", <参数值>],
  UNIT["<单位名称>", <转换因子>],
  AXIS["<轴名称>", <方向>],
  AUTHORITY["<权威机构>", "<代码>"]
]

示例 1:地理坐标系(GEOGCS)

以下是一个描述 WGS84 地理坐标系的 WKT 示例:

GEOGCS["WGS 84",
  DATUM["WGS_1984",
    SPHEROID["WGS 84", 6378137, 298.257223563]
  ],
  PRIMEM["Greenwich", 0],
  UNIT["Degree", 0.0174532925199433],
  AUTHORITY["EPSG", "4326"]
]
  • GEOGCS:表示这是一个地理坐标系。

  • DATUM:定义基准面,包含椭球体信息。

  • SPHEROID:定义椭球体的名称、长半轴和扁率。

  • PRIMEM:定义本初子午线(通常是格林尼治)。

  • UNIT:定义坐标的单位(这里是度)。

  • AUTHORITY:定义权威机构和其分配的代码(例如 EPSG:4326)。

示例 2:投影坐标系(PROJCS)

以下是一个描述 UTM 50N 投影坐标系的 WKT 示例:

PROJCS["WGS 84 / UTM zone 50N",
  GEOGCS["WGS 84",
    DATUM["WGS_1984",
      SPHEROID["WGS 84", 6378137, 298.257223563]
    ],
    PRIMEM["Greenwich", 0],
    UNIT["Degree", 0.0174532925199433]
  ],
  PROJECTION["Transverse_Mercator"],
  PARAMETER["Latitude_of_origin", 0],
  PARAMETER["Central_Meridian", 117],
  PARAMETER["Scale_Factor", 0.9996],
  PARAMETER["False_Easting", 500000],
  PARAMETER["False_Northing", 0],
  UNIT["Meter", 1],
  AUTHORITY["EPSG", "32650"]
]
  • PROJCS:表示这是一个投影坐标系。

  • PROJECTION:定义所使用的投影方法(这里是横轴墨卡托)。

  • PARAMETER:定义投影的各种参数(如中央经线、比例因子等)。

  • UNIT:定义投影后坐标的单位(这里是米)。

  • AUTHORITY:定义权威机构和代码(例如 EPSG:32650)。

总结

  • WKT 可以清晰地描述**地理坐标系(GEOGCS)**和**投影坐标系(PROJCS)**。

  • 通过 WKT 能够完整定义基准面、椭球体、投影方法、单位等关键信息。

  • WKT 格式在 GIS 系统和空间数据库中被广泛用于描述和交换空间参考信息。

SQL 预定义 Schema

在 SFA 标准中,SQL 预定义 Schema 定义了几何数据在关系数据库中的标准存储结构和表设计,主要包含两张核心表。

SQL 预定义 Schema 的核心表结构

SQL 预定义 Schema 表结构

表名

字段名

描述

GEOMETRY_COLUMNS

F_TABLE_SCHEMA

表所属的模式(数据库)名称

F_TABLE_NAME

包含几何列的表名称

F_GEOMETRY_COLUMN

几何列的名称

COORD_DIMENSION

几何对象的坐标维度(如 2 表示2D,3 表示3D)

SRID

空间参考系统标识符

TYPE

几何对象的类型(如 POINT LINESTRING 等)

SPATIAL_REF_SYS

SRID

空间参考系统标识符

AUTH_NAME

空间参考系统的权威机构名称(如 “EPSG”)

AUTH_SRID

权威机构定义的空间参考系统标识符

SRTEXT

空间参考系统的 WKT 描述

PROJ4TEXT

空间参考系统的 PROJ.4 格式描述

说明:

  1. GEOMETRY_COLUMNS 表: * 用来记录数据库中所有包含几何列的表的信息。 * 包括表名、几何列名、坐标维度、空间参考(SRID)和几何类型。

  2. SPATIAL_REF_SYS 表: * 用来存储空间参考系统的定义。 * 包括 SRID、权威机构信息、WKT 描述和 PROJ.4 描述。

使用示例:

查询数据库中有哪些几何列:

SELECT F_TABLE_SCHEMA, F_TABLE_NAME, F_GEOMETRY_COLUMN, SRID, TYPE
FROM GEOMETRY_COLUMNS;

查询特定空间参考系统(如 EPSG:4326)的详细信息:

SELECT SRID, AUTH_NAME, AUTH_SRID, SRTEXT
FROM SPATIAL_REF_SYS
WHERE SRID = 4326;

总结

  • SQL 预定义 Schema 提供了一种标准化的方式,在关系数据库中存储和管理几何数据及其空间参考。

  • GEOMETRY_COLUMNS 表充当了数据库空间列的“目录”。

  • SPATIAL_REF_SYS 表是空间参考系统的“字典”。

  • 这套表结构被许多支持空间数据的数据库系统(如 PostGIS、MySQL Spatial 等)采用或借鉴。

SQL 几何对象存储

在 OGC 标准中,几何信息可以存储在一个单独的 Geometry 表中,这个表可以通过常规字段或 WKB 二进制格式存储几何对象。Geometry 表通过一个唯一标识符(GID)字段与业务表(Feature 表)的几何字段关联。

实际上,OGC 标准还提供了另一种更常用的方式:将几何信息直接存储在业务表的字段中,并使用 SQL UDT(用户自定义类型)来定义这个字段的类型。现在大多数空间数据库都采用这种方式,比如 PostGIS 中的 geometry 类型、ArcSDE 中的 ST_Geometry 类型等。

SQL 几何对象存储的核心表结构(单独表方式示例)

SQL 几何对象存储表结构(示例)

表名

字段名

描述

GEOMETRY_TABLE

ID

几何对象的唯一标识符

GEOM

几何对象数据(可以是 WKB 或特定类型的值)

SRID

空间参考系统标识符

自定义类型可以采用 SFA 标准中定义的几何类型,也可以采用 SQL/MM 标准中定义的类型。例如 PostGIS 就同时支持这两种标准。下图展示了两种标准中几何类型的对应关系:

SQL/MM 是什么?

它是 ISO《SQL Multimedia and Application Packages》标准的一部分,其中 Part 3: Spatial 专门定义了与空间数据相关的内容。

SFA 和 SQL/MM 类型对应关系

SFA 和 SQL/MM 类型对应关系

SFA 类型

SQL/MM 类型

SFA 描述

SQL/MM 描述

Point

ST_Point

点几何类型

点几何类型

LineString

ST_LineString

线几何类型

线几何类型

Polygon

ST_Polygon

多边形几何类型

多边形几何类型

MultiPoint

ST_MultiPoint

多点几何类型

多点几何类型

MultiLineString

ST_MultiLineString

多线几何类型

多线几何类型

MultiPolygon

ST_MultiPolygon

多面几何类型

多面几何类型

GeometryCollection

ST_GeometryCollection

几何集合类型

几何集合类型

ST_CircularString

圆弧几何类型(SQL/MM扩展)

ST_CompoundCurve

复合曲线几何类型(SQL/MM扩展)

ST_CurvePolygon

曲线多边形几何类型(SQL/MM扩展)

ST_MultiCurve

多曲线几何类型(SQL/MM扩展)

ST_MultiSurface

多曲面几何类型(SQL/MM扩展)

ST_PolyhedralSurface

多面体表面几何类型(SQL/MM扩展)

ST_TIN

三角不规则网络几何类型(SQL/MM扩展)

  • SFA 和 SQL/MM 在基本的几何对象类型(点、线、面等)上是完全兼容的。

  • SQL/MM 标准扩展了 SFA,支持了更复杂的几何对象(如曲线、曲面),适用于更高级的空间分析与建模。

  • 这些类型被 PostGIS、Oracle Spatial 等主流空间数据库广泛支持。

SQL 空间操作

SFA 标准定义了一套用于对几何对象进行空间分析和操作的SQL函数。

SQL 空间操作概览

SQL 空间操作概览

操作类型

函数名称

描述

空间关系

ST_Equals

判断两个几何对象是否相等

ST_Disjoint

判断两个几何对象是否完全不相交

ST_Intersects

判断两个几何对象是否相交(接触也算)

ST_Touches

判断两个几何对象是否接触

ST_Crosses

判断两个几何对象是否交叉(例如线穿过面)

ST_Within

判断几何对象A是否完全在几何对象B内部

ST_Contains

判断几何对象A是否完全包含几何对象B

ST_Overlaps

判断两个几何对象是否部分重叠

空间分析

ST_Distance

计算两个几何对象之间的最短距离

ST_Buffer

生成几何对象周围指定距离的缓冲区

ST_ConvexHull

生成几何对象的凸包

ST_Intersection

计算两个几何对象相交的部分

ST_Union

计算两个几何对象的合并结果

ST_Difference

计算几何对象A减去与几何对象B相交的部分

ST_SymDifference

计算两个几何对象不相交的部分(对称差)

几何属性

ST_Area

计算几何对象的面积(适用于面和体)

ST_Length

计算几何对象的长度(适用于线和曲线)

ST_Centroid

计算几何对象的质心(中心点)

不同类型几何对象的支持操作

下面列出了一些特定几何类型常用的操作函数示例。

点(Point)支持的操作

点支持的操作

操作类型

函数名称

描述

空间关系

ST_Equals

判断两个点是否坐标相同

ST_Distance

计算两个点之间的距离

几何属性

ST_X

获取点的 X 坐标

ST_Y

获取点的 Y 坐标

ST_Z

获取点的 Z 坐标(如果存在)

线(LineString)支持的操作

线支持的操作

操作类型

函数名称

描述

空间关系

ST_Intersects

判断线是否与其他几何对象相交

几何属性

ST_Length

计算线的长度

ST_StartPoint

获取线的起点

ST_EndPoint

获取线的终点

ST_NumPoints

获取线包含的点的数量

面(Polygon)支持的操作

面支持的操作

操作类型

函数名称

描述

空间关系

ST_Contains

判断面是否包含其他几何对象

几何属性

ST_Area

计算面的面积

ST_ExteriorRing

获取面的外边界环(LineString)

ST_NumInteriorRings

获取面内部的孔洞(内环)数量

曲线(Curve)支持的操作(SQL/MM扩展)

曲线支持的操作

操作类型

函数名称

描述

空间关系

ST_IsClosed

判断曲线是否首尾相连(闭合)

ST_IsRing

判断曲线是否是一个简单的环(闭合且不自交)

几何属性

ST_CurveToLine

将曲线转换为由线段近似的 LineString

GeometryCollection 支持的操作

GeometryCollection 支持的操作

操作类型

函数名称

描述

空间关系

ST_Equals

判断两个几何集合是否相等

ST_Intersects

判断几何集合是否与其他几何对象相交

几何属性

ST_NumGeometries

获取集合中包含的几何对象数量

ST_GeometryN

获取集合中第 N 个几何对象(N从1开始)

MultiCurve 支持的操作(SQL/MM扩展)

MultiCurve 支持的操作

操作类型

函数名称

描述

空间关系

ST_Equals

判断两个多曲线是否相等

ST_Intersects

判断多曲线是否与其他几何对象相交

几何属性

ST_IsClosed

判断多曲线是否所有成员曲线都闭合

ST_Length

计算多曲线的总长度

ST_NumCurves

获取多曲线中包含的曲线数量

ST_CurveN

获取多曲线中第 N 条曲线

MultiSurface 支持的操作(SQL/MM扩展)

MultiSurface 支持的操作

操作类型

函数名称

描述

空间关系

ST_Equals

判断两个多曲面是否相等

ST_Intersects

判断多曲面是否与其他几何对象相交

几何属性

ST_Area

计算多曲面的总面积

ST_NumSurfaces

获取多曲面中包含的曲面数量

ST_SurfaceN

获取多曲面中第 N 个曲面

总结

  • SQL 空间操作提供了丰富的函数,用于空间关系判断、空间分析和几何属性计算。

  • 不同类型的几何对象支持的操作各有侧重,但基本关系判断(如相交、包含)适用于所有类型。

  • 这些标准化的操作函数是 PostGIS、Oracle Spatial 等空间数据库的核心功能,极大地便利了空间数据处理。


文档总结

SFA(简单要素访问)标准为地理空间数据提供了一个核心、通用的模型和操作接口。它通过定义标准的几何类型(点、线、面等)、空间参考系统描述方法(WKT-SRS)、数据交换格式(WKT/WKB)以及数据库存储和操作规范(SQL Schema/MM),成功地在不同的GIS软件和空间数据库之间架起了桥梁,是实现空间数据互操作性的重要基石。