乐趣区

关于webgis:OGC-WebGIS-常用服务标准WMSWMTSTMSWFS速查

本文只介绍理论工作中罕用的 WMS、WMTS、WFS、TMS 四种,WCS、WPS 等其它 OGC WebService 类型请自行查阅官网材料。


0. 参数传递形式

  • 键值对
  • RESTful API
  • SOAP

三种形式对于下文列举的服务并不是全都存在的,例如 WMS 就只有第一种。

本文不介绍 SOAP 形式(因为太简单了)。

1. WMS 速查

1.1.0 版本为参考。

1.1. 能力

  • GetCapabilities
  • GetMap
  • GetFeatureInfo

1.2. 获取地图图片举例(GetMap)

以这样一个申请地址为例:

http://localhost:4800/geoserver/spatial_base/wms?<queryString>

queryString 即查问字符串,我把它列成表格:

param value desc
service WMS 服务类型
version 1.1.0 服务版本
request GetMap 办法
layers spatial_base:guangxi_cities 哪个图层
bbox 104.450889587402,20.8992862701416,112.061851501465,26.3855667114258 要多大范畴
width 768 要返回的图像像素宽
height 553 要返回的图像像素高
srs EPSG:4326 用哪个坐标系
styles “” 用什么款式,缺省要给空字符串
format image/png 格局

GeoServer 的 layers 参数,是“工作空间名: 图层名”这样的组合。

那么,它返回的就是一张图:

这是最惯例的应用“键值对”,也就是 queryString 来申请地图的 WMS 用法。

1.3. 在 CesiumJS 和 OpenLayers6 中应用 GeoServer WMS

在 CesiumJS 中:

new Cesium.WebMapServiceImageryProvider({
  url: 'http://localhost:4800/geoserver/spatial_base/ows',
  layers: 'spatial_base:guangxi_cities',
  parameters: {
    transparent: true,
    format: 'image/png',
  },
})

只须要保障坐标系适合即可,当然,url 的 ows 也能够改为 wms

OWS 只是 GeoServer 上的一个通配符,如果你晓得你想用的是什么服务,能够不写 ows,例如本例,能够间接写 ‘http://localhost:4800/geoserv…’

在 OpenLayers6 中:

import TileLayer from 'ol/layer/Tile'
import TileWMS from 'ol/source/TileWMS'

new TileLayer({extent: [104.4509, 20.8993, 112.0619, 26.3856], // 坐标系放弃与 View 统一
  source: new TileWMS({
    url: 'http://localhost:4800/geoserver/spatial_base/wms',
    params: {'LAYERS': 'spatial_base:guangxi_cities',},
    serverType: 'geoserver', // 有好几种天文服务器,要明确指定
  }),
})

// View 坐标系的设置
import {View} from 'ol'
new View({
  // ...
  projection: get('EPSG:4326') // 返回一个 Projection 实例即可
})

依据 OpenLayers 的文档:

At least a LAYERS param is required. STYLES is '' by default. VERSION is 1.3.0 by default. WIDTHHEIGHTBBOX and CRS (SRS for WMS version < 1.3.0) will be set dynamically.

也就是至多要设置 LAYERS 参数。如果申请的图层的坐标系与 View 的统一,则不须要设置 SRS

1.4. 获取因素信息

WMS 尽管次要的用处是申请地图图片,是一种经典的服务器渲染服务,然而也保留了根本的因素查问性能,也就是 GetFeatureInfo,举例:

http://localhost:4800/geoserver/spatial_base/ows
?service=WMS
&version=1.1.1
&request=GetFeatureInfo
&layers=spatial_base:guangxi_cities
&bbox=101.25,22.5,112.50,33.75
&width=256
&height=256
&srs=EPSG:4326
&query_layers=spatial_base:guangxi_cities
&info_format=application/json
&x=181
&y=199

GetFeatureInfo 是一个可选的性能,GeoServer 有这个性能。简略解释一下,参数 widthheight 是参数 bbox 范畴生成的一小块图片,而后去查问这块图片中像素地位是 xy 的因素信息,其它参数不难理解。

2. WMTS 速查

2.1. 轴向

WMTS 的轴朝向如下图所示。

2.2. 能力

  • GetCapabilities(获取 WMTS 元数据文档,也叫获取能力文档)
  • GetTile(获取一张瓦片)
  • GetFeatureInfo (可选能力)

2.3. 示意图

