13 KiB
title | date | author | tags | categories | ||||
---|---|---|---|---|---|---|---|---|
SFS-简单要素标准 | 2020-02-24 | ac |
|
|
SFS是对现实世界中的地理实体抽象描述,包括通用模型和数据库存储上的实现。
简单要素标准
简单要素标准包含两部分:Common architecture
、SQL option
- Common architecture(通用模型):是对简单要素的描述,包括几何对象模型、
WKT
描述的几何对象、WKB
描述的几何对象、WKT
描述的空间参考; SQL option
:是上一部分在SQL
中的实现,包括SQL
预定义的Schema、SQL
几何类型、SQL
空间操作。
几何对象模型
上图是SFS
中几何对象的关系结构,Geometry作为抽象的根类,派生出点Point、曲线Curve、表面Surface和几何要素的集合类GeometryCollection
。主要定义了点、线、面和多点、多线、多面。
另外,SFS也定义了描述几何对象的的属性和方法。
WKT描述的几何对象
Well-known text (WKT)是一种文本标记语言,用于表示地图上的几何对象、地理空间坐标系。该格式由开放地理空间联盟(OGC)制定。
几何对象WKT文本例子:
几何类型 | WKT | 说明 |
---|---|---|
Point | Point(6 10) | 点 |
LineString | LineString(3 4,10 50,20 25) | 有3个节点的线 |
Polygon | Polygon((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2)) | 有内环和外环的多边形 |
MultiPoint | MultiPoint( (10 10), (4 10) ) |
多点 |
MultiLineString | MultiLineString( (3 4,10 50,20 25), (-5 -8,-10 -8,-15 -4) ) |
多线 |
MultiPolygon | MultiPolygon( ((10 10, 10 20, 20 20, 20 15, 10 10)), ((60 60, 70 70, 80 60, 60 60 )) ) |
多面 |
GeometryCollection | GeometryCollection( POINT(10 10), POINT(30,30), LINESTRING(4 6,7 10) ) |
几何集合 |
WKT描述的空间参考
地理坐标系(GCS)的WKT格式,以WGS1984的地理坐标系为例:
GEOGCS[
'名称',
'大地基准面椭球体'['名称','参考椭球'['名称','长半轴a','扁率α']],
'起始经线'['名称',0.0],
'单位'['Degree','单位的转换因子'],
'制定的权威机构'['']
]
GEOGCS[
"WGS 84",
DATUM["WGS_1984",SPHEROID["WGS 84", 6378137, 298.257223563]],
PRIMEM["Greenwich", 0.0],
UNIT["Degree", 0.0174532925199433],
AUTHORITY["EPSG", "4326"]
]
π/180 = 0.0174532925199433
投影坐标系(PCS)的WTK格式,以WGS84 Web Mercator(Auxiliary Sphere)坐标系为例:
PROJCS
[
"WGS_1984_Web_Mercator_Auxiliary_Sphere",
GEOGCS
[
"GCS_WGS_1984",
DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]
],
PROJECTION["Mercator_Auxiliary_Sphere"],
PARAMETER["False_Easting",0.0],
PARAMETER["False_Northing",0.0],
PARAMETER["Central_Meridian",0.0],
PARAMETER["Standard_Parallel_1",0.0],
PARAMETER["Auxiliary_Sphere_Type",0.0],
UNIT["Meter",1.0],
AUTHORITY["EPSG",3857]
]
投影坐标系中必然包含一个地理坐标系,还有投影方法和一些参数。
WKB描述的几何对象
WKB
(well-known binary)是WKT
的二进制形式,通过序列化的字节对象来描述几何对象,常用于数据传输与数据库存储(PostgreSQL
)。
WKB 中主要涉及两种数值类型:
- 一种是 uint32,占 4 个字节,用以存储节点数、几何对象类型等信息;
- 另一种是 double,占 8 个字节,用以存储节点坐标值。
其中的几何对象类型对应的整数可以参考下表:
另外,WKB
在第一位还存储了一个字节用来标识字节序(0=Big-Indian,1=Little-Indian)。
现代的计算机系统一般采用字节(Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节顺序(Byte Order, orEndianness)。常见的字节顺序有两种:
- Big Endian(High-byte first):低地址存放最高有效位(MSB),既高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
- Little Endian(Low-byte first):低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
对于一个点(不带M值的二位点)来说,WKB
描述应该类似如下结构,总占21个字节:
对于有两个节点的线来说,WKB
描述应该包含41个字节:
SQL Option
SQL 预定义schema
Schema,即XML Schema,XSD (XML Schema Definition)是W3C于2001年5月发布的推荐标准,指出以何种形式描述XML文档的元素的规范。schema是元数据的一个抽象集合,包含一套schema component: 主要是元素与属性的声明、复杂与简单数据类型的定义。
数据库中的schema为一组数据结构的逻辑集合,称之为schema对象,包含索引(index)、视图(view)、表(table)、分区(partitions)、序列(sequences)、维度(dimensions)、同义词(synonyms)等。不同的数据库厂商对schema的定义略有不同。
在空间数据库中,需要一些表来存储和管理几何字段、空间参考等信息,因此 OGC 首先制定了在数据库中需要的 Schema 对象。
从上图可以看出,要素表(Feature Table
)中用一个几何类型的字段(Geomentry Column
)记录空间几何信息。通过定义几何字段列的信息表(GEOMETRY_COLUMNS
)和一张记录空间参考信息表(SPATIAL_REF_SYS
)指定几何字段以何种形式(结构)存储几何信息。从支持OCG
标准空间数据库中可以找到这两张表,如安装了空间扩展组件(PostGIS
)的PostgreSQL
。但不同的数据库或地信厂商提供的空间扩展,对这两张表的命名也会有所不同:
-
PostGIS
:GEOMETRY_COLUMNS
和SPATIAL_REF_SYS
-
Oracle Spatial
:OGIS_GEOMETRY_COLUMNS
和OGIS_SPATIAL_REFERENCE_SYSTEMS
-
ArcSDE for Oracle
:GEOMETRY_COLUMNS
和SPATIAL_REFERENCES
SQL 几何对象存储
从预定义的schema中可以知道,在OGC
标准中几何信息存储在一个Geometry
表中,该表有两种存储形式:常规的字段和二进制的WKB
。通过GID
字段关联Feature
表的几何字段。但实际上,OGC
标准还规定了要素表(Feature
)中的几何字段(Geometry
)可以使用自定义类型(SQL UDT
),这样就不需要额外的Geometry
表来存储几何信息,而是直接保存到要素表(Feature
)的几何字段中,如:
ArcGIS
中的st_shape_lib
库中的ST_Geometry
类型PostGIS
中的Geometry
和ST_Geometry
类型。
自定义类型可以采用SFS
标准定义的几何类型,也可以采用SQL/MM
标准。
SQL/MM
趣闻
- 1991~1992年--IEEE的赞助--文本搜索引擎厂商发表
SFQL
(结构化查询语言Structured Full-text Query Language)的语言规范- 遭到了其他数据处理机构的批评,因为
SFQL
“劫持”了许多其它机构已经通用的关键字(如:CONTAINS)- 此时一部分数据库厂商已经申明他们支持“对象关系模型”。基于这些厂商的建议,东京研讨会提出了第二个标准的概念
- 结构化数据:是第一类SQL类,通过普通的SQL99版本进行存取。
- 增加定义其他的SQL对象“类库”,每个类库对应一类复杂数据
- 建议的标准很快以SQL/MM(这里的MM表示多媒体)为人所共知
Simple feature access/SQL(SFA-SQL) | ISO/IEC (SQL/MM-Spatial) |
---|---|
Point | ST_Point |
Curve | ST_Curve |
LineString | ST_Linestring |
ST_Circularstring | |
Surface | ST_Surface |
ST_CurvePolygon | |
Polygon | ST_Polygon |
PolyhedralSurface | ST_PolyhedralSurface |
Multipoint | ST_MultiPoint |
Multicurve | ST_MultiCurve |
Multilinestring | ST_MultiLineString |
Multisurface | ST_MultiSurface |
Multipolygon | ST_MultiPolygon |
GeomCollection | ST_Collection |
ST_CompoundCurve |
用户即可以遵循SFS的定义,使用类似“Geometry”、“Point”的命名,也可以遵循SQL/MM定义的采用“ST_”作为前缀进行命名,如:“ST_Geometry”、“ST_Point”等
SQL
SQL空间操作
在SQL/MM
中定义的空间操作:
空间操作函数 | 说明 |
---|---|
ST_WKTToSQL | 从 WKT 构造几何对象 |
ST_WKBToSQL | 从 WKB 构造几何对象 |
ST_AsText | 获取 WKT 描述 |
ST_AsBinary | 获取 WKB 描述 |
ST_Dimension | 获取维数 |
ST_GeometryType | 获取几何类型 |
ST_SRID | 获取空间参考 ID |
ST_IsEmpty | 是否为空 |
ST_IsSimple | 是否是简单对象 |
ST_Boundary | 获取边界 |
ST_Envelope | 获取矩形范围 |
此外还有空间拓扑关系、几何运算相关的操作函数,具体内容可查看ArcGIS和PostGIS中对SQL/MM 标准的实现:
- ArcGIS:与 ST_Geometry 配合使用的 SQL 函数
- PostGIS:PostGIS Special Functions Index
SFSQL与SQL/MM的对比
- SFSQL与SQL/MM的Geometry总体框架近似
- SFSQL与SQL/MM有相互融合的趋势
- SFSQL对部分类和函数按SQL/MM的形式进行封装
- SQL/MM提供了亮哥符合SFSQL的短名字视图
- SFSQL与SQL/MM优势互补,总体而言SQL/MM的覆盖面更广
SFSQL | SQL/MM | |
---|---|---|
3D数据类型 | √ | |
参数化数据类型 | √ | |
文本标注 | √ | |
Geometry存储方式:Numric | √ | |
Geometry存储方式:Binary | √ | |
Geometry存储方式:UDT | √ | √ |
拓扑结构 | √ | |
网络拓扑 | √ | |
图/影像存储 | √ | |
图/影像的检索 | √ | |
对GML的支持 | √ |
参考文章
[1] SFSQL和SQLMM标准 http://www.doc88.com/p-734475445183.html
[2] Simple Feature Access - Part 2: SQL Option https://www.ogc.org/standards/sfs