谷歌地图解析及ArcEngine加载谷歌地图方法

  • 前言
  • 1.简介
  • 2.获取切片地址
  • 3.经纬度与切片的相互转换
  • 4.缩放级别Z的计算
    • 4.1 比例尺比较法
    • 4.2 最大切片数量法
  • 5.结束语

前言

上一章介绍了ArcGIS加载天地图的方法。然后谷歌地图确是ArcGIS目前没有支持的,网上也有一些工具可以添加到ArcMap的toolbox中从而实现加载谷歌地图。那么在ArcEngine开发中,该如何实现谷歌地图的加载呢?具体代码下载,各位看官可戳这里
接下来将从实现原理展开介绍

1.简介

谷歌地图采用的是web墨卡托投影,坐标系为WGS84坐标系,为了方便忽略了两极变形较大的地区,把世界地图做成了一个边长等于赤道周长的正方形(赤道半径为6378137米),原点在正方形中心,即经纬度为(0,0)处。Web墨卡托投影的X,Y坐标取值范围为:[-20037508.3427892,20037508.3427892],对应的经度取值范围为[-180,180],对应的纬度范围则为[-85.05112877980659,85.05112877980659]
参考自:Google 地图切片URL地址解析_GIS 随笔-CSDN博客

2.获取切片地址

打开谷歌地图,地址:http://www.rivermap.cn/google_view.html


点击F12,通过变化地图,可在后侧NetWork——All中检测到刚刚的操作访问到的网址,选择其中一个网址(也可直接双击打开),在右侧PreView可进行切片预览,点击Header,可获得该网址的具体信息(如下所示),其中Request URL即为我们需要下载的切片的地址。

众所周知,谷歌系列产品在国内向来不太友好,因此谷歌地图的切片地址也是有可能变化的,但是万变不离其中,类型标签与切片计算方法是基本不变的。

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

2020年12月份左右,谷歌地图的各类地址规则如下

switch (type)
{case "地形":uri = new Uri($"http://mt3.google.cn/vt/lyrs=t@131,r@227000000&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}&s=Galile");break;case "高程"://谷歌电子地图uri = new Uri($"http://mt3.google.cn/vt/lyrs=m@207000000&hl=zh-CN&gl=CN&src=app&x={x}&y={y}&z={z}&s=Galile");break;case "影像":default:uri = new Uri($"http://mt3.google.cn/vt/lyrs=y@126&hl=zh-CN&gl=cn&src=app&s=G&x={x}&y={y}&z={z}");break;
}

其中,x代表切片的横坐标,y代表切片的纵坐标,z代表缩放级别,mt3代表切片存储的服务器,我尝试过换成mt0,mt1,mt2结果其实都是一致的,只是不同服务器上的相同切片罢了,猜测谷歌地图采用的是一种并发访问机制。

然而,到了2021年,在写这篇博文时发现由于某些原因,谷歌地图貌似被禁了,访问慢不说(当然也不排除我的网速问题),切片请求地址也发生了变化,但是从下面两张图也可以发现,谷歌地图的访问地址是非常相似的,切换type标签基本上就够了,如果切换标签也无法获取切片,那么方法和上述一样,访问该类型的地图,用F12获取切片地址规律

3.经纬度与切片的相互转换

class GoogleTile
{public double x { get; set; }public double y { get; set; }public int z { get; set; }/// <summary>/// 经纬度转切片/// </summary>/// <param name="x"></param>/// <param name="y"></param>/// <param name="z"></param>/// <returns></returns>public static GoogleTile XyToTile(double x, double y, int z){return new GoogleTile(){x = LonToX(x, z),y = LatToY(y, z),z = z};}/// <summary>/// 纬度转切片y/// </summary>/// <param name="lat"></param>/// <param name="zoom"></param>/// <returns></returns>public static double LatToY(double lat, int zoom){return Convert.ToDouble(Math.Floor((1 - Math.Log(Math.Tan(lat * Math.PI / 180) + 1 / Math.Cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.Pow(2, zoom)));}/// <summary>/// 经度转切片x/// </summary>/// <param name="lon"></param>/// <param name="zoom"></param>/// <returns></returns>public static double LonToX(double lon, int zoom){return Convert.ToDouble(Math.Floor((lon + 180) / 360 * Math.Pow(2, zoom)));}/// <summary>/// 切片x转经度/// </summary>/// <param name="x"></param>/// <param name="zoom"></param>/// <returns></returns>public static double XToLon(double x, int zoom){return Convert.ToDouble(x / Math.Pow(2, zoom) * 360 - 180);}/// <summary>/// 切片y转纬度/// </summary>/// <param name="y"></param>/// <param name="zoom"></param>/// <returns></returns>public static double YToLat(double y, int zoom){return Convert.ToDouble((Math.Atan(Math.Pow(Math.E, (1 - 2 * y / Math.Pow(2, zoom)) * Math.PI)) - Math.PI / 4) * 2 * 180 / Math.PI);}}

4.缩放级别Z的计算

4.1 比例尺比较法

20 : 1128.497220
19 : 2256.994440
18 : 4513.988880
17 : 9027.977761
16 : 18055.955520
15 : 36111.911040
14 : 72223.822090
13 : 144447.644200
12 : 288895.288400
11 : 577790.576700
10 : 1155581.153000
9  : 2311162.307000
8  : 4622324.614000
7  : 9244649.227000
6  : 18489298.450000
5  : 36978596.910000
4  : 73957193.820000
3  : 147914387.600000
2  : 295828775.300000
1  : 591657550.500000

上述为arcgis官网提供的谷歌地图缩放级别与比例尺的关系
参考链接
可通过求当前比例尺与上述数组的差值,取最小差值对应的缩放级别

4.2 最大切片数量法

采用比例尺比较的方法,确实可以选出合适的切片,实现缩放效果,但是可能会导致需要加载的切片数量过多,加载缓慢,因此可以通过限制最大切片数量的方法进行加载,具体代码如下:

private void CalculateZ(ref GoogleTile pmin, ref GoogleTile pmax)
{var env = MapControl.ActiveView.Extent;//确保是比较的wgs84坐标系的环境if (MapControl.SpatialReference.Name != WgsRefer.Name){var ref2 = CoorCalculate.GetRefByWkid(4326, true);env.Project(ref2);}for (var i = 22; i >= 0; i--){pmin = GoogleTile.XyToTile(env.XMin, env.YMax, (int)i);pmax = GoogleTile.XyToTile(env.XMax, env.YMin, (int)i);//切片数量不大于3if (pmax.y - pmin.y < 3)break;}
}

5.结束语

由于某些原因,谷歌地图在国内的环境确实不算友好,经常出现无法访问的情况,因此,若是在项目中使用在线地图,还是建议大家支持国产的地图,如天地图,百度地图等。

谷歌地图解析及ArcEngine加载谷歌地图方法相关推荐

