一、WMTS服务
首先以天地图为例解析WMTS服务,天地图服务以OGC标准服务。切片原理如下
直接在WMTS服务链接后面加上 "&request=GetCapabilities" 就可以直接获取该服务的文档。
例如:http://t0.tianditu.gov.cn/img_w/wmts?tk=yourKey&request=GetCapabilities
有了文档后,就可以直接查看WMTS的基本信息了,文档的主要结构如下
下面主要讲一下需要用到的信息
二、WMTS服务分辨率计算
有了比例尺信息后就能够计算比例尺对应的分辨率了,首先明确一点,
地图分辨率:也称地面分辨率(Ground Resolution)或空间分辨率(Spatial Resolution),表示屏幕上一个像素(pixel)所代表的实际地面距离(米),也就是
分辨率 = 像素 / 比例尺
其次,比例尺是图上距离与现实距离的比值,也就是:
比例尺 = 图上距离 / 实际距离
WMTS又与DPI挂钩,DPI就是 单位面积(英寸)的像素数,即:
DPI = 像素数 / 英寸
因为 1英寸 = 0.0254米,一般的WMTS服务的DPI为 96 ,所以可以计算出一个像素的大小,即:
1像素 = 0.0254米 / 96
然后就可以计算出分辨率,即:(注意这里也可以直接乘比例尺的分母,一般文档里提供的比例尺值就是比例尺分母)
分辨率 = 0.0254 / 96 / 比例尺
如果是以米为单位的投影坐标,则直接按上面的公式计算即可,如果是以度为单位的地理坐标,则需要将分辨率转换为角度,用地球的周长除以360°就可以算出一度是多少米,即:
分辨率 = 0.0254 / 96 / 比例尺 / (米/度) => 分辨率 = 0.0254 / 96 / 比例尺 / (MATH.PI * 2 * 地球半径 / 360°)
三、加载WMTS服务
有了分辨率算法后就可以用OpenLayer加载WMTS服务了
new ol.layer.Tile({
opacity: 0.5,
source: new ol.source.WMTS({
name: "中国矢量1-4级",
url: "http://t0.tianditu.gov.cn/img_w/wmts?tk=yourKey",
layer: "img",
style: "default",
matrixSet: "w",
format: "tiles",
wrapX: false,
projection: projectionSource,
// projectionSource是WMTS服务本身的投影,不是地图view的投影
tileGrid: new ol.tilegrid.WMTS({
origin: ol.extent.getTopLeft(projectionsource.getExtent()), // 服务切片坐上角坐标(x,y)
resolutions: [1.40625, 0.703125, 0.3515625, 0.17578125, 0.087890625, 0.0439453125, 0.02197265625, 0.010986328125, 0.0054931640625, 0.00274658203125, 0.001373291015625, 0.0006866455078125, 0.00034332275390625, 0.000171661376953125, 0.0000858306884765625, 0.00004291534423828125, 0.000021457672119140625, 0.000010728836059570312, 0.000005364418029785156, 0.000002682209014892578, 0.000001341104507446289, 6.705522537231445e-7, 3.3527612686157227e-7, 1.6763806343078613e-7],
matrixIds: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
// 此处的resolutions为EPSG:4326示例数据计算出来的分辨率,分辨率与martrixIds是一一对应的关系,也就是加载了多少个层级,就需要多少个分辨率
})
}),
}),
然后将生成的图层加到map就可以进行展示了。