首页 > 编程语言 >Google tile 和 TMS 的索引算法

Google tile 和 TMS 的索引算法

时间:2023-07-26 16:35:08浏览次数:43  
标签:Google 经纬度 索引 TMS 编号 tile

Google tile和TMS的索引算法

TMS是tile map service的缩写,是一种瓦片地图服务,也称之为WMTS(web map tile service),具体的标准可以见 OGC网站。TMS的算法很简单,就是把投影后的世界地图按照层级进行四叉树(待验证)切割,切割后的瓦片数量随层级呈金字塔型,数量和层级关系如下表所示:

 

对这些瓦片进行编号,由于瓦片编号的规律性(平面直角坐标系),加上投影也是一种算法(球形展开成平面),所以,编号和坐标之间就建立了一种索引关系,通过编号可以得到经纬度区间,通过经纬度可以找到瓦片的编号,具体的计算公式如下:
n = 2 ^ zoom
xtile = ((lon_deg + 180) / 360) * n
ytile = (1 - (log(tan(lat_rad) + sec(lat_rad)) / π)) / 2 * n
由公式可以看出,只要确定经纬度和层级,就可以得到瓦片的编号索引,相反,若知道编号就可以去推算未知的经纬度了,其计算公式如下:
n = 2 ^ zoom
lon_deg = xtile / n * 360.0 - 180.0
lat_rad = arctan(sinh(π * (1 - 2 * ytile / n)))
lat_deg = lat_rad * 180.0 / π
所以:一、显示地图的时候就可以根据中心坐标和层级以及bound范围,就可以确定需要加载那些地图瓦片;二、mark一个point的时候,根据point的经纬度以及tile的经纬度范围,就可以确定point在某一tile的像素坐标位置,而tile同bound之间又有像素关系,所以point就可以mark到map的bound上了;三、同二相反,鼠标在bound上单机,也就可以得到具体的经纬度信息了。这应该是webmap引擎实现丰富多样地图效果的基础吧,包括线、面、地图叠加等更多功能。

我从网上找了一段开源的代码,重新组了一下,可以通过在线的方式获得编号同经纬度之间的正反算了,体验网址: http://rovertang.com/labs/tileindex/,你输入经纬度并选择层级后就可以得到Google tile和TMS的瓦片索引编号了,效果如下图:

Google tile 和 TMS 的索引算法_离线

需要说明的是,Google tile同TMS有差别,原因是:Google tile的直角坐标系原点在左上角(即北极点同中央子午线的交点),而TMS的原点在左下角(南极点同中央子午线的交点)。所以:编号索引中的x轴不变,y轴略有变化,结果为该列所有tile减去y再减去1,公式就不再罗列了,可以直接查看我提供的网址分析源代码吧。我们以上海世博演艺中心(现为梅赛德斯奔驰演艺中心)的坐标来演示一下Google tile和TMS的索引差异吧,经过计算,在14层级下,Google tile的x和y分别为13721和6696,而TMS的x和y为13721和9687,两者的tile网址可访问这两个连接: http://mt0.google.com/vt/lyrs=m@174000000&hl=zh-CN&src=app&x=13721&s=&y=6696&z=14&s=Galileo和 http://rovertang.com/labs/GMAPIv3_Offline/expotile/14/13721/9687.png,后者是我通过maptiler工具切割的世博地图tile(在上次的 Google Maps API v3离线开发包一文中我有提供下载,现增加演示网址: http://rovertang.com/labs/GMAPIv3_Offline/),两者对比如下:

 


Google tile 和 TMS 的索引算法_google tile_02

BTW:如果你需要更多的将TMS算法公式变为可执行代码,那么请参考OSM的wiki: Slippy map tilenames,文中提供了python、perl、PHP、.net等语言的code,有兴趣的可以参考一下。
-----------------------------------
Google tile 和 TMS 的索引算法
https://blog.51cto.com/u_13946099/6432332

标签:Google,经纬度,索引,TMS,编号,tile
From: https://www.cnblogs.com/aoldman/p/17582833.html

