GeoServer WMTS切片计算

  • 各级别关系
  • 计算规则
    • (1)计算Pixel Size
    • (2)计算Scale
    • (3)切片行列号计算

在geoserver中打开GridSets,选择WGS 84的切片进行查看

可以看到如下信息

各级别关系

Level Pixel Size Scale Tiles
i p 1 : s m * n
i +1 p /2 1 : (s/2) 2m * 2n

计算规则


level=0时,切片如图所示

(1)计算Pixel Size

由于像素为256256,切片数量为21,经纬度范围为经度360度(-180到180),纬度180度(-90到90),
所以删除21的切片宽为2562=512像素,高为256像素
所以Pixel Size=360/512=0.703125 ,即每个像素代表0.703125度
当level=i时,由于被分割成了360度被分割成了2*2i张图片,每张图片为256个像素大小,故
pixelSize=360256∗2∗2ipixel Size=\frac{360}{256*2*2^{i}}pixelSize=256∗2∗2i360​

(2)计算Scale

∵ 地球半径为6378137米,
∴ 实际距离D=2πR=2π6378137=40,075,016.685578491904米

在OpenGIS的WMTS标准实现中,确定比例尺分母时采用的是标准显示像素尺寸(1个像素大小)0.28mm×0.28mm。虽然实际的像素大小并不可知,但0.28mm对于当前的显示器是较为普遍的实际尺寸。
(参考链接:
(1条消息) Geoserver学习笔记-3、服务标准(WMTS详解)_@柿子树的博客-CSDN博客_geoserver wmts https://blog.csdn.net/weixin_38670190/article/details/104953940)

图上距离d=256 * 2 * 0.28/1000=0.14336米
比例尺=d/D=0.14336/40,075,016.685578491904=1:279,541,132.0143589
level=i时,

  • 单个像素长度 = 0.28mm=0.00028m
  • 像素个数 = 256 * 2 * 2i
  • 图上距离(即地图360对应的像素总长度)为0.00028 * 256 * 2 * 2i
  • 地图实际距离(地球周长)=2πR=2 * π * 6378137
    -scale=0.00028∗256∗2∗2i2∗π∗6378137scale=\frac{0.00028 * 256 * 2 * 2^{i}}{2*π*6378137} scale=2∗π∗63781370.00028∗256∗2∗2i​

(3)切片行列号计算

public void Calculate()
{///四至范围可以通过xml文件读取///http://localhost:8080/geoserver/gwc/service/wmts?layer=zny:ShuniuquDOM&REQUEST=GetCapabilities///<ows:Title>ShuniuquDOM</ows:Title>///<ows:WGS84BoundingBox>///< ows:LowerCorner > 99.14775967969356 27.1615889820084 </ ows:LowerCorner >///< ows:UpperCorner > 99.1598915388142 27.175144923792043 </ ows:UpperCorner >///</ ows:WGS84BoundingBox >var xmin = 99.14775967969356;var ymin = 27.1615889820084;var xmax = 99.1598915388142;var ymax = 27.175144923792043;var dx = xmax - xmin;var dy = ymax - ymin;var env = Map.Extent;//与视域范围无交集,无需渲染if (env.xMin > xmax || env.yMin > ymax || env.xMax < xmin || env.yMax < ymin)return;//只需加载与视域范围相交的部分if (env.xMin > xmin)xmin = env.xMin;if (env.xMax < xmax)xmax = env.xMax;if (env.yMin > ymin)ymin = env.yMin;if (env.yMax < ymax)ymax = env.yMax;//图层最值点转为像素坐标var p1 = Map.mapToDevicePoint(new SGPoint(xmin,ymin));var p2 = Map.mapToDevicePoint(new SGPoint(xmax,ymax));int level = 0;//图层横长型,用经差进行适配if (dx/dy> env.width/ env.height){//屏幕像素宽度var pw = Math.Ceiling(p2.x - p1.x);var pixelSize = dx / pw;double d = 0;for (int i = 0; i < 22; i++){var std = 360 / (256 * 2 * Math.Pow(2, i));d = std - pixelSize;if (d < 0){level = i;break;}}}//图层竖长型,用纬差进行适配else{var ph = Math.Ceiling(p2.y - p1.y);var pixelSize = dy / ph;double d = 0;for (int i = 0; i < 22; i++){var std = 180 / (256 * Math.Pow(2, i));d = std - pixelSize;if (d < 0){level = i;break;}}}var StandPixelSze = 180 / (256 * Math.Pow(2, level));//展开为360度,最左侧实际为-180,但是由于原点在左上角,,所以需要要x+180,90-y#region 左上角点var col1 = Math.Floor((xmin + 180) / 360.0 * 2 * Math.Pow(2, level));var row1 = Math.Floor((90 - ymax) / 180.0 * Math.Pow(2, level));#endregion#region 右下角点var col2 = Math.Floor((xmax + 180) / 360.0 * 2 * Math.Pow(2, level));var row2 = Math.Floor((90 - ymin) / 180.0 * Math.Pow(2, level));#endregion//需要渲染的所有切片(从上到下,从左到右)for(var col = col1; col <= col2; col++){for(var row = row1; row <= row2; row++){//照片实际四至坐标double x1 = col * StandPixelSze * 256 - 180;double y1 = 90 - (row + 1) * StandPixelSze * 256;double x2 = x1 + 256 * StandPixelSze;double y2 = y1 + 256 * StandPixelSze;var layerName = "ShuniuquDOM";var url = $"http://localhost:8081/geoserver/gwc/service/wmts?layer=zny:{layerName}&style=&tilematrixset=EPSG:4326&" +$"Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/jpeg&" +$"TileMatrix=EPSG:4326:{level}&TileCol={col}&TileRow={row}";Console.WriteLine(url);}}
}

GeoServer WMTS切片计算相关推荐

  1. geoserver发布切片影像地图

    问题来源 拿到一副经过校正后的影像后,怎么使用geoserver进行切片及发布呢.本人研究了一番在此给出答案. 导入tiff影像 这个就不说了,网上一大把教程,记得要带坐标系. 若使用imagemos ...

  2. Geoserver发布切片地图组完整教程

    Geoserver发布切片地图组完整教程 特别注意:geoserver中所有使用的名称都不用使用中文!!!!,以免出现未知错误. - 下载安装Geoserver 1.下载地址http://geoser ...

  3. GeoServer修改切片缓存目录和data目录

    GeoServer修改切片缓存目录和data目录 在官网下载geoserver-war.zip包后,解压有geoserver.war,其中根目录有data文件夹,拷贝出来放到指定部署的共享目录下,然后 ...

  4. geoserver设置切片缓存路径

    geoserver设置切片缓存路径: "C:\Users\administrator\Desktop\apache-tomcat-8.5.61\webapps\geoserver\WEB-I ...

  5. geoserver xyz切片请求地址

    写在前面的话: 用geoserver有一段时间了,也有一些心得,越来越觉得geoserver分类与做的事情刚刚好(一个恰到好处的工具比一堆杂乱的工具堆起来看似强大的软件要好的多),也用过超图,同样也用 ...

  6. Geoserver之切片

    打开web.xml文件,添加切片的路径 添加如下内容: <context-param><param-name>GEOWEBCACHE_CACHE_DIR</param-n ...

  7. 用python从身份证中提取生日信息(切片计算)

    ''' 功能:从身份证号码获取生日 作者:文雅兰 日期:2021年11月25日 '''import re regx = '^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0 ...

  8. 复旦大学演讲刷屏:我用尽了毕生的力气,只是抵达了生活的平凡

    点击"开发者技术前线",选择"星标????" 在看|星标|留言,  真爱 作者丨陈先发 来源丨大师(ID: liang_da_shi) 有一句话是"遍 ...

  9. 互联网地图栅格比例尺(3857,4326)

    互联网地图栅格切片比例尺 常用的栅格切片坐标系为3857.4326. 由于不同平台切片dpi的差别,每级对应的比例尺也会有少许差异.不同的平台最终生成的切片,可以叠加在一起. 1.3857坐标系切片 ...

最新文章

  1. 一个http的Post请求问题,unable to resolve host 我的域名:no address associated with hostnam...
  2. Reroute Unassigned Shards——遇到主shard 出现的解决方法就是重新路由
  3. 一年成为emacs高手
  4. 第七周实践项目5 排队看病模拟(队列)
  5. Java语言基础--字符串
  6. 专访《花亦山心之月》:朝夕光年首款自研国风手游有啥不一样?
  7. [沪江日语电台]ACG杂货铺02-乱唱地带
  8. docker 覆盖 entrypoint_跟我一起学docker(八)--Dockerfile
  9. Flink AggOperator 增量聚合函数
  10. oracle游标缓存,【oracle】游标——数据的缓存区
  11. SilverLight基础介绍以及用C#语言创建一个silverlight项目
  12. html网上日记本设计,个人博客的设计_网上日记本的开发ASP334
  13. Cent OS (一)Cents OS的基本安装
  14. 解锁前端密码框常见功能做法
  15. Oracle查询某一天数据的SQL语句的几种写法
  16. Flash鼠绘入门第四课:绘制漂亮的梅花-梅花照片分析与学习
  17. 利用OpenCV进行动态画椭圆,直线,矩形
  18. 在AD中添加logo
  19. TypeError: __init__()的问题
  20. python动作捕捉_树莓派动作捕捉抓拍存储图像脚本

热门文章

  1. 易语言多线程大话西游2实战视频
  2. 【转】15种互联网营销策划模式
  3. 腾讯 QQ2007 Beta2 阿瑞斯精简版 v0.7.6.2
  4. scapy模块实现arp扫描,断网×××
  5. UICC 之 USIM 详解全系列——USIM App关键流程介绍与命令详解
  6. jenkins基于tag构建
  7. 第18期基于SpringBoot仓库管理系统
  8. c primer pius 练习二
  9. 伦敦奥运会信息管理系统
  10. Nginx 内存池似懂非懂?一文带你看清高性能服务器内存池