谷歌地图解析及ArcEngine加载谷歌地图方法
谷歌地图解析及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加载谷歌地图方法相关推荐
- python下载谷歌地图瓦片_openLayers TMS加载谷歌地图瓦片
openLayers TMS中加载谷歌瓦片 经纬坐标(LonLat) 和投影坐标系的转换 /** openLayer根据TMS加载谷歌地图瓦片 (1)先去下载加载谷歌地图瓦片,这样的软件有(水经注 ...
- echarts地图罗平县的json_Echarts 加载省地图json
我想要的效果: 解决步骤: 1.安装引入 npm install echarts import Echarts from 'echarts' // 全局注册Echarts Vue.prototype. ...
- C#+ArcEngine加载mxt地图模板文件
各位看官老爷们,本文主要介绍二种读取mxt文件的方法(与读取mxd文档的方法高度相似).方法如下, 方法1: IMapDocument接口不仅可以对mxd文件(地图文档)进行操作,对待mxt文件(地图 ...
- android瓦片地图下载,Andorid 如何加载 瓦片地图
之前用的高德是这样加载 的 aMap.addTileOverlay(new TileOverlayOptions().tileProvider(new UrlTileProvider(256, 256 ...
- osmdroid 在线加载谷歌瓦片(谷歌地图瓦片地址解释)
osmdroid作为一个开源的项目,在在线地图上还是做的不错,离线地图上也能支持多种格式,例如:zip,sqlite,.mbtiles,gemf,map,gpkg等格式.就是不能直接加载shp文件大为 ...
- OpenLayers教程十一:多源数据加载之用最简单的方式加载瓦片地图
目录 一.加载OpenStreetMap 二.加载Stamen Map 三.加载Bing Map OpenLayers封装了一些瓦片地图源类用于加载瓦片地图,这些类包括: ol.source.OSM ...
- 在线加载谷歌地图—lyrs类型解析
在线加载谷歌地图-lyrs类型解析 最近在用openlayers加载在线谷歌地图的时候总结了一下lyrs之后地图类型解析 m 标准路线图 r 某种改变的路线图(路线不明显) s 影像层(卫星图) y ...
- 在 ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图。
在ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图. Adding sogou map or google map in ArcGIS Engine application WebmapL ...
- 在ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图
在ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图. Adding sogou map or google map in ArcGIS Engine application WebmapL ...
- ios 高德地图加载瓦片地图_OpenLayers加载谷歌地球离线瓦片地图
本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer加载谷歌地球离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/openla ...
最新文章
- html中设置表格单实线,css实现表格实线的方法
- map:erase删除元素之后迭代器失效的问题!(iterator not incrementable)
- 【VC基础】 5、对象相关性(Object Dependencies)
- Python面向对象的三大特性
- 传输层 :TCP/UDP 协议(用于封装接口)
- C语言鸽巢排序pigeonhole sort算法(附完整源码)
- MFC使用http post请求上传文件
- C#面向对象系列(2):构造函数的用法
- SpringCloud_005_Maven中的Scope详解_准备01
- Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)
- Looksery Cup 2015 A. Face Detection
- psd导出切片html 分隔符,PHOTO SHOP里如何能把PSD的自动切成切片?存为HTML格式?
- 什么是DTC?为什么国内外如此火爆
- 阿姆斯特朗回旋加速喷气式阿姆斯特朗炮
- java环境变量classpath的作用_JAVA环境变量中 classpath、path、JAVA_HOME的作用
- [TOG2020](综述)3D Morphable Face Models—Past, Present, and Future
- 通过后台数据在百度地图标记多个点
- linux文件的类型
- XP体系正式退役 电脑迷自述我和XP那10年
- lisp填挖横断面提取_求助,AUTOLISP语言的这个程序流程图怎么写。关于纵横断面绘制的...