带你真正理解web地图切片规则

         很多时候我们即使做完了项目还是对切片规则一知半解,只知道照着例子写代码,不理解WMTSCapabilities文件中参数的具体含义,也无法理解切片规则是如何产生的,不知道经纬度切图和平面切图的差别是啥,等等种种疑问,下面通过我得介绍希望可以解决你的疑问。


切片前期知识点

常见地图缩放层级有多少?

答:0-18级别

要想在平面地图上显示地球就要用到影像金字塔,什么是影像金字塔了?

答:就是“边长” 2的幂次方放大18倍,例如第一层级就只有2零次方边长就是1,总切片数就是1*1,以此类推2的1次方边长就是2,总切片数量就是两边长相乘2*2,然后往下一直分下去,不管是什么切片都遵循这个规则。

下图所示谷歌XYZ切片层级如下:是1=1*1,4=2*2,16=4*4 依次递增的,所以我们得到一个答案每个层级的切片数量是固定的!!!

这就是第二层级瓦片加载的样子,一共四张图片,2*2

切片相关知识有哪些?

切片大小:256

比例尺:就是实际距离比上切片大小

我们有了上面这些知识可以适当的上代码了

//这段代码是openlayer wmts 加载的一段代码
//(这里是全球切片,所以还差个东西就是初始的原点坐标,
//因为绝大部分图层我们只想加载指定范围的切片这个时候就要用到原点坐标(通常就是地图范围的左上角))
const projection = getProjection('EPSG:3857'); 
const projectionExtent = projection.getExtent(); //获取地图范围
const width = getWidth(projectionExtent); //获取地图宽度
const resolutions = new Array(19); //用来装比例尺
const matrixIds = new Array(19); //用来放层级
for (let z = 0; z < 19; ++z) {resolutions[z] = width / (256 * Math.pow(2, z)); //比例尺=实际宽度/(切片宽度 * x轴上切片个数)matrixIds[z] = z;
}

我们已经基本清楚了瓦片加载的步骤了,切片和这个是一样的,就是按照这个把地图瓦片先切图,因为切片规则是定死的所以前端加载也是定死的。

或许你还有些疑问就这样将地图进行变形和实际差别得多大啊?答是究极大,3857得切片是按照平面投影切得,两极看起来都比中国大了,那为什么要这样做?因为简单!!!!你没看错就因为简单!!!

XYZ切片

其实通过上面得知识我们已经知道XYZ切片得规则了,这里提一嘴就是XYZ里面有个TMS,TMS和XYZ唯一得差别就是原点坐标不同,TMS原点坐标在左下方,所以加载得时候需要注意一下Y值。

wmts切片

1.为什么有wmts?
答案:由于xyz通常是全球切片,然后OGC(一个操蛋得组织,搞些花里胡哨得东西)为了满足区域切片而定制得规则,其实和xyz是一样得,唯一得区别是原点坐标可以挪到任意位置了,而xyz通常原点坐标都在全球范围得左上方,就这一个区别。

请求路径通常是这样

https://koordinates-tiles-a.global.ssl.fastly.net/services;key=d740ea02e0c44cafb70dce31a774ca10/tiles/v4/layer=7328,{style}/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.png

这样你就很容易得到了他们得对应关系了,甭管wmts,xyz,都是从(0,0)开始加载切片请求方式基本无二样。

wmts:{TileMatrix}/{TileCol}/{TileRow}.png
xyz:{z}/{x}/{y}.png

下图介绍了wmts Capabilities配置文件得具体内容:

wms切片

1.那么问题来了为啥又有wms服务了?

答:因为矢量数据到设置样式到出图切片是一个繁琐得过程,为了简化这个过程WMS诞生了,可以动态绘制样式得切片服务,牺牲服务器性能换来得是矢量数据编辑wms立马反应出来了。既然逻辑是这样wms就有一些新花样,例如一张图片包含所有要素,前端只请求指定范围,每次地图位置更新都会去请求一张wms图片回来,还有一种就是分多张图片去加载wms服务,这个时候就和xyz,wmts完全不一样了,这个时候是前端计算范围,通过范围和切片大小确定返回得数据和图片。这个其实比xyz好理解一些,就是按照范围和图片大小,样式后端来绘制图片。

#wms title 参数如下REQUEST: GetMap
SERVICE: WMS
VERSION: 1.3.0
FORMAT: image/png
STYLES: 
TRANSPARENT: true
LAYERS: topp:states
TILED: true
WIDTH: 256
HEIGHT: 256
CRS: EPSG:3857
BBOX: -13149614.849955441,4383204.9499851465,-12523442.714243278,5009377.08569731

矢量切片

矢量切片其实就是xyz切片,只不过换成了矢量结构得pbf压缩文件进行传输,postgresql数据库可以对矢量进行生成pbf操作。。。

总结一下

没什么难的都很简单,不要想复杂了。。。。当你把知识串起来就知道了。以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 39 组合总和

题意理解&#xff1a; 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字&#xff0c;使其和 target &#xff0c;有多少种组合&#xff08;candidates 中的 同一个 数字可以 无限制重复被选取&#xff09; 这道题和之前一道组合的区别&am…

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用&#xff0c;使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…

python基于DeeplabV3Plus开发构建手机屏幕表面缺陷图像分割识别系统

Deeplab是图像分割领域非常强大的模型&#xff0c;在前面的博文中我们也进行过很多相应项目的开发实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《基于DeepLabv3Plus开发构建人脸人像分割系统》 《基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割》 《基于D…

【链表Linked List】力扣-203 移除链表元素