<img title=”” src=”./attachments/2022-07-16-20-43-00-image.png” alt=”” data-align=”center” width=”482″>

WMTS 的行列号、瓦片阵(TileMatrix,相似层级的概念,参考第 5 节)是从 0 开始算的,例如 TileMatrix=EPSG:4326:0&TileCol=0&TileRow=0

2.4. 申请瓦片举例(GetTile)

以 2.3 大节中的“TileRow=55 & TileCol=103”这张瓦片为例:

它的申请地址是:

http://localhost:4800/geoserver/gwc/service/wmts?layer=spatial_base%3Aguangxi_cities&style=&tilematrixset=EPSG%3A900913&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fpng&TileMatrix=EPSG%3A900913%3A7&TileCol=103&TileRow=55

把 queryString 列成表格即:

param value desc
layer spatial_base:guangxi_cities 与 WMS 的 layers 意义统一
style “” 与 WMS 的 style 意义统一
tilematrixset EPSG:900913 瓦片阵集,见本文第 5 节
TileMatrix EPSG\:900913\:7 以后级别的瓦片阵,见本文第 5 节
TileCol 103 瓦片列号
TileRow 55 瓦片行号
Service WMTS 与 WMS 的 service 意义统一
Request GetTile 与 WMS 的 request 意义统一
Version 1.0.0 与 WMS 的 version 意义统一
Format image/png 与 WMS 的 format 意义统一

聪慧的你应该留神到了,参数的名称是大小写任意的,然而 参数值局部大小写敏感,例如“EPSG:900913”写成“epsg:900913”是申请不到的(至多 GeoServer 是这样);然而“GetTile”写成“gettile”又是能够的。

2.5. 申请瓦片举例(GetTile)应用 RESTful

图与上一大节返回的是一样的,应用 RESTful 格调的申请是这样的:

http://localhost:4800/geoserver/gwc/service/wmts/rest/spatial_base:guangxi_cities/polygon/EPSG:900913/EPSG:900913:7/55/103?format=image/png

2.6. 对于 GeoServer 两种获取瓦片的接口格调

  • 键值对:在 GeoServer 中应用 OpenLayers 预览,应用浏览器开发者工具查看网络申请,此处的接口格调即键值对模式,应用 queryString;
  • RESTful:申请 WMTS 的能力文档,搜寻 ResourceURL 标签,此处的地址是 REST 格调的。

2.7. 在 CesiumJS 和 OpenLayers6 中应用 GeoServer WMTS

在 CesiumJS 中,你要非常小心每一级“TileMatrix”的名称,因为 CesiumJS 应用的是 REST 格调的申请地址,这就意味着,TileMatrix 必须与能力文档中对应图层的 TileMatrix 名称统一,能力拼凑出正确的 URL。

CesiumJS 默认 WMTS 每一级的 TileMatrix 名称就是简略的“0、1、2、3、4…”,然而 GeoServer 默认的 900913 和 4326 这两个 TileMatrixSet 的名称却是“EPSG\:4326\:0、EPSG\:4326\:1、EPSG\:4326\:2…”和“EPSG\:900913\:0、EPSG\:900913\:1、EPSG\:900913\:2…”,面对这种状况也好办,咱们能够用 JavaScript 疾速生成这样一个有法则的 TileMatrixLabels 数组:

const maxLevel = 3 // 别忘了改成你的 WMTS 反对的最大等级,此处演示写个 3
const tileMatrixID = 'EPSG:900913'
const tileMatrixLabels = Object.keys(new Array(maxLevel).fill(0)).map(v => `${tileMatrixID}:${v}`)
// tileMatrixLabels 即 ['EPSG:900913:0', 'EPSG:900913:1', 'EPSG:900913:2']

当初,你能够用这个 tileMatrixLabels 数组创立 WebMapTileServiceImageryProvider

new Cesium.WebMapTileServiceImageryProvider({url: 'http://localhost:4800/geoserver/gwc/service/wmts/rest/spatial_base:guangxi_cities/{style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}?format=image/png',
  style: 'polygon', // 改 'default' 就是默认的款式
  layer: 'spatial_base:guangxi_cities',
  tileMatrixLabels: tileMatrixLabels,
  tileMatrixSetID: 'EPSG:900913',
  rectangle: Cesium.Rectangle.fromDegrees(104.450889587402,20.8992862701416,112.061851501465,26.3855667114258),
})

你甚至能够封装一个函数获取这些 TileMatrix 的名称:

/**
 * 创立 TileMatrix 的名称
 * @param {string} tileMatrixID 即 `TileMatrixSet` 的名称
 * @param {number} maxLevel 即 WMTS 的最大等级
 * @returns {string[]}
 */
const createTileMatrixLabels = (tileMatrixID, maxLevel) => 
  Object.keys(new Array(maxLevel).fill(0)).map(v => `${tileMatrixID}:${v}`)

至于 OpenLayers6 加载 WMTS,也是须要计算分辨率、TileMatrixIDs 的,略嫌麻烦,以 EPSG:4326 为例,你须要计算图层的分辨率列表、TileMatrix 名称列表:

// 计算 22 级别,够用就行
const resolutions = new Array(22)
// EPSG:4326 一级宽度跨 2 个 256 像素的瓦片
const firstLevelPixelWidth = 360 / (256 * 2)
for (let z = 0; z < 22; ++z) {
  // 逐级除以 2
  resolutions[z] = firstLevelPixelWidth / Math.pow(2, z)
}
const tileMatrixLabels = createTileMatrixLabels('EPSG:4326', 22)

随后,你就能够用 resolutionstileMatrixLabels 创立一个 WMTSTileGrid,进而创立 WMTS 图层了:

const wmtsTileGrid = new WMTSTileGrid({origin: [-180, 90], // origin 即以后坐标系的的左上角
  resolutions: resolutions,
  matrixIds: tileMatrixLabels,
})

new TileLayer({extent: [104.4509, 20.8993, 112.0619, 26.3856],
  source: new WMTS({
    // 和 CesiumJS 不太一样,这里不必到模板那么细
    url: 'http://localhost:4800/geoserver/gwc/service/wmts',
    layer: 'spatial_base:guangxi_cities',
    matrixSet: 'EPSG:4326', // 与能力文档中此图层的 TileMatrixSet 统一
    format: 'image/png',
    // 也能够用 `ol/proj` 包导出的 get('EPSG:4326'),返回 Projection 实例即可
    projection: 'EPSG:4326',
    tileGrid: wmtsTileGrid,
    style: 'polygon',
    wrapX: true,
  }),
})

而如果是 EPSG:3857,也即 EPSG:900913,那么你的 originextentfirstLevelPixelWidth 就要随之扭转了:

const origin = [-20037508.34, 2003708.34]
const extent = [11627419.84177403,2379873.5953122815,12474668.246494522,3046913.9333698303]
const firstLevelPixelWidth = 40075016.68557849 / 256

至于为什么是这几个数字,请查看 GeoServer 中相干 Gridset 的数值吧,须要有 Web 墨卡托坐标系相干的根底。

3. TMS 速查

TMS 是一种十分靠近动态资源的地图瓦片数据集,常见的瓦片格局有 jpegpngpbf 等。这个规范比拟旧了,然而胜在简略。

3.1. 轴向

TMS 轴朝向如下图所示。

3.2. 元数据 XML 文档

一般来说,TMS 的地址会指向一个名称是 tilemapresource.xml 的文档。当然,GeoServer 就比拟例外,仅仅是返回 XML 文档而地址并不指向 XML 文档。

这个 XML 文档是 TMS 最显著的特色,记录了这个瓦片地图集的元数据:

<TileMap version="1.0.0" tilemapservice="...">
  <!-->...<-->
</TileMap>

3.3. 申请瓦片举例

申请地址:

http://localhost:4800/geoserver/gwc/service/tms/1.0.0
/spatial_base:guangxi_cities@EPSG:900913@png
/7/103/72.png

如下图所示:

3.3. 在 QGIS 中加载 GeoServer 的 TMS

增加一个 XYZ 图层即可,然而在模板链接中要填写的是 {z}/{x}/{-y}.imageExt,而不是 {z}/{x}/{y}.imageExt

3.4. 在 CesiumJS 和 OpenLayers6 中应用 GeoServer 的 TMS

CesiumJS 在测试中发现对非全范畴的 EPSG4326 或 3857 坐标系的 TMS 加载是存在问题的。GeoServer 公布的图层个别没有这个问题。

举例:

new Cesium.TileMapServiceImageryProvider({
  url: "http://localhost:4800/geoserver/gwc/service/tms/1.0.0/spatial_base%3Aguangxi_cities@EPSG%3A900913@png",
  minimumLevel: 0,
  maximumLevel: 15,
  rectangle: Cesium.Rectangle.fromDegrees(104.450889587402,20.8992862701416,112.061851501465,26.3855667114258)
})

