一、Google地图切片的投影方式及瓦片索引机制

1.地图投影

Google地图采用的是Web墨卡托投影(如下图),为了方便忽略了两极变形较大的地区,把世界地图做成了一个边长等于赤道周长的正方形(赤道长度为6378137米),原点在正方形中心,即经纬度为(0,0)处。Web墨卡托投影的X,Y坐标取值范围为:[-20037508.3427892,20037508.3427892],对应的经度取值范围为[-180,180],对应的纬度范围则为[-85.05112877980659,85.05112877980659]。具体投影解释请参考墨卡托投影

2.瓦片索引机制

Google 地图的索引机制是 TMS(Tile Map Service)规范的一个变种,其地图瓦片如下图进行索引:

Google 瓦片坐标系:把地球投影后形成的正方形划分为2 的 level(缩放级别) 次幂个地图瓦片,原点在左上角,类似于像素坐标系;详细解释参见Google Maps API 文档

      

TMS瓦片坐标系:TMS与Google的地图瓦片切割方法相同,不同的是TMS的原点在左下角。

转换关系:TMS 与Google 坐标系的X 、Z是相等的,Y 的转换关系为:Y(TMS) +  Y(Google) = Math.pow(2,zoom) - 1

注:关于投影和瓦片索引机制强烈推荐阅读:Tiles à la Google Maps: Coordinates, Tile Bounds and Projection,文中详细分析了地图瓦片涉及各类坐标的转换关系及具体算法,包括瓦片坐标(Google、TMS、Bing QuadTree)、像素坐标、WGS84 经纬度、Mercator 投影平面坐标等。

3.地图缩放级别的分辨率与地图比例尺的关系

地图缩放级别的分辨率(Resolution),是指某缩放级别每个像素代表的实际距离;

地图比例尺(Scale),是指某缩放级别图上一米代表的实际距离;

默认使用屏幕分辨率为96
算法:
dpi=,即表示每英寸96像素,1英寸=.54厘米。
比例尺与分辨率的关系:Scale=Resolution×每米的像素个数,
即有Scale = Resolution×(*)/2.54
则Resolution = Scale*2.54/(*)

二、Google地图瓦片地址解析

1.使用Google Chrome 打开Google地图界面,按F12打开  开发人员工具,如下图:

由图片左侧的url地址可见,只要正确解析地址中的四个参数(x , y , z , s)就可以获取到地图瓦片了。

下面是本人的分析思路:

1.四个参数的含义(x、y、z、s):

x , y 是瓦片坐标系的坐标值,z代表缩放级别,s则共有八个字符:空字符和Galileo的七个字符。

x , y 的值在 z 增加时会按级数递增,而s 的值很可能是 x , y , z 三个参数组合后的从 0 到 7 的一个索引值。

x , y , z 组合后与 8 求余即可得到 s 的值。

2.四个参数的关系:

  • 当 x = 0 时,y 增 1 时,s会同时增 1,与 z 值无关。
  • 当 y = 0 时,x 增 1 时,s会同时增3 ,与 z 值无关。
  • 从上面两条可以得出,x , y 很可能以 3*x + y 的方式组合,然后与 8 求余即得 s。
推测公式为:( 3*x + y )%8 = s 

3.验证

随即抽取几个地址,取其中的 x , y , s代入第二步中的推测公式验证,果然如此。之后怎么折腾这些瓦片地址就看你了。影像地图只是前缀不一样而已。看来以后不用再为找合适的 Google 地图下载器折腾了,你懂的!

4.其它几个参数的含义

1) Google 地图使用了四个服务地址,即 http://mt ( 0—3).google.cn/......,都是可以用滴。

2) url地址中的 lyrs 表示的是图层类型,即瓦片类型,具体含义如下:

地图瓦片类型验证,直接修改lyrs参数的值即可:http://mt2.google.cn/vt/lyrs=y@258000000&hl=zh-CN&gl=CN&src=app&x=214130&y=114212&z=18&s=Ga

m:路线图
t:地形图
p:带标签的地形图
s:卫星图
y:带标签的卫星图
h:标签层(路名、地名等)

3) 暂时未发现 "&s=..." 的意义,url有无此后缀都不影响瓦片地址的访问。

扩展阅读:

1.墨卡托投影经纬度与平面坐标转换公式

后记:此文只是提供了一种方法,google 地图切片地址的算法及前缀都可能会不断调整。

三、GMap.NET

GMap.NET - Great Maps for Windows Forms & Presentation

一个非常强大的开源地图项目(winform版),对于解析Google等地图服务的算法相当不错。

GMap.NET is great and Powerful, Free, cross platform, open source .NET control.