目录 题目描述 解题过程 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5…

快速学会绘制Pyqt5中的所有图(下)

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

鸿蒙原生应用开发——分布式数据对象

01、什么是分布式数据对象 在可信组网环境下&#xff0c;多个相互组网认证的设备将各自创建的对象加入同一个 sessionId&#xff0c;使得加入的多个数据对象之间可以同步数据&#xff0c;也就是说&#xff0c;当某一数据对象属性发生变更时&#xff0c;其他数据对象会检测到这…

让聪明的车连接智慧的路,C-V2X开启智慧出行生活

“聪明的车 智慧的路”形容的便是车路协同的智慧交通系统&#xff0c;从具备无钥匙启动&#xff0c;智能辅助驾驶和丰富娱乐影音功能的智能网联汽车&#xff0c;到园区的无人快递配送车&#xff0c;和开放的城市道路上自动驾驶的公交车、出租车&#xff0c;越来越多的车联网应用…

thinkphp lists todo

来由&#xff1a; 数据库的这个字段我想返回成&#xff1a; 新奇的写法如下&#xff1a; 逻辑层的代码&#xff1a; public function goodsDetail($goodId){$detail $this->good->where(id, $goodId)->hidden([type_params,user_id])->find();if (!$detail) {ret…

如何使用PostMan进行并发测试?

如何使用PostMan进行并发测试&#xff1f; &#x1f440;(Postman 的 runner 实际上是串行执行的&#xff0c;因此不能作为并发测试&#xff0c; 只是批量测试&#xff0c;本文如下称为并发的是错误的) 文章目录 如何使用PostMan进行并发测试&#xff1f;POST篇流程Pre-req 脚…

Conda常用命令总结

使用conda或anaconda的小伙伴们都知道&#xff0c;图形界面时不靠谱的&#xff0c;而在命令行下&#xff0c;所有的操作就会稳定很多&#xff0c;且极少出现问题。因此&#xff0c;熟记conda的命令行就变得十分有用。但对于我这样近50岁依旧奋斗在代码第一线的大龄程序员而已&a…

拦截 open调用 (进程白名单,文件白名单)

拦截 open 文章目录 拦截 open第一个需求文件结构进程白名单文件白名单 测试代码第一个版本版本二代码演示 增加一个日志记录代码解释 gcc -shared -fPIC -o libintercept.so intercept.c -ldlLD_PRELOAD./libintercept.so ./processA在Linux中&#xff0c;我们可以使用LD_PREL…

12.Mysql 多表数据横向合并和纵向合并

Mysql 函数参考和扩展&#xff1a;Mysql 常用函数和基础查询、 Mysql 官网 Mysql 语法执行顺序如下&#xff0c;一定要清楚&#xff01;&#xff01;&#xff01;运算符相关&#xff0c;可前往 Mysql 基础语法和执行顺序扩展。 (8) select (9) distinct (11)<columns_name…

【力扣热题100】287. 寻找重复数(弗洛伊德的乌龟和兔子方法)

【力扣热题100】287. 寻找重复数 写在最前面理解解决 "寻找重复数" 问题的算法问题描述弗洛伊德的乌龟和兔子方法为什么这个方法有效&#xff1f; 代码复杂度 总结回顾 写在最前面 刷一道力扣热题100吧 难度中等 https://leetcode.cn/problems/find-the-duplicate-…

Java Web应用小案例 - 实现用户登录功能

文章目录 一、使用纯JSP方式实现用户登录功能&#xff08;一&#xff09;项目概述&#xff08;二&#xff09;实现步骤1、创建Web项目2、创建登录页面 二、使用JSPServlet方式实现用户登录功能三、使用JSPServletDB方式实现用户登录功能 一、使用纯JSP方式实现用户登录功能 &a…

ubuntu22.04安装 nvidia-cudnn

nvidia-cudnn 是 NVIDIA CUDA 深度神经网络库&#xff08;CUDA Deep Neural Network library&#xff09;的缩写。这是一个由 NVIDIA 提供的库&#xff0c;用于加速深度学习应用程序。它包含了针对深度神经网络中常用操作&#xff08;如卷积、池化、归一化、激活层等&#xff0…

【Linux】如何清空某个文件的内容

cat /dev/null > file1 清空某个文件的内容使用cat /dev/null > file1&#xff0c;它将 /dev/null 的内容&#xff08;空内容&#xff09;重定向到 file1。 如下所示&#xff0c;file1文件里的内容被清空。 错误写法 错误写法是&#xff1a;cat file1 > /dev/null&…

持续集成交付CICD:CentOS 7 安装 Nexus 3.63

目录 一、实验 1.CentOS 7 安装Nexus3.63 二、问题 1.安装Nexus报错 2.Nexus启动停止相关命令 一、实验 1.CentOS 7 安装Nexus3.63 &#xff08;1&#xff09;当前操作系统版本&JDK版本 cat /etc/redhat-releasejava -version&#xff08;2&#xff09;下载Nexus新…

int 和 Integer 有什么区别,还有 Integer 缓存的实现

✨前言✨   Java本文主要介绍Java int 和 Integer的区别以及Integer 缓存的实现 &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 文章目…

用C++实现队列顺序结构的基本操作

//队列顺序结构的基本操作&#xff1a; #include"stdio.h" #include"String" #define QueueSize 100 typedef char ElemType; typedef struct { ElemType data[QueueSize]; /*保存队中元素*/int front,rear; /*队头和队尾指针*/ } SqQueue; void Init…

使用STM32定时器实现精确的时间测量和延时

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进&#xff0c; 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff01;…