  1. python下载谷歌地图瓦片_openLayers TMS加载谷歌地图瓦片

    openLayers  TMS中加载谷歌瓦片  经纬坐标(LonLat) 和投影坐标系的转换 /** openLayer根据TMS加载谷歌地图瓦片 (1)先去下载加载谷歌地图瓦片,这样的软件有(水经注 ...

  2. echarts地图罗平县的json_Echarts 加载省地图json

    我想要的效果: 解决步骤: 1.安装引入 npm install echarts import Echarts from 'echarts' // 全局注册Echarts Vue.prototype. ...

  3. C#+ArcEngine加载mxt地图模板文件

    各位看官老爷们,本文主要介绍二种读取mxt文件的方法(与读取mxd文档的方法高度相似).方法如下, 方法1: IMapDocument接口不仅可以对mxd文件(地图文档)进行操作,对待mxt文件(地图 ...

  4. android瓦片地图下载,Andorid 如何加载 瓦片地图

    之前用的高德是这样加载 的 aMap.addTileOverlay(new TileOverlayOptions().tileProvider(new UrlTileProvider(256, 256 ...

  5. osmdroid 在线加载谷歌瓦片(谷歌地图瓦片地址解释)

    osmdroid作为一个开源的项目,在在线地图上还是做的不错,离线地图上也能支持多种格式,例如:zip,sqlite,.mbtiles,gemf,map,gpkg等格式.就是不能直接加载shp文件大为 ...

  6. OpenLayers教程十一:多源数据加载之用最简单的方式加载瓦片地图

    目录 一.加载OpenStreetMap 二.加载Stamen Map 三.加载Bing Map OpenLayers封装了一些瓦片地图源类用于加载瓦片地图,这些类包括: ol.source.OSM  ...

  7. 在线加载谷歌地图—lyrs类型解析

    在线加载谷歌地图-lyrs类型解析 最近在用openlayers加载在线谷歌地图的时候总结了一下lyrs之后地图类型解析 m 标准路线图 r 某种改变的路线图(路线不明显) s 影像层(卫星图) y ...

  8. 在 ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图。

    在ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图. Adding sogou map or google map in ArcGIS Engine application WebmapL ...

  9. 在ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图

    在ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图. Adding sogou map or google map in ArcGIS Engine application WebmapL ...

  10. ios 高德地图加载瓦片地图_OpenLayers加载谷歌地球离线瓦片地图

    本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer加载谷歌地球离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/openla ...

最新文章

  1. html中设置表格单实线,css实现表格实线的方法
  2. map:erase删除元素之后迭代器失效的问题!(iterator not incrementable)
  3. 【VC基础】 5、对象相关性(Object Dependencies)
  4. Python面向对象的三大特性
  5. 传输层 :TCP/UDP 协议(用于封装接口)
  6. C语言鸽巢排序pigeonhole sort算法(附完整源码)
  7. MFC使用http post请求上传文件
  8. C#面向对象系列(2):构造函数的用法
  9. SpringCloud_005_Maven中的Scope详解_准备01
  10. Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)
  11. Looksery Cup 2015 A. Face Detection
  12. psd导出切片html 分隔符,PHOTO SHOP里如何能把PSD的自动切成切片?存为HTML格式?
  13. 什么是DTC?为什么国内外如此火爆
  14. 阿姆斯特朗回旋加速喷气式阿姆斯特朗炮
  15. java环境变量classpath的作用_JAVA环境变量中 classpath、path、JAVA_HOME的作用
  16. [TOG2020](综述)3D Morphable Face Models—Past, Present, and Future
  17. 通过后台数据在百度地图标记多个点
  18. linux文件的类型
  19. XP体系正式退役 电脑迷自述我和XP那10年
  20. lisp填挖横断面提取_求助,AUTOLISP语言的这个程序流程图怎么写。关于纵横断面绘制的...

热门文章

  1. 关于Coolie编码
  2. win7计算机窗口无法最小化,Windows7系统任务栏不显示最小化窗口的解决方法
  3. 大数据分析案例-用RFM模型对客户价值分析(聚类)
  4. SPSS作业-一元线性回归
  5. 跨国公司怎样面试应聘者
  6. windows7在无法访问Internet的情况下,修改公共网络为家庭网络(或工作网络)
  7. 树莓派python串口收发数据
  8. 【java】PageHelper.startPage
  9. Python股票量化交易(一)
  10. 毕业设计:深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序