如果应用的是 TileMapServiceImageryProvider 这个类,那么它是遵循正确的 z、x、y 程序的。如果应用的是 UrlTemplateImageryProvider,那么你须要把模板中的 {y} 改成 {reverseY}

new Cesium.UrlTemplateImageryProvider({url: "http://localhost:4800/geoserver/gwc/service/tms/1.0.0/spatial_base%3Aguangxi_cities@EPSG%3A900913@png/{z}/{x}/{reverseY}.png",
  minimumLevel: 0,
  maximumLevel: 15,
  rectangle: Cesium.Rectangle.fromDegrees(104.450889587402,20.8992862701416,112.061851501465,26.3855667114258)
})

CesiumJS 会判断默认的 TMS 形容文件“tilemapresource.xml”,申请失败则降级成 {z}/{x}/{reverseY}.imageExt

而在 OpenLayers6 中,应用 TMS 则是通过 XYZ 实现的:

new TileLayer({
  source: new XYZ({url: 'http://localhost:4800/geoserver/gwc/service/tms/1.0.0/spatial_base%3Aguangxi_cities@EPSG%3A900913@png/{z}/{x}/{y}.png'
  }),
})

这只是最简略的用法,即默认是 EPSG:3857EPSG:900913 切片计划的 TMS,否则要指定其它的参数,例如 projectiontileGridtileSize 等,具体参考官网文档。如果不想控制台报没瓦片的中央找不到瓦片的谬误,则还要加上 extent 参数给 ol/layer/Tile 类:

import TileLayer from 'ol/layer/Tile'

const tmslayer = new TileLayer({extent: [11627419.84177403,2379873.5953122815,12474668.246494522,3046913.9333698303],
  // ...
}) 

3.5. GeoServer 是否能够挂接已有的 TMS

临时不能够。

参考:Can I use external TMS service as a store in Geoserver?

GeoServer 目前只能挂接其它服务器的 WMS 和 WMTS,TMS 作为一种比拟动态的瓦片数据服务,倡议间接应用 Web 服务器公布即可,不须要再通过 GeoServer。

4. WFS 速查

WFS 即便到了 2.0.0 版本,依然只能用这两种形式发动申请:

  • 应用键值对的简略类型申请,通常用 Get 申请,也能用 Post 申请
  • 应用 XML 体的简单数据申请,只能用 Post 申请

这是有问题的,前端的敌人们相熟什么?他们要什么?JSON 啊!

若不加以限度,WFS 返回的是基于 XML 的 GML 格局。总之,

4.1. 能力

  • GetFeature:获取矢量因素数据
  • DescribeFeatureType:查问矢量图层的元数据
  • GetCapabilities:获取能力文档
  • Transaction:发动矢量图形交互事务,例如增删改等

这只是次要的能力,2.0.0 还新增了其它的能力,有趣味的能够去看标准,也能够间接参考 GeoServer 的帮忙手册,非常具体:

  • GeoServer Docs – Services – WFS – WFS reference#operatioins

我只是好奇,为什么 GeoServer 本地不能集成一份帮忙文档呢?

4.2. 获取因素(GetFeature)及罕用参数

这里以 WFS 2.0.0 为例。

一个最简略的获取全副矢量因素的申请如下:

http://localhost:4800/geoserver/spatial_base/ows
?service=WFS
&version=2.0.0
&request=GetFeature
&typeNames=spatial_base:guangxi_cities
&outputFormat=application/json

参数 outputFormat 的指定十分重要,若不指定,默认返回的是 GML 格局数据。

几个罕用的参数如下

参数名 值类型 形容
count int 限度返回的个数,取前 count 个
featureid string 指定因素的 ID 来查问,格局是“图层名.id”
typeNames string 要查问哪个“图层”,GeoServer 是“工作空间”:“图层名”
propertyName string 须要返回什么属性字段,用英文逗号连贯
filter string 一个 XML 文本,即查问信息
outputFormat string 要返回数据的格局类型,能力文档中有

其中,filter 的 XML 就是 WFS 较为诟病的一点,因为这个 XML 结构起来比拟麻烦。

4.3. 获取因素时应用过滤(Filtering)

以一个简略的框选查问为例,你须要结构如下的 XML:

<Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">
  <Intersects>
    <PropertyName>geom</PropertyName>
    <gml:Envelope srsName="EPSG:4326">
      <gml:lowerCorner>109 20</gml:lowerCorner>
      <gml:upperCorner>120 30</gml:upperCorner>
    </gml:Envelope>
  </Intersects>
</Filter>

对于我这份数据来说,这样一个框选查问能返回 11 个因素。留神,<Intersects> 下的 <PropertyName> 的值,即 “geom”,指的是因素图层的待相交查问的几何字段名称。如果是 Shapefile,它的几何字段可能是 “SHAPE” 或其它。

对于这个 filter 能进行什么空间查问,请参考:

  • GeoServer Docs – Filtering – Supported Filtering Language
  • GeoServer Docs – Filtering – Filtering Function References

上述的 XML 过滤参数,是通过 GET 申请,发送 QueryString 的形式传递到 WFS 的。如果这个过滤的 XML 体积过大,超出了 GET 申请的最大大小(因浏览器而异,广泛较小),那么就须要改成 POST 申请,把这个 XML 作为申请体发送到服务器。

申请门路:

POST http://localhost:4800/geoserver/spatial_base/ows

申请体和下面的 filter 略有不同,要把其它的申请参数也带上:

<?xml version='1.0' encoding='UTF-8'?>
<wfs:GetFeature 
  service="WFS"
  version="2.0.0"
  outputFormat="json"
  xmlns:wfs="http://www.opengis.net/wfs/2.0"
  xmlns:fes="http://www.opengis.net/fes/2.0"
  xmlns:gml="http://www.opengis.net/gml/3.2"
  xmlns:sf="http://www.openplans.org/spearfish"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/wfs/2.0
                      http://schemas.opengis.net/wfs/2.0/wfs.xsd
                      http://www.opengis.net/gml/3.2
                      http://schemas.opengis.net/gml/3.2.1/gml.xsd"
>
  <wfs:Query typeNames='spatial_base:guangxi_cities'>
  <wfs:PropertyName>geom</wfs:PropertyName>
  <wfs:PropertyName>name</wfs:PropertyName>
    <fes:Filter>
      <fes:PropertyIsEqualTo matchAction="OR">
        <fes:ValueReference>name</fes:ValueReference>
        <fes:Literal> 梧州市 </fes:Literal>
      </fes:PropertyIsEqualTo>
    </fes:Filter>
  </wfs:Query>
</wfs:GetFeature>

WFS 1.0.0 和 1.1.0 的又略有不同,详见:

  • GeoServer Docs – Filtering – Filter functions
  • OGC Standard – Filter Encoding

WFS 参考资料之简单,中文教程、例子之少,其实考究效率的年代不违心用它也是情有可原的。

官网的例子,在规范文档的 Annex B 章节(附件 B)中。

在线的文档,则能够参考 OGC Standard Examples 页面,找到 WFS 目录即可。

4.4. 简述事务(Transaction)

WFS 的事务容许你向服务器上的数据进行增删改,能增删改的除了属性数据,当然还包含图形数据。

在 WFS 2.0.0 中,事务反对如下几个动作(Action):

  • delete
  • insert
  • replace
  • update

以更新为例,依然是申请 4.3 大节中的地址,发送的 XML 申请体则是:

<?xml version='1.0' encoding='UTF-8'?>
<wfs:Transaction 
  version="2.0.0"
  service="WFS"
  xmlns:fes="http://www.opengis.net/fes/2.0"
  xmlns:wfs="http://www.opengis.net/wfs/2.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0.0/wfs.xsd">
  <!--> 要 Update 的因素是 spatial_base:guangxi_cities<-->
  <wfs:Update typeName="spatial_base:guangxi_cities">
    <!--> 更新名称属性为“梧州市_重命名”<-->
    <wfs:Property>
      <wfs:ValueReference>name</wfs:ValueReference>
      <wfs:Value> 梧州市_重命名 </wfs:Value>
    </wfs:Property>
    <!--> 应用 Filtering 只批改第 4 个因素 <-->
    <fes:Filter>
      <fes:ResourceId rid="guangxi_cities.4"/>
    </fes:Filter>
  </wfs:Update>
</wfs:Transaction>

有时候你无奈发送 Transaction 申请,返回的谬误是“XXX is readonly”,应该是 GeoServer 对编辑申请作了限度,你能够到治理页面的“Security – Data”下,将“*.*.w”的规定(也就是写规定)赋予适合的角色,即可失去编辑写入的权限。

