WMS,WFS,WMTS,TMS互联网地图服务

作为一个地图开发者,当然要对互联网地图服务有一个认识。

首先,要知道有这么一个联盟,叫OGC(Open Geospatial Consortium),这个联盟/组织定义了很多关于互联网地图的规则。

然后,开发者,企业,组织机构依照这个规则进行地理信息系统的开发。

事实上互联网地图的数据源也就那么几个。换句话说,能作为地图数据源的数据格式有限。那让我们先来介绍一下互联网地图的常用数据源,数据格式。

1.一张图片是肯定可以作为地图数据源的。例如一张tiff格式的遥感影像,作为地图当然可以,另外,我们从arcgis中导出一张jpeg,png格式的地图,再通过网络发布出去当然也行。

那么,第一种地图数据源我们暂且可以概括为image(图片)类型的。

2 .矢量形式的,就像在arcgis里我们用编辑工具绘制的那种第五轮廓的多边形。还有一些不随放大程度改变而失真的SVG图形。这些都是矢量类型的。举个例子就是我们从arcgis中

导出一个shapefile,shp文件,把它发布成互联网地图,也是可以的。这种类型我们归纳为vector(矢量)类型

3.不知道各位是否思考过一个问题,就是图形数据在数据库中究竟是如何存储的,或者说,有没有字符文字能够描述一个图形。事实上有的,一个shape在数据库中实际上就是一张表

每一个要素(feature)是表中的一行或者多行。shape的属性数据和普通的二维表一样存储,而几何图形信息被存放在一个叫geomtry的字段里。这个字段能够用文字描述图形形状信息。

做过传统业务的同学可能非常清楚,数据库中的表通常都会被转化为json对象返回前端,例如一条数据:

name sex year id
li male 23 1

转化为json之后是这样的

1
{    "name":"li",    "sex":"male",    "year":"23",    "id":"1"  }

同样的,一个shape再导入数据库之后一般是这样的:

gid shape_leng shape_area geom gname
1 125591.266163 188363928.789 0106000000001000000103000000 保税区

那么他转化为json是这样的:

1
2
{ "type":"Feature", "id":"indexmap_1984.32", "geometry":{"type":"MultiPolygon","coordinates":[[[[122.5924457,39.20893603],[122.5924457,39.20889616],[122.59237779,39.20895737],[122.59235704,39.2090558],[122.59235704,39.20916682],[122.5923879,39.20926604],[122.59240432,39.20930654],[122.59244569,39.20931714],[122.5924814,39.20930969],[122.59257018,39.20929116],[122.59259042,39.20921871],[122.59253881,39.2091195],[122.59246644,39.20902658],[122.59245621,39.20898192],[122.5924457,39.20893603]]]]}, "geometry_name":"geom", "properties": {"gid":1,"gname":"保税区","shape_leng":0E-11,"shape_le_1":110.131221956,"shape_le_2":0.00105811399614,"shape_area":5.85151805058E-8 } }

ok,这个json有些复杂,不同于往常的json,通过对比我们可以发现,这种格式把数据库表里的图形字段geom里面的010600001…….转化成了

