OpenLayer加载WMTS服务 及 地图分辨率算法

一、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就可以进行展示了。

猜你喜欢

转载自blog.csdn.net/oneKnow/article/details/114985509