更多例子请参考文末给的例子链接,或者间接查阅对应 WFS 版本的规范文档中的 Examples 内容。

4.5. 举荐与不举荐

WFS 的要务并不是拿来显示大量矢量数据的,大量的矢量图形数据对网络传输、浏览器渲染的性能要求十分高,甚至浏览器超过 1000 个惯例的 JavaScript 对象就难以把持 rAF 程序的流畅性(一是遍历性能可能有余,二是浏览器可用操作系统内存可能不够)。

所以,不举荐 WFS 用来 全量显示矢量图形数据

针对“既须要显示、又须要查问”的需要,可将工作合成:

  • 应用 WMTS/TMS/VectorTiles 显示图形;
  • 应用 WMS/WMTS 的 GetFeatureInfo 或独立存储非空间数据,另写申请接口进行查问非空间数据;
  • 有空间图形剖析或简单空间查问需要的,请应用天文数据库;
  • 有编辑需要的,不太举荐应用 WFS 的 Transaction 操作,倡议应用天文数据库 + 可定制的后端查问接口

OpenLayers6 有几个 WFS 的例子,其应用 JavaScript 函数拼接申请参数之简单令人困扰,切实令人提不起用规范 WFS 的欲望。

而 CesiumJS 则间接不思考这个 OGC 服务,让用户本人抉择矢量图形数据的加载与否(可申请矢量图形数据后应用 GeoJsonDataSource 来加载)。

5. 什么是 TileMatrixSet / TileMatrix

你在 WMTS 能力文档中,肯定能看到这两个货色。然而我感觉官网文档废话太多,索性把本人的了解写了进去。

TileMatrixSet 笔者译为“瓦片阵集”,而 TileMatrix 即“瓦片阵”。

很多人兴许第一次看到这个词,一时半会儿想不通为什么是“Matrix”。直译来说,“Matrix”即矩阵:

如果这个矩阵的每个元素块上填充的是地图瓦片,那就能了解了。

所以,TileMatrix 指的就是某个层级的所有瓦片;自然而然,TileMatrixSet 就是所有层级的 TileMatrix“集”。

举例,GeoServer 中的内置瓦片阵集有一个是 EPSG:4326,那么第 7 级瓦片阵即 EPSG:4326:7

在 GeoServer 中还有个相似的词是 Gridset,在 TileCaching – Gridsets 下能够找到。

6. 常见地图服务接口的轴朝向

① 应用 Z-order 降维编码的微软必应地图

Z-order,有时候又叫 莫顿曲线,参考 wiki – Z-order 或 wikigis – Z-order)。

在微软 Bing 地图瓦片的编号中应用了这个曲线。这个曲线通常用于四叉树的编码。

② 相似 WMTS 的谷歌和 OSM

瓦片的轴和原点均与 WMTS 一样,只不过有一个语义上的等价关系:

  • TileCol → x(列 Col 值,即横方向)
  • TileRow → y(行 Row 值,即纵方向)
  • TileMatrix = z(以后瓦片阵,即瓦片层级)

如下图所示:

OSM 和 谷歌地图 的 Z、X、Y 也与 WMTS 一样,是从 0 开始算的。

以 WMTS 的 TileMatrix=EPSG:900913:7TileCol=103TileRow=55 瓦片为例,那么 OSM 的瓦片应为:

https://a.tile.openstreetmap.org/7/103/55.png

失去的瓦片:

而对应的谷歌地图瓦片链接为:

http://mt2.google.com/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=103&y=55&z=7

失去的图:

再把原来 WMTS 的瓦片搬来看看:

能够说地位上是统一的。

③ 百度地图

原点在 0 度经度、0 度纬度:

百度的 X 和 Y 值如上图所示,有正有负。

瓦片层级,从 3 级起算,最大 21 级。

对于百度的 N 种坐标,参考此文 百度地图 API 详解之地图坐标零碎,业务上对高德、百度、腾讯等 LBS 厂商用得不多,故不再列举,有须要的敌人可自行在网络上查找。

参考资料

  • OGC e-Learning
  • OpenStreetMap/Google/ 百度 /Bing 瓦片地图服务(TMS) – 可可西 – 博客园
  • Gist – WFS 2.0 Examples
  • OGC Standards’ Schemas (Examples)
  • GeoServer 中 WMS、WFS 的申请标准 – 李晓晖 – 博客园
退出移动版