wmts规范_Georver学习笔记-3、服务标准(WMTS详解)⼀、WMTS(Web Map Tile Service)
为了更快的将地图数据在前端显⽰,可以为⼀些数据不会变更或变动较⼩的服务创建地图缓存(Cache)。WMTS是⼀种采⽤图像⾦字塔的⽅式将地图服务按照预先设置的某种切图策略创建的地图缓存服务。
1、地图缓存:
地图缓存是⼀个包含了不同⽐例尺下整个地图范围的地图切⽚⽬录,是预先按照显⽰切图等级、⽐例尺、切图原点、DPI、图⽚⼤⼩等参数创建的静态图⽚,⽤于提⾼地图服务的响应速度。数据格式通常采⽤PNG或JPG。
前端向地图服务器请求时可以直接根据切图等级、⾏号、列号获取已缓存的图⽚,不⽤像动态地图服务那样根据地图当前范围动态地⽣成图⽚再响应到前端。
GeoServer创建缓存的⽅式有两种,⼀种是当⽤户查看地图时创建浏览的地图范围及相应等级下的部分缓存,主要优点是,它不需要预处理,并且仅缓存已请求的数据,因此也可节省磁盘空间。该⽅法的缺点是地图查看只会间歇性地加速,从⽽降低了⽤户体验的质量; 另⼀种⽅式是通过Seed创建,缺点是Seed可能是⾮常耗时和磁盘消耗的过程。
2、⽡⽚⾏列号的计算:
假设,地图的切图原点是(x0,y0),地图的⽡⽚⼤⼩是tileSize,地图屏幕上1像素代表的实际距是resolution。计算坐标点(x,y)所在的⽡⽚的⾏列号的公式是:
col = floor((x - x0 )/( tileSize *resolution))
row = floor((y0 - y )/( tileSize *resolution))
resolution = scale*0.0254/dpi
吃豆腐有什么好处>登陆微博在OpenGIS的 WMTS标准实现中,确定⽐例尺分母时采⽤的是标准显⽰像素尺⼨(1个像素⼤⼩)0.28mm×0.28mm。虽然实际的像素⼤⼩并不可知,但0.28mm对于当前的显⽰器是较为普遍的实际尺⼨。所以在切图的块阵中有:
pixelSpan = scaleDenominator ×0.28 10-3 / metersPerUnit(crs);
tileSpanX = tileWidth ×pixelSpan;
tileSpanY = tileHeight ×pixelSpan;
tileMatrixMaxX = tileMatrixMinX + tileSpanX ×matrixWidth;
tileMatrixMinY = tileMatrixMaxY - tileSpanY ×matrixHeight;
备注:metersPerUnit(crs):坐标参照系下长度单位与⽶之间的转换因⼦,
地理坐标系时,单位为度则metersPerUnit:6378137*Math.PI*2/360=111319.49079327358;
投影坐标系时,单位为⽶即metersPerUnit:1
scaleDenominator :⽐例尺分母
matrixWidth:以图块为单位的宽
matrixHeight:以图块的单位的⾼一级人爱
当知道请求的边界范围框bBox(bBoxMinX, bBoxMinY, bBoxMaxX, bBoxMaxY)时:
// 为补偿浮点计算的不准确性
epsilon = 1e-6
tileMinCol = floor((bBoxMinX - tileMatrixMinX) / tileSpanX + epsilon)
tileMaxCol = floor((bBoxMaxX - tileMatrixMinX) / tileSpanX - epsilon)
tileMinRow = floor((tileMatrixMaxY - bBoxMaxY) / tileSpanY + epsilon)
tileMaxRow = floor((tileMatrixMaxY - bBoxMinY) / tileSpanY - epsilon)
// 避免超出范围
if (tileMinCol < 0) tileMinCol = 0
if (tileMaxCol >= matrixWidth) tileMaxCol = matrixWidth-1
if (tileMinRow < 0) tileMinRow = 0
if (tileMaxRow >= matrixHeight) tileMaxRow = matrixHeight-1
3、地图⽐例尺换算原理(Scale 、Resolution、dpi):
小吃大全
在配置切⽚策略的时候,对⾦字塔的每个Level(切图的⽐例尺参数)都需要⼀个level 和 resolution
Scale:⽐例尺,即地图上的⼀厘⽶代表着实际上的多少厘⽶。原 scale 中表⽰的实际单位是厘⽶
Resolution:分辨率,实际含义代表当前地图范围内,1像素代表多少地图单位(地图单位/像素),地图单位取决于数据本⾝的空间参考。
dpi :代表每英⼨的像素数
屏幕上1像素代表的实际距离计算
假设地图的坐标单位是⽶,dpi为96(ArcGIS中dpi默认是96, OGC标准输出的resolution is 90 DPI(25.4/0.28)) ;
1英⼨=2.54厘⽶;
1英⼨=96像素;
最终换算的单位是⽶;
如果当前地图⽐例尺为1:125000000,则代表图上1⽶等于实地125000000⽶;
⽶和像素间的换算公式:
1英⼨=0.0254⽶=96像素
1像素=0.0254/96 ⽶
则根据1:125000000⽐例尺,图上1像素代表实地距离是 125000000*0.0254/96 = 33072.9166666667⽶
即 resolution = scale*0.0254/dpi
4、GeoServer中 WMTS的切图策略(Gridts)的确定
在新建切图策略时,需要先确定坐标系(即确定metersPerUnit)和边界bounds,图块⼤⼩默认为256*256的⽅形。计算思路是根据公式逆推出pixelSpan和scaleDenominator :
pixelSpan = scaleDenominator ×0.28 10-3 / metersPerUnit(crs);
tileSpanX = tileWidth ×pixelSpan;
tileSpanY = tileHeight ×pixelSpan;
tileMatrixMaxX = tileMatrixMinX + tileSpanX ×matrixWidth;
tileMatrixMinY = tileMatrixMaxY - tileSpanY ×matrixHeight;防患于未然的意思
会计准则当第⼀次点击"Add zoom level"时,设置第⼀级别,需要先确定matrixWidth=1还是matrixHeight =1,可以理解为第⼀个级别应在X或Y 的单个⽅向上的图块数量为以1,后⾯的级别以四叉树⾦字塔结构往下分割。由
世界的故事
(tileMatrixMaxX -tileMatrixMinX) /tileWidth = pixelSpan×matrixWidth = resX;
(tileMatrixMaxY -tileMatrixMinY) /tileHeight = pixelSpan×matrixHeight = resY;
如果resY⼤于resX,则matrixWidth =1,以⾦字塔的分割⽅式可以看出⼀个单位内的X和Y⽅向上的图块数量的相同,所
以,matrixHeight =und(resY / resX),这个时候resX可以理解为在这个⽐例尺下X⽅向上的像素⼤⼩,⽽Y⽅向的像素⼤⼩为resY/matrixHeight ,取这两个⽅向上的像素最⼤值为当前⽐例尺下的像素尺⼨,即
pixelSpan=Math.Max(resX,resY/matrixHeight )
在根据开始的边界bounds的左上⾓(切图原点),重新确定边界。
tileMatrixMaxX = tileMatrixMinX + tileWidth × pixelSpan×matrixWidth;
tileMatrixMinY = tileMatrixMaxY - tileHeight × pixelSpan×matrixHeight;
最后确定⽐例尺分母
scaleDenominator = pixelSpan * metersPerUnit(crs) /0.28 10-3
白带发黄粘稠⼆、WMTS⽀持的操作
1、GetCapabilities:获取服务的元信息
2、GetTile:获取缓存的⽡⽚
3、GetFeatureInfo:获取点选的要素信息
GetCapabilities:
获取元数据信息,包含服务⽀持的操作、提供wmts服务的图层及其拥有的切图策略、输出格式等等信息。
操作⽰例:
响应⽰例:
GetTile:
获取缓存的⽡⽚
操作⽰例:
响应⽰例:
GetFeatureInfo:
获取点选的要素信息,其中的参数J为所在图块中的⾏号,I为列号。
操作⽰例:
响应⽰例: