或许是 WebGIS 下一代的数据规范 - OGC API 系列
1. 前言
1.1. 经典的 OGC 标准回顾
直至今日,GeoServer 仍在发挥作用,WebGIS 的几大服务标准仍在应用:
WMS
,网络地图服务WMTS
,网络瓦片地图服务WFS
,网络要素服务
这三个应该是耳熟能详的了,还有其它的就不列举了,本篇的重点并不是介绍这些现行标准,上面三个标准的速查可参考我往期的文章。
1.2. 共同特点与时代变化
现有标准,有一些共同的特点。比如,请求行为较为依赖 XML —— 原因之于“大前端”还未盛行的年代,后端常用 XML,前端就只能用浏览器 API 解析返还的 XML。譬如,WFS 的修改要素的事务操作(Transaction,一般称之为 WFS-T),那写在请求体中的 XML 使用 JavaScript 来编写,就显得比较枯燥冗长。
而现在,前后端职能分离,前端发展也有目共睹,地图开发中,前端大多数时候更希望发送、得到的是 JS 引擎更容易解析的 JSON,而不是 XML。
今天要介绍的这一套 OGC API,是 OGC 组织在 2 年前就一直在努力、下功夫的,他们把原来的 OGC 官网域名改了,LOGO 换了,甚至为这套 API 开辟了一个新的网站。
1.3. 免责声明
本文书写于 2022 年 7 月,这套 API 仍未完全落地,本文仅作为引导作用,并不能作为指导作用,一切以读者所在时间点的情况为准,我介绍这套 API 仅仅是为了这个风气浮躁的行业带来点消息,毕竟 OGC 官网这么大动作,国内竟然找不到一篇文章,哪怕是简单介绍的都好啊。
本文仅保留著作权、解释权,欢迎具名转载。
2. 什么是 OGC API
2.1. OGC API 是一个开放、动态的规范族
OGC API 目前有 13 个子类(含一个公共定义),而在去年的时候只有 9 个。只要符合 OGC API 公共定义,就可以为行业中新生的数据需求制定网络请求接口规范。
本文介绍的 API 未来有可能会消失其中某几个,也有可能会新增,一切以你看到的正式发布的版本为准。
2.2. OGC API 特点
最显著的特点可归纳为:
接口风格是 REST
数据传递默认为 JSON 格式
2.3. 众 API 简述(2022年7月)
首先,给个官网:OGC API
OGC API 是迎着近十年来前端技术飞速发展的趋势应运而生的,它与上述几个旧标准最大的区别是:
- 使用 REST 风格
- 交换数据默认改用 JSON
这一系列的 API 标准还对原来的几大服务标准进行了升级改造,以及对其它领域的需求进行了补充。
例如,WFS 3.0
标准被直接改作 OGC Feature API
,WMS
则升级为 OGC Map API
,见下表:
新版 API | 现行 OGC Web 服务标准 | 状态 |
---|---|---|
OGC Features API | WFS | 已发布 Part 1/2,一共 4 Part |
OGC Maps API | WMS | 起草中,可预览 |
OGC Tiles API | WMTS | 起草中,可预览 |
OGC Processes API | WPS | 已发布 1.0,一共 1 Part |
OGC Coverages API | WCS | 起草中,可预览 |
可能有的朋友不太熟悉后面两个,Processes API
即任务 API,最大的特点就是允许你向接口发起一个数据处理任务,旧标准是 WPS,发布这个 API 是对接口层面做了统一;Coverages API
(也即 WCS)可能面向的是遥感应用,这个 API 更感兴趣的是栅格数据的波段信息、栅格像元等数据。
除了升级改造,还补充、完善了其它的标准:
新增的 API | 用途 | 状态 |
---|---|---|
OGC Common API | OGC API 的公共定义 | Part 1/2 起草中,可预览 |
OGC EDR API | 环境数据,与 Features API 很相似 | 已发布 1.0,一共 1 Part |
OGC Records API | 查询数据的数据,即元数据,一般与 Features API 一起搭配用 | Part 1 起草中,可预览 |
OGC Styles API | 可用于需要渲染的数据的样式接口 | Part 1 起草中,可预览 |
OGC DGGS API | 访问格网数据的一种接口 | 起草中,可预览 |
OGC Routes API | 路由数据接口,最直接的应用即网络分析 | Part 1 起草中,可预览 |
OGC Joins API | 提供为空间数据进行连接操作的接口 | 起草中,可预览 |
OGC MovingFeatures API | 时态相关的要素数据接口,Features API 的扩展版 | 起草中,可预览 |
OGC 3DGeoVolumes API | 三维体块数据接口,有望统一 3DTiles 和 I3S 等三维数据格式的访问 | 起草中,可预览 |
这几个 API 比前面 5 个要陌生,所以额外多解释一番:
OGC EDR API
- 环境数据,它查询的结果似乎并不是“空间要素”,而是各种结合了空间信息的环境数据,例如风速、空气温度、湿度、体感温度等;允许使用坐标、半径、范围、定位名称等参数查询环境数据,气象领域、海洋领域的应用可能较广,应该和 NetCDF 等多维数据格式的关系较为紧密OGC Records API
- 在设计上与 Feature API 略有重合,URL 在使用时会有重合,但在 查询过滤的侧重点可能有不同,Feature API 的查询专注于 空间分析型过滤,而这个 API 更专注于描述性质的属性过滤,也就是 非空间分析型过滤,例如title
、externalIds
等;由于 Features API 的空间过滤章节规范还未发布,且 Records API 的规范也未正式发布、能体验的例子也较少,所以一切以正式为准OGC DGGS API
- DGGS,即Discrete Global Grid Systems
,它使用比四叉树更一般化的网格划分地球球面,有一些研究在这种特殊的网格几何形状上进行,它一般和 Features API、Processes API 一起使用,毕竟网格也是一种特殊的要素;只不过在 API 的设计上更加倾向于这些“网格”,静等实现OGC Routes API
- 类似 pgRouting 的一种规范,在数据接口层面实现了统一,你可以拿来查询路由(理解为有去由、有方向的路径),返回的是矢量要素,也可以调用与之配套的 Processes API 进行网络分析(最短路径等),这个 API 比较硬核,通常是服务端的实现比较重OGC Joins API
- 空间连接,使得已有的要素数据与新提供的数据能产生连接关系,熟悉后端数据库、ArcGIS 属性表连接等相关操作的应该能大致猜出来这个 API 是干什么的,是一种偏行为型的 API,与 Features API 一起使用,不过当前这个 API 的进程比较缓慢,还没有具体的实现OGC MovingFeatures API
- 是与时间相关矢量要素 API,与 Features API 一起使用,目前尚未看到实现,我认为这也是一个非常考验后端数据库组织能力的 APIOGC 3DGeoVolumes API
- 目的很简单,将各家的三维数据标准统一到一起,目前还没什么内容,但开了个好头;我认为至少把现有的几个标准能合并在一起就很难以实现了,如果要在 API 层面使得各大 3D 数据规范统一,那将是一个非常漫长的过程;目前,社区案例中以简单的 3DTiles 为多,且只能以 REST 接口访问tileset.json
文件的 JSON 内容;这个 API 的目标很大,希望把 glTF、3DTiles、I3S、CityGML/CityJSON 等一并具备实体数据内容的格式,通过3DGeoVolumes
的概念在空间上聚合在一起,在 API 层面做到统一,而不是重新提出一个数据规范OGC Styles API
- 比较容易理解,规范化了各种样式信息的增删改查接口,这些样式信息可以用于瓦片、矢量要素的渲染;样式类型包括但不限于 SLD、MapboxStyle 等
3. 能用 OGC API 了吗
3.1. 各 API 实现情况(官方统计)
各个 API 在 GitHub 上基本上都是有独立仓库的,每个仓库基本上都记录了当前 API 的软件实现情况,包括服务端软件、前端库、开发库等,我挨个查阅后,将有记录的 API 实现记录文档列举如下:
OGC Maps API 实现列表 暂时未更新,不过 GeoServer 已经实现了部分草案
OGC 3DGeoVolumes API 实现列表 本文发布时只有简单的 3DTiles 静态文件服务,还未看到 I3S
OGC Joins API 实现列表 这个 API 在文章发布时还没有实现
其余尚未找到(也有可能是 OGC 还未公开其仓库)。
请注意,这些链接由于 OGC API 仍然在制定过程中,不保证有效性,请自行访问对应的 GitHub 仓库。
3.2. 前端地图库的实现
介绍几个比较有名的 JavaScript 库实现。
① ArcGIS API for JavaScript
仅在 V4 支持 OGC Feature API,使用 OGCFeatuerLayer
即可。
② OpenLayers6
目前只支持 OGC Tiles API。
- 对于栅格瓦片,使用
ol/source/OGCMapTile
和ol/layer/Tile
实现 - 对于矢量瓦片(MVT格式),使用
ol/source/OGCVectorTile
和ol/layer/VectorTile
实现
但是请注意,目前由于 OGC API 仍然不稳定,所以相关的类仍然没有文档,但是在官方的 Examples 中搜索 OGC 是能看到例子的。
③ LeafletJS
使用扩展支持了 OGC Map API:GitLab - Leaflet.ImageOverlay.OGCAPI
3.3. GeoServer 的实现
请参考 稳定版文档 / 最新版文档,简单的说,GeoServer 在最新的 2.21 版本已经实现了 Tiles、Coverages、DGGS、Features、Images(这项是请求中的 API,官方网站上还没有记录,更能体现 OGC API 是一个开放的规范族)、Styles、Maps 这几项 API。
3.4. 开发库的支持
- TypeScript - haoliangyu/ogcapi-js
- JavaScript - koopjs/provider-ogcapi-features
- Python - geopython/pygeoapi
- C# - sam-is/OgcApi.Net
- Rust - camptocamp/ogcapi
- Golang - WouterVisscher/ogcapi
更多资源请到 GitHub 上搜索。
4. 试用 GeoServer 的 OGC API
目前,仅在 2.18 以上版本看到有 OGC API 的社区扩展包。
https://build.geoserver.org/geoserver/
将对应版本的社区扩展包解压到 WEB-INF/libs/
目录下后(要选择替换),重启 GeoServer 即可在主页右侧看到已经支持的 API
点击你想要进去的 API 的版本号,就可以在界面上看到对应的 API 了。
4.1. 已知 BUG
安装 OGC API 后,GeoServer 的 WMTS 将会失效,原因未知。请勿在生产环境和有重要数据的个人 GeoServer 上实验!!!
4.2. 试用 OGC Maps API
安装好 OGC API 插件后,在你的浏览器直接访问如下类似的 URL(注意你的端口、数据参数等):
http://localhost:4800/geoserver/ogc/maps
/collections/spatial_base:guangxi_cities
/styles/polygon
/map
?transparent=true
&f=image%2Fpng
&layers=spatial_base%3Aguangxi_cities
&styles=polygon
&crs=EPSG%3A4326
&width=768
&height=553
&bbox=104.04052734375%2C20.6048583984375%2C112.47802734375%2C26.6802978515625
返回的是与 WMS 的 GetMap
几乎一样的结果:
除此之外,OGC Map API 也有别的操作,可以到 API 体验页面了解:
https://developer.ogc.org/api/maps/index.html (在 2.21 版本的 GeoServer 上还未集成本地 Swagger 供本地测试,否则访问 http://localhost:4800/geoserver/ogc/maps/api 即可本地测试,其余 API 请读者自行测试)
4.3. 试用 OGC Tiles API
Tiles API 的模板如下:
http://localhost:4800/geoserver/ogc/tiles
/collections/{layerName}
/styles/{style}
/map/tiles
/{tileMatrixSet}/{tileMatrix}/{tileRow}/{tileCol}?f={ImageMIMEType}
所以,发起一张瓦片请求:
http://localhost:4800/geoserver/ogc/tiles
/collections/spatial_base:guangxi_cities
/styles/polygon
/map/tiles
/EPSG:900913/EPSG:900913:7/55/103?f=image/png
得到的瓦片是:
比对 WMTS 的 REST 风格 URL:
http://localhost:4800/geoserver/gwc/service/wmts/rest
/spatial_base:guangxi_cities
/polygon
/EPSG:900913/EPSG:900913:7/55/103?format=image/png
风格相似,升级成本较低。
4.4. 试用 OGC Features API
http://localhost:4800/geoserver/ogc/features
/collections/spatial_base:guangxi_cities
/items
&limit=5
只查单个
http://localhost:4800/geoserver/ogc/features
/collections/spatial_base:guangxi_cities
/items/guangxi_cities.1
或
http://localhost:4800/geoserver/ogc/features
/collections/spatial_base:guangxi_cities
/items/1
查询单个的返回结果:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "guangxi_cities.1",
"geometry": {/* ... */},
"geometry_name": "geom",
"properties": {/* ... */}
}
],
"numberMatched": 1,
"numberReturned": 1,
"timeStamp": "2022-07-18T16:48:12.381Z",
"links": [/* ... */]
}
比对 WFS 的键值对形式获取简直不要太方便,我认为 Features API 是一个非常不错的升级。
至于 Features API 的第三部分:空间过滤,以及第四部分增删改查(对应 WFS 中的 Transaction),还要等草案稳定和各大社区实现。
4.5. 试用 OGC Styles API
你可以直接用 API 请求工具访问你本机上 GeoServer 提供的 Styles API,类似:
http://localhost:4800/geoserver/ogc/styles
/styles
这个双重 styles
可能会让人有点迷惑,即 /styles/styles
,其实后面那个 styles
是 GeoServer 默认的样式集,名字就叫“styles”。这条查询返回的是 GeoServer 上名为“styles”样式集的所有样式。
众所周知,GeoServer 内置的样式很丑,以内置的 polygon
样式为例:
它其实是一个很简单的 SLD 定义:
<?xml version="1.0" encoding="UTF-8"?>
<StyledLayerDescriptor version="1.0.0"
xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
xmlns="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- a Named Layer is the basic building block of an SLD document -->
<NamedLayer>
<Name>default_polygon</Name>
<UserStyle>
<!-- Styles can have names, titles and abstracts -->
<Title>Default Polygon</Title>
<Abstract>A sample style that draws a polygon</Abstract>
<!-- FeatureTypeStyles describe how to render different features -->
<!-- A FeatureTypeStyle for rendering polygons -->
<FeatureTypeStyle>
<Rule>
<Name>rule1</Name>
<Title>Gray Polygon with Black Outline</Title>
<Abstract>A polygon with a gray fill and a 1 pixel black outline</Abstract>
<PolygonSymbolizer>
<Fill>
<CssParameter name="fill">#AAAAAA</CssParameter>
</Fill>
<Stroke>
<CssParameter name="stroke">#000000</CssParameter>
<CssParameter name="stroke-width">1</CssParameter>
</Stroke>
</PolygonSymbolizer>
</Rule>
</FeatureTypeStyle>
</UserStyle>
</NamedLayer>
</StyledLayerDescriptor>
SLD 实际上是一种 XML,是有规范的。上述这份 SLD,你可以这样请求得到:
http://localhost:4800/geoserver/ogc/styles
/styles/polygon
样式 API 其实算是比较简单的一个,包括其增删改查,点到为止。
5. 小结
OGC API
综合看下来,各行各业,方方面面,基本上都有考虑到,而且十分专注地在讨论“地理空间”,即使是来自偏研究领域的 DGGS API
和 EDR API
,仍然认认真真地在写技术规范、参与讨论、实现 OpenAPI 的例子,积极与既有技术合并或直接提供实现的简单案例,而不是国内虚无缥缈的概念。
哀嚎,行业究竟在干什么?沙难聚成塔呀...
其实,对于开发者而言,API
的作用就是请求,OGC API
为开发者或调用者做了约束,大多数地图库并不需要完全支持所有的 OGC API
,譬如 Feature API
就不需要 —— 正如同 WFS 于 CesiumJS/MapboxGL 一样,你需要矢量要素数据,你也知道有个 Features API
的数据源,你就照着规范请求矢量数据就好了。况且,或受制于技术水平,或受制于业务范围,有的接口可能在应用过程中是完全不需要或者实现不了的,比如 Joins API
、Routes API
等,只能等待社区给出封装成果。
我认为客户端可能需要接入的是 Tile API
或者 Map API
,毕竟前端原生支持或扩展支持服务提供出来的地图、瓦片才像是一个地图库。
而像 Routes API
、Joins API
、MovingFeatures API
这几个对后端数据库、算法程序要求比较高的,就需要掂量掂量自己的斤两,看看是等着用别人的成果,还是硬着头皮自己实现了。
不过话说回来,2020 年到现在也才正式公布了寥寥几个 API 的基础部分,等待这套 API 完全发布、落实,我认为靠这行吃饭的朋友,如果没有撬动国内整个行情的力量,还是老老实实用现有成果的好,科研队伍反而更有空跟进了解。
或许是 WebGIS 下一代的数据规范 - OGC API 系列的更多相关文章
- 下一代大数据系统和4S标准
大数据行业发展到今天,它创造的价值和带来的社会效应,大家已经看得很明白,同时很多问题和不足也暴露出来,特别是hadoop能够提供的数据处理能力,现在已经挖掘到极限,但是现在各行业对数据的存储和计算需求 ...
- i3s 一种开源的三维地理数据规范 简单解读
i3s,esri主推到ogc的一种三维开源GIS数据标准. 版权声明:原创.博客园/B站/小专栏/知乎/CSDN @秋意正寒 转载请标注原地址并声明转载: https://www.cnblogs.co ...
- GBT 33200-2016 社会治安综合治理 综治中心建设与管理规范 GBT 31000-2015 社会治安综合治理基础数据规范
阚总发的两个国标的标准文件, 看看里面对于数据和问题的分类等. 我们出统计分析,可以按照标准出各个大类小类的各种指标数据. 结合这几天给潍坊弄的12345的报告, 整理出一个可以结合吴中现有平台数据, ...
- HTTP API响应数据规范整理
概述 本文档为本人对长期开发API接口所整理的经验总结,如有不完善或不合理的地方,望各位多提意见. 文档目的为规范服务器端API接口,便于服务器端与客户端代码重用.服务器端和客户端可根据实际所定义规范 ...
- 3dTiles 数据规范详解[1] 介绍
版权:转载请带原地址.https://www.cnblogs.com/onsummer/p/12799366.html @秋意正寒 Web中的三维 html5和webgl技术使得浏览器三维变成了可能. ...
- 3dTiles 数据规范详解[3] 内嵌在瓦片文件中的两大数据表
转载请声明出处:全网@秋意正寒 零.本篇前言 说实话,我很纠结是先介绍瓦片的二进制数据文件结构,还是先介绍这两个重要的表.思前想后,我决定还是先介绍这两个数据表. 因为这两个表不先给读者灌输,那么介绍 ...
- 3dTiles 数据规范详解[4.1] b3dm瓦片二进制数据文件结构
B3dm,Batched 3D Model,成批量的三维模型的意思. 倾斜摄影数据(例如osgb).BIM数据(如rvt).传统三维模型(如obj.dae.3dMax制作的模型等),均可创建此类瓦片. ...
- 聚合数据全国天气预报api接口
查询天气预报在APP中常用的一个常用功能,聚合数据全国天气预报api接口可以根据根据城市名/id查询天气.根据IP查询天气.据GPS坐标查询天气.查询城市天气三小时预报,并且支持全国不同城市天气预报查 ...
- .Net程序员安卓学习之路3:Post数据给网络API
本例我们实现一次真正的网络交互,将数据POST到API,然后接收服务器的返回值进行处理,同时引入自定义类型和传说中阿里的FastJson. 实现思路如: 1. 在API端接收客户POST的数据还原成对 ...
随机推荐
- Citus 11(分布式 PostgreSQL) 文档贡献与本地运行
Citus 可以使用分片跨多台计算机来水平缩放查询. 其查询引擎会将这些服务器的传入 SQL 查询并行化,加快大型数据集上的响应. 它为需要比其他部署选项更大规模和更高性能的应用程序提供服务:通常,工 ...
- LINUX系统下安装PyCharm和annaconda3并配置
以下是在ubantu18.04版本下的配置教程: Step 1 去PyCharm官网下载Linux版的PyChram安装压缩包 网址:https://www.jetbrains.com/zh-cn/p ...
- 不再空谈AI,从打造一台智能无人机开始
对于大多数无人机爱好者来说,能自己从头开始组装一台无人机,之后加入AI算法,能够航拍,可以目标跟踪,是心中的梦想. 并且,亲自从零开始完成复杂系统,这是掌握核心技术的必经之路. 开课吧特邀北京航空航天 ...
- python牛顿法求一元多次函数极值
现在用牛顿法来实现一元函数求极值问题 首先给出这样一个问题,如果有这么一个函数$f(x) = x^6+x$,那么如何求这个函数的极值点 先在jupyter上简单画个图形 %matplotlib inl ...
- 循环中的scanf处理了换行符怎么破
这种情况一般在循环中要求输入一个字符时容易出现问题. 问题在于缓冲区,缓冲区中存留了换行符,所以... 运行下面代码: int main(void){ char a=0; while(1){ scan ...
- 详解CVE-2022-0847 DirtyPipe漏洞
摘要:本文详细介绍了CVE-2022-0847漏洞形成根因,相应补丁修复方法,通过本文让读者对CVE-2022-0847漏洞有更清晰的了解. 本文分享自华为云社区<CVE-2022-0847 D ...
- 【多线程】线程休眠 Thread.sleep()
线程休眠 Thread.sleep() sleep (时间) 指定当前线程阻塞的毫秒数: sleep存在异常InterruptedException: sleep时间达到后线程进入就绪状态: slee ...
- 234. Palindrome Linked List - LeetCode
Question 234. Palindrome Linked List Solution 题目大意:给一个链表,判断是该链表中的元素组成的串是否回文 思路:遍历链表添加到一个list中,再遍历lis ...
- 第30章 LeetCode 72 编辑距离
每日一句 A flower cannot blossom without sunshine, and man cannot live without love. 花没有阳光就不能盛开,人没有爱就不能生 ...
- Hadoop: 单词计数(Word Count)的MapReduce实现
1.Map与Reduce过程 1.1 Map过程 首先,Hadoop会把输入数据划分成等长的输入分片(input split) 或分片发送到MapReduce.Hadoop为每个分片创建一个map任务 ...