相关文章

  • Google开源库Textfsm使用文档(中文翻译)
    TextFSM介绍TextFSM是一个Python模块,实现了一个基于状态机的模板,用来解析半格式化的文本。最初开发的目的是允许程序化地获取来源于CLI驱动设备的输出信息,例如网络路由器或交换机,不过它可以被用作任何这种类型的文本输出。这个引擎需要两个输入:一个模板文件和文本输入(比......
  • Cloud Ace 成为 Google Cloud Next '23 联合赞助商
    CloudAce是谷歌云全球战略合作伙伴,拥有300多名工程师,也是谷歌最高级别合作伙伴,多次获得GoogleCloud合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。CloudAce,Inc.(总部位于东京千代田区;总裁青木诚;以下简称“CloudAce”)将成......
  • mysql8 QUANTILE
    如何实现mysql8QUANTILE简介在mysql8中,QUANTILE函数用于计算指定分位数的值。它可以帮助我们分析数据集的分布情况。在本文中,我将向你介绍如何使用mysql8的QUANTILE函数。准备工作在开始之前,确保你已经安装了mysql8,并且已经连接到数据库。实现步骤步骤操作1创建测......
  • Unity编辑模式 一键获取Tilemap的格子信息
    动机由于地图是使用unitytilemap编辑的,服务端也希望获取一份相关的信息。相较于自己写个编辑器,直接利用unity的能力会更加敏捷。效果展示只需要将组件拖拽到含有Tilemap组件的GameObj上面,就可以点击按钮,获取格子信息。源码展示[CustomEditor(typeof(TilemapTool))][CanEdi......
  • TMS 运输管理系统(转)
      司机端和管理后台(运输系统)业务流程:管理后台(运输系统),新增委托订单录入应收费用===》进行对帐(收款、开票)===》新增调度单关联委托订单货物===》指定车辆,司机,中转信息等===》选择运输类型(有三种:整车、散货、集装箱)===》提交调度单===》司机端领取任务===》司机确认领取=......
  • Google 最高级别工程师的教育梦
    阅读文本大概需要2.8分钟。之前有读者问我,说我是不是Udacity的人,怎么老在底部放Udacity的Banner,这让我无言以对,我当然不是Udacity的人,Udacity是我的赞助商,正是这些赞助商爸爸们,才能让我有动力继续分享下去,所以我很感激他们。可能有人并不了解Udacity,其实Udacity的创立......
  • 你知道 Google X 神秘实验室创始人的故事么?
    阅读文本大概需要2.8分钟。之前有读者问我,说我是不是Udacity的人,怎么老在底部放Udacity的Banner,这让我无言以对,我当然不是Udacity的人,Udacity是我的赞助商,正是这些赞助商爸爸们,才能让我有动力继续分享下去,所以我很感激他们。可能有人并不了解Udacity,其实Udacity的创立......
  • 终于,J 神还是加入了 Google!
    昨天晚上刷推,看到这么一条消息:你要问我惊讶不惊讶,我其实并没有这么惊讶,上次J神离职我发布了一篇文章「Android之神JakeWharton从Square离职!」,就猜想J神的下一站可能就是Google了,只是我没想到,动作竟然这么快,从上次离职到今天入职也才一个月的时间不到,我们再结合当初J......
  • Google 编程之夏:海量优质项目,丰厚报酬,你竟然还不知道?
    阅读文本大概需要6.66分钟。你听过GSoC么?我想绝大部分人都没听过。GSoC全称是GoogleSummerofCode,即Google编程之夏,GSoC是很多学生朋友们的福音,参加这个项目绝对会让自己收获巨大,甚至是很多人在硅谷混的一个启蒙之路,可惜的是,国内没多少人知道这个项目,那么今天我就带大家......
  • 关于 Workspace Tile 上的数据展示不正确的问题
    在所有其它问题都排除的情况下(即属性设置均正确),无法刷新正确的数据的原因应该是SysDataCacheConfigurationTable的数据有问题。因为在第一次同步数据库时,如果tile对应的query属性不正确,这个表的相关记录便被锁定了。此表只会存储第一次同步数据库时,传入的query信息,tile会根据......