--- title: SFS-简单要素标准 date: 2020-02-24 author: ac tags: - SFS - GIS基础知识 - OGC categories: - GIS --- > SFS是对现实世界中的地理实体抽象描述,包括通用模型和数据库存储上的实现。 ## 简单要素标准 简单要素标准包含两部分:`Common architecture`、`SQL option` - Common architecture(通用模型):是对简单要素的描述,包括几何对象模型、`WKT`描述的几何对象、`WKB`描述的几何对象、`WKT`描述的空间参考; - `SQL option`:是上一部分在`SQL`中的实现,包括`SQL`预定义的Schema、`SQL`几何类型、`SQL`空间操作。 ### 几何对象模型 ![image-20201013142502054](./images/image-20201013142502054.png)
SFS 中定义的几何对象模型
上图是`SFS`中几何对象的关系结构,Geometry作为抽象的根类,派生出点Point、曲线Curve、表面Surface和几何要素的集合类`GeometryCollection`。主要定义了点、线、面和多点、多线、多面。
![image-20201013152016907](./images/image-20201013152016907.png)
Geometry的操作
另外,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的地理坐标系为例:
```javascript 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)坐标系为例:
```javascript 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 个字节,用以存储节点坐标值。 其中的几何对象类型对应的整数可以参考下表: ![image-20201024135228010](./images/image-20201024135228010.png) 另外,`WKB`在第一位还存储了一个字节用来标识字节序(0=Big-Indian,1=Little-Indian)。 > 现代的计算机系统一般采用**字节**(Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分**字节顺序**(Byte Order, or[Endianness](http://en.wikipedia.org/wiki/Endianness))。常见的字节顺序有两种: > > - **Big Endian**(High-byte first):低地址存放最高有效位(MSB),既高位字节排放在内存的低地址端,低位字节排放在内存的高地址端 > - **Little Endian**(Low-byte first):低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 对于一个点(不带M值的二位点)来说,`WKB`描述应该类似如下结构,总占21个字节: ![image-20201024152157978](./images/image-20201024152157978.png) 对于有两个节点的线来说,`WKB`描述应该包含41个字节: ![image-20201024162309261](./images/image-20201024162309261.png) ### SQL Option ![image-20201120181517949](./images/image-20201120181517949.png) #### SQL 预定义schema > **Schema**,即**XML Schema**,**XSD (XML Schema Definition)**是[W3C](https://baike.baidu.com/item/W3C)于2001年5月发布的推荐标准,指出以何种形式描述XML文档的元素的规范。**schema**是元数据的一个抽象集合,包含一套**schema component**: 主要是元素与属性的声明、复杂与简单数据类型的定义。 数据库中的schema为一组数据结构的逻辑集合,称之为schema对象,包含索引(index)、视图(view)、表(table)、分区(partitions)、序列(sequences)、维度(dimensions)、同义词(synonyms)等。不同的数据库厂商对schema的定义略有不同。 在空间数据库中,需要一些表来存储和管理几何字段、空间参考等信息,因此 OGC 首先制定了在数据库中需要的 Schema 对象。 ![image-20201103142109273](./images/image-20201103142109273.png)
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` ![image-20201103151619376](./images/image-20201103151619376.png) #### 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表示多媒体)为人所共知 ![image-20201120165626763](./images/image-20201120165626763.png)
SQL/MM Geometry模型
| 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和SQL/MM几何类型的对应关系
用户即可以遵循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 函数](https://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/using-sql-with-gdbs/a-quick-tour-of-sql-functions-used-with-st-geometry.htm) - PostGIS:[PostGIS Special Functions Index](http://postgis.net/docs/PostGIS_Special_Functions_Index.html#PostGIS_SQLMM_Functions) **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) `http://www.doc88.com/p-734475445183.html` [2] [Simple Feature Access - Part 2: SQL Option](https://www.ogc.org/standards/sfs) `https://www.ogc.org/standards/sfs`