客户端地图拼图算法解析
概述:主要是阐述如何将瓦片地图图片拼接成完整地图的一些概念以及相关算法。
基本概念:
- 地图瓦片地址:http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193&z=9&s=Galil
现在就是要将一张张这类的地图瓦片,在客户端拼接成一幅完整的地图。
瓦片大小为:256x256。
url中关键参数解析:
参数 | 描述 |
mt2.google.cn | Google瓦片服务服务器,可以尝试mt1.google.cn依然有效。Google提供多台瓦片服务器,减轻服务器负载,提高网络访问效率。 |
x | 瓦片的横向索引,起始位置为最左边,数值为0,向右+1递增。 |
y | 瓦片的纵向索引,起始位置为最上面,数值为0,向下+1递增。 |
z | 地图的级别,以Google为例,最上一级为0,向下依次递增。 |
- 地图投影:Web墨卡托——互联网地图通用的地图投影方式,将椭圆形地图投影成平面上的正文形,欲了解详情请baidu之,如无特殊说明本文所指均为Web墨卡托投影下。
- Bounds(地图范围):[ -20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892],单位为米,20037508.3427892表示地图周长的一半,以地图中心点做为(0,0)坐标。
- Levels:地图的级别,例如:0……22。
- Resolutions:分辨率数组,与级别相对应,即一个级别对应一个分辨率,分辨率表示当前级别下单个像素代表的地理长度。
Resolutions[n] = 20037508.3427892 * 2 / 256 / (2^n)
- Center:地图显示中心点。
- Level:地图显示级别。
- viewSize:地图控件窗口的大小。
根据已知地图中心点、显示级别可以将地图显示范围计算出来:
viewBounds = [Center.x - Resolutions[l]*viewSize.width/2, Center.y - Resolutions[l]*viewSize.height/2, Center.x + Resolutions[l].viewSize.width/w, Center.y + Resolutions[l].viewSize.height/h]
地图切图方式:
一幅地图由4^n个256的正方形组成,n为级别
例如:第0级为4^0个,即世界地图由一个256图片表示。
第1级世界地图应由4^1(4)个256图片组成,也就是将世界地图(上一级的单个图片)等分成4块256图片。
往下每一级依此类推……
拼图算法剖析:
1、计算瓦片url
要想出图就发须知道地图控件可视范围起始点瓦片索引、末尾瓦片索引,中间区域的瓦片索引循环遍历即可得出。
下面看看如果计算出起始点、末尾瓦片url索引:
已知:l(缩放级别)、bounds(地图范围——[ -20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892])、viewBounds(地图控件可视范围)、分辨率(Resolutions[l])、瓦片像素宽高(256)。
未知:startX(视图起始瓦片X方向索引)、startY(视图起始瓦片Y方向索引)、endX(视图未尾瓦片x方向索引)、endY(视图未尾瓦片y方向索引)。
求解:
startX = floor(((viewBounds.leftBottom.x - bounds.leftBottom.x) / Resolutions[l]) / 256);startY = floor(((viewBounds.leftBottom.y - bounds.leftBottom.y) / Resolutions[l]) / 256);endX = floor(((viewBounds.rightTop.x - bounds.rightTop.x) / Resolutions[l]) / 256);endY = floor(((viewBounds.rightTop.y - bounds.rightTop.y) / Resolutions[l]) / 256);
firstTileUrl(起始瓦片Url) = http://**********?x=startX&y=startY&z=l;
endTileUrl(末尾瓦片Url) = http://**********?x=endX&y=startY&z=l;
中间部分的url循环遍历即可得出。
好啦!组成视图所有瓦片的url都已得出。下面就是要解决将这些瓦片放到哪的问题。
2、计算瓦片放在地图控件上的位置
先分析一下:其实只要将起始位置的瓦片像素位置算出来就可以了,由于瓦片像素大小为256,后面的各瓦片位置也就明了了。
所以这里只探讨一下起始瓦片的像素位置。
已知:startX(视图起始瓦片X方向索引)、startY(视图起始瓦片Y方向索引)、分辨率(Resolutions[l])、瓦片像素宽高(256)、bounds(地图范围——[ -20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892])、viewBounds(地图控件可视范围)。
未知:startTileX(起始瓦片左上角X方向地理坐标)、startTileY(起始瓦片左上角Y方向地理坐标)、distanceX(瓦片左边与地图控件左边相距的像素距离)、distanceY(瓦片上边与地图控件上边相距的像素距离)。
求解:
startTileX = bounds.leftBottom.x + (startX * 256 * Resolutions[l]);startTileY = bounds.rightTop.y - (startY * 256 * Resolutions[l]);distanceX = (viewBounds.leftBottom.x - startTileX) / Resolutions[l];distanceY = (startTileY - viewBounds.rightTop.y) / Resolutions[l]
公式不是最简,以方便理解,相信看官此时已经知道起始瓦片在地图控件中的摆放位置了——设地图控件起始像素位置为(0,0),那么此瓦片的像素的位置就是(-distanceX、-distanceY)。其它瓦片依据256像素宽高的关系依次而出。
到此已经算出了各瓦片的url以及它们应该摆放的位置,准备工作已完成,直接帖图即可完成出图工作。
算法可应用于Google、Baidu、Yahoo、Bing等web墨卡托投影的地图瓦片。
转载于:https://www.cnblogs.com/ninemilli/archive/2011/12/26/2289285.html
客户端地图拼图算法解析相关推荐
- Google地图瓦片拼图算法解析
Google地图瓦片拼图算法解析 概述:主要是阐述如何将瓦片地图图片拼接成完整地图的一些概念以及相关算法. 基本概念: 地图瓦片地址:http://mt2.google.cn/vt/lyrs=m@16 ...
- Google瓦片地图算法解析
基本概念: 地图瓦片地址:http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193& ...
- 拼图算法,将零碎小图,整理到一张大图之上,自动合并。二叉树实现
----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...
- 10没有基于策略的qos_分布式QoS算法解析
QoS对于服务多租户多业务的整体系统来说,不管对网络还是存储,都格外重要,没有QoS,会造成不同租户及业务之间对资源的抢占,用户A用爽了,用户B却遭了殃,频频投诉,这是系统管理员最头疼的事情.我们今天 ...
- 激光IMU融合——LIO-Mapping / LIOM / LINS / LIO-SAM算法解析
激光IMU融合--LIO-Mapping / LIOM / LINS / LIO-SAM算法解析 激光IMU融合--LIO-Mapping / LIOM / LINS / LIO-SAM算法解析 1. ...
- 视觉激光融合——VLOAM / LIMO算法解析
视觉激光融合--VLOAM / LIMO算法解析 视觉激光融合--VLOAM / LIMO算法解析 1. VLOAM算法 1.1 总体框架 1.2 视觉里程计 1.3 激光里程计 1.4 实验结果 2 ...
- 【ROS-Navigation】—— Astar路径规划算法解析
文章目录 前言 1. 导航的相关启动和配置文件 1.1 demo01_gazebo.launch 1.2 nav06_path.launch 1.3 nav04_amcl.launch 1.4 nav ...
- 地理围栏算法解析(Geo-fencing)
地理围栏算法解析 http://www.cnblogs.com/LBSer/p/4471742.html 地理围栏(Geo-fencing)是LBS的一种应用,就是用一个虚拟的栅栏围出一个虚拟地理边界 ...
- 最强连一连(C语言算法解析)
一个简单的DFS... 因为只是算法解析,所以需要手动输入 代码中m代表行,n代表列 mapp为地图 a为标记数组 point是点的坐标 #include <iostream> #incl ...
- Google离线地图API概要解析
Google离线地图API概要解析 发布时间:2018-01-17 版权: 1.说明 离线地图发布有多种方式均可以实现,可以利用ArcGis Server.GeoServer等构建地图Web服务器,还 ...
最新文章
- ASP.NET 中HttpRuntime.Cache缓存数据
- 手机4k读写速度测试软件,4K扇区速度测试及读写IOPS_Intel 520_固态硬盘评测-中关村在线...
- “MSDN 开发论坛”大煞风景
- 单机负载告警,数据库与应用分离
- Linux shell命令 cp 加上-f还是提示是否覆盖
- 在sphinx中处理使用特殊字符时所引起错误的办法
- java io重定向,java中的标准重定向标准IO_java标准IO_java构建器_课课家
- Ubuntu 安装 gcc-4.9.3-64-gnu
- 微信小程序图片四个API用法
- 如何获取小程序页面路径
- Kali局域网断网攻击
- 【CVPR 2021】Unsupervised Multi-Source Domain Adaptation for Person Re-Identification (UMSDA)
- spss和sas和python_T检验第三篇(SPSS,SAS,R,Python) 两样本T检验
- 操作系统——可变分区空闲空间管理
- 计算机专业编程很厉害是怎样的一种体验?
- 上海应用技术大学计算机研究生院,计算机考研调剂|2018年上海应用技术大学计算机学院计算机大类考研调剂信息...
- 微信点击链接或者扫描二维码通过默认浏览器打开指定链接是如何实现的
- C语言数组实现丢手绢问题(约瑟夫问题)
- Zuul入门实战(完整版)
- 剑灵万事屋服务器维护,《阴阳师》手游4月22日维护更新公告
热门文章
- 梦记录:1204(梦到观世音菩萨像)
- LINUX使用C调用LMDB的方法
- linux禁止客户端上传文件_linux 文件服务
- json decode php 二维,在json_decode /多维数组之后访问JSON数组
- linux下qt网络编程 qnetworkreply,QT网络编程之文件下载 QNetworkRequest QNetworkReply QNetworkAccessManager...
- jquery 获取整个表单_15个表单验证jQuery插件和库
- go语言导出oracle数据,Go语言导出内容到Excel的方法
- apache php过期,设置HTTP使用PHP和Apache过期头
- python壁纸4k_别人用钱,而我用python爬虫爬取了一年的4K高清壁纸!真实用!
- php微信公众号项目域名,微信公众号里“JS接口域名”实现分享功能