Enable use routing, geocoding, directions and maps from Coogle, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac, Yandex, Mapy.cz, Maps.lt, iKarte.lv, NearMap, OviMap, CloudMade, WikiMapia in Windows Forms & Presentation, supports caching and runs on windows mobile!

原文链接:Google 地图切片URL地址解析

Google 地图切片URL地址解析的更多相关文章

  1. google地图的url参数

    Google Maps Intents for Android The Google Maps app for Android exposes several intents that you can ...

  2. JavaScript一个google地图获取

    <script type="text/javascript"> /** * 返回一个新创建的<img>元素,该元素用于在获取到地理位置信息后,显示一张Goo ...

  3. Flex加载google地图、百度地图以及天地图作底图

    一  Flex加载Google地图作底图 (1)帮助类GoogleLayer.as /* * 根据输入的地图类型加载Google地图(by chenyuming) */ package Layers ...

  4. ArcGIS API for Silverlight加载google地图(后续篇)

    原文:ArcGIS API for Silverlight加载google地图(后续篇) 之前在博客中(http://blog.csdn.net/taomanman/article/details/8 ...

  5. ARCGIS FLEX API加载google地图、百度地图、天地图(转)

    http://www.cnblogs.com/chenyuming507950417/ Flex加载google地图.百度地图以及天地图作底图 一  Flex加载Google地图作底图 (1)帮助类G ...

  6. 如何使用google地图的api(整理)

    如何使用google地图的api(整理) 一.总结 一句话总结:直接用script标签引google地图api即可. 1.如何使用google地图的api? 页面引用javascript文件<s ...

  7. 根据google地图抓去全国信息- 抓去全国小区以及新建楼盘信息

    本案例由于google每天每个账户能post20000次所以我们需要相对较长的时间来抓去google的数据信息. 主要思路:通过一定的zoom一个相对较大的zoom.我们尽可能的搜索我们的所有数据. ...

  8. Google地图实现

    API地址:https://developers.google.com/maps/documentation/javascript/tutorial <div id="map" ...

  9. 网页中嵌入google地图

    一丶前言 大致需求:美国地图中标记分布的仓库图钉(鼠标经过显示地址详情),通过输入寄收件地邮编来在地图上定位位置添加图钉,将寄件地,选择的仓库,收件地图钉折线相连接,表示大致路线. 一丶google开 ...

随机推荐

  1. java设计模式-----15、适配器模式

    概念: Adapter模式也叫适配器模式,是构造型模式之一,通过Adapter模式可以改变已有类(或外部类)的接口形式. 举个例子:我们使用电脑,家里的电源是220V的,而我们的电脑是18V的,这时如 ...

  2. [h5+api]移动app开发用到的微信好友,朋友圈,qq好友,新浪微博分享合集

    适用H5+环境,能够使用plus方法的移动app中 /** * Created by HBuilder. * User: tyx * Date: 2018-11-21 * Time: 17:28:51 ...

  3. android studio使用openssl

    前言 逆向的基础是开发, 逆向分析时很多时候会使用一些公开的加密函数来对数据进行加密,通过使用 openssl 熟悉下. 正文 首先得先编译出来 openssl,然后把它们复制到你的工程目录下. in ...

  4. 使用sa-jdi.jar dump 内存中的class

    前言 在分析一个 jar 包时发现他把关键类采用了运行时使用 classloader 的方式加载了.懒得分析算法了,可以使用 jdk 自带的工具 dump 出需要的class. 正文 从运行的java ...

  5. oracle 中的角色

    conn sys as sysdba;create role testrole;grant create session, create table, unlimited tablespace to ...

  6. Mongodb的入门(1)window安装mongodb

    mongodb: Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数 ...

  7. CSS 小结笔记之元素的隐藏与显示

    在网站上经常会有一些需要一定操作才会显示或隐藏的元素,这时会用到元素的隐藏与显示.主要通过以下三种属性实现. 1.display :none|block |inline |inline-block d ...

  8. how webpack Hot Module Replacement works

    https://medium.com/@rajaraodv/webpack-hot-module-replacement-hmr-e756a726a07

  9. MySQL Bug导致异常宕机的分析流程

    原文链接:http://click.aliyun.com/m/42521/ 摘要: 本文主要通过一个bug来记录一下如何分析一个MySQL bug的崩溃信息. 版本:Percona 5.7.17-11 ...

  10. spring boot 在jdk 1.7下使用 commandLineRunner

    在spring boot 中有一段代码,使用的是java 1.8的语法: @Bean public CommandLineRunner commandLineRunner(ApplicationCon ...