“type”:”MultiPolygon”,”coordinates”:[[[[122.5924457,39.20893603]……..这个看起来像是很多个坐标啊,事实上对于多边形来讲,记录的就是每个顶点的坐标值。

于是,我们就给他命名为GeoJSON(当然这名字不是我起的!),GeoJSON是互联网地理数据传输过程中重要的格式,大家必须掌握。

GeoJSON的强大之处在于它可以作为一种数据格式媒介,和其它几种数据格式进行相互转化,就例如上文提到的可以和数据库表格做转化,他也可以直接和shape格式的文件做转化。非常方便。而且它保存的数据是完整的,数据体积也很小。 那我们暂且就把这一类的地理数据源就叫做GeoJSON类型吧。

4.那既然提到了json,可别忘了xml啊,xml可是json 的老大哥啊,最早互联网数据传输的格式就是xml,后来人们觉得这种标记语言比较麻烦,数据量也大,才发明的json。于是地理学会的人们为了照顾一些互联网老年人,也在地理数据方面适配了xml类型的数据,叫做KML,GML,这两种都是用标记语言标记地理数据,如果有朋友喜欢用也是可以的。那么这种类型我们叫做KML,GML类型吧。

综上所述,互联网地图的数据源类型,从大层面上来分就两种,一种是栅格,一种是矢量。栅格数据源一般就是image类型的图片,tiff格式的遥感影像等等。

而矢量数据源的形式多种多样,有GeoJSON,KML,GML,shapefile,svg等等。

在实际的互联网地图应用过程中,人们发现简单的图片和矢量图形不能够满足我们的需求,就比如我想从全世界的地图中找到我的家,如果只是一张图片的话,那这张图片得多大啊!分辨率得多高啊!服务器承受的了么,我打开浏览器得等多长时间能够看到地图?这些真的是实际产生的问题。于是OGC又想到了这样一个解决办法——切片(tile)。

所谓切片,很简单,就是把我们原始的地图切成很多方片,就是拼图里面一格一格的那种图片,我们想看哪就加载哪,不想看就不加载。这样做的话就打打提高了加载效率。加快了浏览速度。并且现在很多地图服务器的切片是有缓存的,能保证下次请求更快捷。

于是,无论是栅格数据也好,矢量数据也好,现在都能够实现这种切片原理了。

对于栅格数据来讲,就是把一张image类型的图片切割成很多张正方形(一般是256x256像素)小图片。根据鼠标位置和滚轮放大级别确定加载哪一张小图片。这个之后我会详细讲解

对于矢量数据来讲,被切割完的数据还是用GeoJSON格式来展现,只不过这时候的GeoJSON里面又多了许多关于切片和级别的描述字段。当然除了GeoJSON之外还有mapbox家提出的.mvt格式

到目前为止,互联网地图的所有的数据源都介绍完了(当然有些不常用的就忽略掉了)

那么,OGC这个组织呢,根据上面讲到过的数据源分别为他们设计了一些服务。

第一种image类型的,图片格式的地图被封装成了叫做WMS的服务。意思是web map service,网络地图服务。这个最简单也最基础,就是把你的数据源想方设法转化成一张和你数据源长得一样的图片。

供用户浏览,用户可以放大缩小这张图片,但是无论怎么放大缩小,它就只是一张图片。

第二种矢量类型的数据源被封装成了WFS服务。意思是 web feature service 网络要素服务。意思是用户所看到的是要素。是矢量图形,而不是一张图片。那么与图片相比要素有什么好处呢?

大致有这么两点:第一,矢量图形不会随着放大程度的改变而失真,图片做不到。第二,是两要素方便与交互和编辑,修改形状等,这一点图片也做不到。

第三种是image进行切片后的服务,叫做WMTS,全称 web map tile service 网络地图切片服务。WMTS比WMS 好的地方就是它能够加快加载速度,提升加载效率。可是它同时也失去了灵活性,你看的每一个区域都是被提前划分好的,限制在固定条带内的。

对于矢量切片,目前OGC没有提供这样的服务。但是像GeoServer等地图服务器提供了矢量切片的扩展,可以用工具对自己的矢量数据进行切片,然后导出GeoJSON格式的数据加载到地图中。

另外,还值得一提的是,还有一个瓦片服务不是OGC提出的,但也被广大用户所使用,那就是TMS服务,tiled map service,瓦片地图服务。他和WMTS的主要区别在于,他的小切片地图是正方形的,而WMTS的切片可以是矩形的。另外就是他们的金字塔横纵坐标是相反的。

转载:几种互联网地图服务背后的解读(WMS,WFS,WMTS,TMS) - 知乎 (zhihu.com)