meface/docs/article/gis/geoserver/sfs.md

268 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: SFS-简单要素标准
date: 2020-02-24
author: ac
tags:
- SFS
- GIS基础知识
- OGC
categories:
- GIS
---
> SFS是对现实世界中的地理实体抽象描述包括通用模型和数据库存储上的实现。
<!-- more -->
## 简单要素标准
简单要素标准包含两部分:`Common architecture`、`SQL option`
- Common architecture通用模型是对简单要素的描述包括几何对象模型、`WKT`描述的几何对象、`WKB`描述的几何对象、`WKT`描述的空间参考;
- `SQL option`:是上一部分在`SQL`中的实现,包括`SQL`预定义的Schema、`SQL`几何类型、`SQL`空间操作。
### 几何对象模型
![image-20201013142502054](./images/image-20201013142502054.png)
<div style="text-align: center">SFS 中定义的几何对象模型</div>
上图是`SFS`中几何对象的关系结构Geometry作为抽象的根类派生出点Point、曲线Curve、表面Surface和几何要素的集合类`GeometryCollection`。主要定义了点、线、面和多点、多线、多面。<br/>
![image-20201013152016907](./images/image-20201013152016907.png)
<div style="text-align: center">Geometry的操作</div>
另外SFS也定义了描述几何对象的的属性和方法。<br/>
### WKT描述的几何对象
Well-known text (WKT)是一种文本标记语言,用于表示地图上的几何对象、地理空间坐标系。该格式由开放地理空间联盟(OGC)制定。<br/>
几何对象WKT文本例子<br/>
| 几何类型 | 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(<br />(10 10),<br />(4 10)<br />) | 多点 |
| MultiLineString | MultiLineString(<br />(3 4,10 50,20 25),<br />(-5 -8,-10 -8,-15 -4)<br/>) | 多线 |
| MultiPolygon | MultiPolygon(<br/>((10 10, 10 20, 20 20, 20 15, 10 10)),<br/>((60 60, 70 70, 80 60, 60 60 ))<br/>) | 多面 |
| **GeometryCollection** | GeometryCollection(<br>POINT(10 10),<br/>POINT(30,30),<br/>LINESTRING(4 6,7 10)<br>) | 几何集合 |
### WKT描述的空间参考
地理坐标系GCS的WKT格式以WGS1984的地理坐标系为例<br/>
```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 MercatorAuxiliary Sphere坐标系为例<br/>
```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-Indian1=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)
<div style="text-align:center">OGC空间数据库中预定义的schema</div>
从上图可以看出,要素表(`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)
<div style='text-align:center'>SQL/MM Geometry模型</div>
| 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 |
<div style='text-align:center'>SFS和SQL/MM几何类型的对应关系</div>
用户即可以遵循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`