GoogleMap和高德地图加载瓦片最新的瓦片图地址是用什么加密或者压缩

用DotSpatial下载谷歌瓦片图并展示到地图控件上
时间: 19:09:02
&&&& 阅读:153
&&&& 评论:
&&&& 收藏:0
标签:上一篇文章讲解如何加载各地图的WMS地图服务。虽然不涉及到瓦片,但是每次地图刷新都要请求网络,造成不小的网络负载。虽然判断视野是否改变确定是否请求网络来减小网络负载,但是这个方法仍然不理想。
谷歌的地图底图自带高程视觉,公路分级样式、行政区域分级样式、地图数据即时的更新速度等等优点,让人觉得有必要开发一个地图下载器。虽然谷歌本身被墙,但是谷歌地图还是可以访问的。地址如下:
(可以手动输入:)
一、新建WinForm项目
谷歌已经关闭了开发者API,现在只能自己动手做一个了。下面仍然新建一个WinForm程序,增加对DotSpatial的引用,加入DotSpatial控件,代码如下:
using DotSpatial.C
using DotSpatial.D
using DotSpatial.P
using DotSpatial.T
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Threading.T
using System.Windows.F
namespace GoogleWmts
public partial class MainForm : Form
private Map mapC
private ProjectionInfo currentP
public const double WUHAN_WGS84_COORDINATE_Y = 30.883124;
public const double WUHAN_WGS84_COORDINATE_X = 114.419915;
private Coordinate wuhanC
public Size lastS
public MainForm()
mapCtrl = new Map()
Size = new Size(0, 0),
Dock = DockStyle.Fill,
FunctionMode = FunctionMode.Pan
InitProjection();
InitializeComponent();
Controls.Add(mapCtrl);
private void InitProjection()
currentProjection = ProjectionInfo.FromEpsgCode(2432);
var xy = new double[2] { WUHAN_WGS84_COORDINATE_X, WUHAN_WGS84_COORDINATE_Y };
var z = new double[1];
Reproject.ReprojectPoints(xy, z, KnownCoordinateSystems.Geographic.World.WGS1984, currentProjection, 0, 1);
wuhanCoordinate = new Coordinate(xy);
}很遗憾的是DotSpatial内建的坐标系统并不支持Google的900913坐标系,这里我使用Beijing1954坐标系,中央经线是105度,EPSG的CRSID是2432,预定义武汉的经纬度,用于设定地图初始化视野。currentProjection定义当前地图控件使用的坐标系。天地图、OSM地图、腾讯地图、谷歌的地图都是基于分辨率设定视野,因此新建一个ResolutionLayer类型的图层,以便通用,代码如下:
using DotSpatial.C
using DotSpatial.D
using DotSpatial.P
using DotSpatial.S
using DotSpatial.T
using System.Collections.G
using System.D
using System.IO;
using System.L
using System.N
using System.Runtime.InteropS
using System.T
using System.Threading.T
namespace GoogleWmts
class ResolutionLayer : Layer, IMapLayer
public const double GOOGLE_ORIGIN_X = -7892;
public const double GOOGLE_ORIGIN_Y = 7892;
public const int TILE_WIDTH = 256;
public const int TILE_HEIGHT = 256;
public const int SCREEN_MILLIMETER_WIDTH = 564;
public const int SCREEN_PIXEL_WIDTH = 1600;
public const int MAX_ZOOM_LEVEL = 18;
private Dictionary&int, double&
string urlFormat = &http:&hl=zh-CN&gl=cn&x={0}&y={1}&z={2}&s=Galil&;//X瓦图号,Y瓦片号,比例尺缩放层级
private Extent defaultE
public int ZoomLevel { }
public Size WindowSize { }
public bool WindowCreated { }
public bool IsBusy { }
public ResolutionLayer()
defaultExtent = new Extent(-, -, , );
InitDirectory();
SetResolutionsByMath();
private void InitDirectory()
var rpt = @&Tiles\Google\&;
if (!Directory.Exists(rpt))
Directory.CreateDirectory(rpt);
for (var i = 0; i &= MAX_ZOOM_LEVEL; i++)
var rp = rpt + @&\& +
if (!Directory.Exists(rp))
Directory.CreateDirectory(rp);
public override Extent Extent
return defaultE
}GOOGLE_ORIGIN_X与GOOGLE_ORIGIN_Y两个常量记录谷歌地图的坐标原点,TILE_WIDTH与TILE_HEIGHT两个常量记录单个瓦片图文件的像素大小。SCREEN_MILLIMETER_WIDTH常量记录当前显示屏幕的物理大小。我当前的显示屏是19吋,物理大小是564毫米,请朋友在使用之前务必改成您自己的显示屏幕的物理大小。SCREEN_PIXEL_WIDTH常量记录的是当前显示屏的素大小。如果您不知道您当前显示设备的像素大小,请查看显示屏属性,找到当前设置的分辨率。我当前的显示屏幕是1600像素的宽度,请朋友在使用之前务必改成你自己的屏幕的分辨率宽度。这里提供一个简单的方法获取屏幕物理大小与像素大小,代码如下:
[DllImport(&gdi32.dll&, EntryPoint = &GetDeviceCaps&, CallingConvention = CallingConvention.Winapi)]
public static extern int GetDeviceCaps(IntPtr hdc, int code);
public const int HORZSIZE = 4;
var g = CreateGraphics();
var millimeterLength = NativeAPI.GetDeviceCaps(g.GetHdc(), NativeAPI.HORZSIZE);
var pixelLength = Screen.PrimaryScreen.Bounds.W
g.Dispose();
MAX_ZOOM_LEVEL是最大缩放级别,也就是街道级别。resolutions是各层级比例尺下的分辨率。defaultExtent是给DotSpatial计算图层最大视野用的。此变量必须给,否则看不到地图。这与DotSpatial计算视野,确定窗口更新区域的算法有关系。放在这里吧。ZoomLevel 是当前缩放级别,WindowSize记录窗体的实际大小,WindowCreated指示窗口是否已经创建成功。IsBusy指示图层当前是否正在下载瓦片图。如果正在下载中,那么不响应用户放大、缩小、移动等地图操作。InitDirectory方法设定瓦片的存储路径,组织方式是在当前软件的文件夹下新建一个Tiles文件夹,再新建一个Google文件夹,然然针对每一个比例尺新建文件夹,瓦片图文件名称以瓦片索引命名。
谷歌地图的分辨率可能通过计算的方法获取,代码如下:
private void SetResolutionsByMath()
resolutions = new Dictionary&int, double&();
for (var i = 1; i &= MAX_ZOOM_LEVEL; i++)
resolutions.Add(i, 7892 * 2 / 256 / Math.Pow(2, i));
二、坐标转换
上面说过,DotSpatial不支持Google的900913坐标系,那么必须进行坐标转换。在这里我使用Proj.4 C++库,并封装一个Win32动态库给C#调用,C++的调用Proj.4的代码如下:
typedef __declspec(dllexport) struct _COORDINATE
}COORDINATE, *PCOORDINATE;BRIDGE_API BOOL proj4_transform(PCSTR proj4_from, PCSTR proj4_to, COORDINATE* coordinate)
if (proj4_from == nullptr || strlen(proj4_from) & 5)
return FALSE;
if (proj4_to == nullptr || strlen(proj4_to) & 5)
return FALSE;
projPJ from = pj_init_plus(proj4_from);
projPJ to = pj_init_plus(proj4_to);
if (from == nullptr || to == nullptr)
return FALSE;
int code = pj_transform(from, to, 1, 1, &coordinate-&x, &coordinate-&y, &coordinate-&z);
}C#调用代码如下:
using System.Collections.G
using System.L
using System.Runtime.InteropS
using System.T
using System.Threading.T
namespace GK.Collector.Server.Entity.DllImports
[StructLayout(LayoutKind.Explicit)]
public struct COORDINATE
[FieldOffset(0)]
[FieldOffset(8)]
[FieldOffset(16)]
[FieldOffset(24)]
[FieldOffset(32)]
[DllImport(&bridge.dll&, EntryPoint = &proj4_transform&, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern bool Proj4Transform(string proj4From, string projTo, IntPtr coordinate);
public static bool Transform(double[] xyz, string proj4From, string proj4To = &&)
if (xyz.Length & 3)
if (string.IsNullOrWhiteSpace(proj4From))
if (string.IsNullOrWhiteSpace(proj4To))
proj4To = & +proj=longlat +datum=WGS84 +no_defs&;
var c = new COORDINATE() { x = xyz[0], y = xyz[1], z = xyz[2] };
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(c));
Marshal.StructureToPtr(c, ptr, true);
Proj4Transform(proj4From, proj4To, ptr);
c = (COORDINATE)Marshal.PtrToStructure(ptr, typeof(COORDINATE));
Marshal.FreeHGlobal(ptr);
xyz[0] = c.x;
xyz[1] = c.y;
xyz[2] = c.z;
}把常用的坐标系设定为字符串常量,以方便使用,代码如下:
public const string BJ2432_PROJ = &+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs &;
public const string WORLD3857_PROJ = &+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m
+no_defs&;
public const string GOOGLE_PROJ = &+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m
+no_defs &;
public const string WGS84_PROJ = &+proj=longlat +datum=WGS84 +no_defs &;
三、计算瓦片索引并下载
瓦片索引的计算是重中之重。其中包括瓦片对齐到用户窗口,避免地图移位、拖动不顺畅的问题,代码如下:
/// &summary&
/// 获取瓦片图索引以及偏移
/// &/summary&
/// &param name=&cxy&&原始坐标&/param&
/// &param name=&txy&&瓦片图索引&/param&
/// &param name=&rxy&&偏移&/param&
private void GetTileIndexByCoordinate(double[] cxy, int[] txy, double[] rxy)
var z = new double[1];
var coef = resolutions[ZoomLevel] * TILE_WIDTH;
var wgs84Proj = KnownCoordinateSystems.Geographic.World.WGS1984;
//DotSpatial.Projections.Reproject.ReprojectPoints(cxy, z, Projection, wgs84Proj, 0, 1);
//cxy[0] = cxy[0] * 7892 / 180;
//cxy[1] = Math.Log(Math.Tan((90 + cxy[1]) * Math.PI / 360)) / (Math.PI / 180);
//cxy[1] = cxy[1] * 7892 / 180;
Transform(cxy, BJ2432_PROJ, GOOGLE_PROJ);
txy[0] = (int)((cxy[0] - GOOGLE_ORIGIN_X) / coef);
txy[1] = (int)((GOOGLE_ORIGIN_Y - cxy[1]) / coef);
rxy[0] = (cxy[0] - GOOGLE_ORIGIN_X) / coef - txy[0];
rxy[1] = (GOOGLE_ORIGIN_Y - cxy[1]) / coef - txy[1];
}得到瓦片索引就可以下载了。用WebClient直接下载发现被谷歌屏蔽,通过Fiddler抓包工具发现可以顺利通过谷歌验证的HTTP包,代码如下:
private Image GetImageByWebClient(double tilex, double tiley)
var rp = @&Tiles\Google\& + ZoomLevel + @&\& + tilex + &_& + tiley + &.png&;
if (File.Exists(rp))
var tb = Image.FromFile(rp);
//Console.WriteLine(rp);
string url = string.Format(urlFormat, tilex, tiley, ZoomLevel);
//Console.WriteLine(url);
var downloader = new WebClient();
downloader.Headers.Add(&Upgrade-Insecure-Requests: 1&);
downloader.Headers.Add(&User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0. Safari/537.36&);
downloader.Headers.Add(&Accept: text/html,application/xhtml+xml,application/q=0.9,image/webp,*/*;q=0.8&);
downloader.Headers.Add(&Accept-Encoding: gzip, deflate, sdch&);
downloader.Headers.Add(&Accept-Language: zh-CN,q=0.8&);
var bts = downloader.DownloadData(url);
var str = new MemoryStream(bts);
var img = Image.FromStream(str);
img.Save(rp);
str.Close();
str.Close();
catch (Exception e)
Console.WriteLine(e.Message);
downloader.Dispose();
四、拼接瓦片图
拼接瓦片图的核心思想是找到左下角坐标对应的瓦片图索引与右上角坐标的瓦片图索引,通过一个循环就可以找到所有需要的瓦片图,并与文件系统已经存储的瓦片图缓存比对,缺少的就下载,已经有的就读取本地文件,代码如下:
public void DrawRegions(MapArgs args, List&DotSpatial.Data.Extent& regions)
if (!WindowCreated || WindowSize.Width &= 160 || WindowSize.Height &= 30)
var img = new Bitmap(args.ImageRectangle.Width, args.ImageRectangle.Height);
var g = Graphics.FromImage(img);
var resolution = resolutions[ZoomLevel];
var toffset = new double[2];
foreach (var region in regions)
var leftxy = new double[3] { region.MinX, region.MinY, 0 };
var txy = new int[2];
var rxy = new double[2];
toffset[0] = -1;
toffset[1] = -1;
GetTileIndexByCoordinate(leftxy, txy, rxy);
for (var i = region.MinX; i & region.MaxX; i += resolution * TILE_WIDTH)
for (var j = region.MinY; j & region.MaxY ; j += resolution * TILE_HEIGHT)
var tb = GetImageByWebClient(txy[0] + toffset[0], txy[1] + toffset[1]);
var tx = Convert.ToInt32((toffset[0] - rxy[0]) * TILE_WIDTH);
var ty = Convert.ToInt32((toffset[1] - rxy[1]) * TILE_HEIGHT);
g.DrawImage(tb, tx, ty);
toffset[1]++;
toffset[0]++;
toffset[1] = 0;
args.Device.DrawImage(img, 0, 0);
g.Dispose();
img.Dispose();
}下面两个方法用来计算有效的视野,给地图初始化之用,代码如下:
public Extent GetAvailableExtent(Coordinate center, Size rc)
var ext = new Extent();
var horizontal = resolutions[ZoomLevel] * rc.W
var vertical = resolutions[ZoomLevel] * rc.H
ext.MinX = center.X - horizontal / 2;
ext.MinY = center.Y - vertical / 2;
ext.MaxX = center.X + horizontal / 2;
ext.MaxY = center.Y + vertical / 2;
public void GetDistance(double[] xy)
var resolution = resolutions[ZoomLevel];
xy[0] = xy[0] *
xy[1] = xy[1] *
}至此瓦片图图层完成。
五、瓦片图地图函数
DotSpatial地图控件默认没有比例尺,也就是自由比例尺,可以无限制的缩放。而在线地图只有18个缩放级别,如果不用地图函数限制DotSpatial地图控件的行为,就会导致地图移位。代码如下:
using DotSpatial.C
using DotSpatial.T
using System.Collections.G
using System.D
using System.L
using System.T
using System.Threading.T
namespace GoogleWmts
class TileMapFunction : MapFunction
private int zoomLevel = 11;
private System.Drawing.Point firstP
private System.Drawing.Point lastP
private ResolutionL
public TileMapFunction(IMap mapCtrl, ResolutionLayer layer) :
base(mapCtrl)
this.layer =
protected override void OnMouseDown(GeoMouseArgs e)
firstPoint = e.L
base.OnMouseDown(e);
protected override void OnMouseUp(GeoMouseArgs e)
lastPoint = e.L
//var offset = new double[2] { firstPoint.X - lastPoint.X, firstPoint.Y - lastPoint.Y };
//layer.GetDistance(offset);
//Map.ViewExtents.SetCenter(new Coordinate(Map.ViewExtents.Center.X + offset[0], Map.ViewExtents.Center.Y + offset[1]));
base.OnMouseUp(e);
protected override void OnMouseWheel(GeoMouseArgs e)
e.Handled =
if (layer.IsBusy)
if (e.Delta & 0)
zoomLevel++;
zoomLevel--;
if (zoomLevel & 0)
zoomLevel = 0;
if (zoomLevel & ResolutionLayer.MAX_ZOOM_LEVEL)
zoomLevel = ResolutionLayer.MAX_ZOOM_LEVEL;
layer.ZoomLevel = zoomL
Console.WriteLine(&中心点:& + Map.ViewExtents.Center.X + &,& + Map.ViewExtents.Center.Y);
//Map.ViewExtents = layer.GetAvailableExtent(Map.ViewExtents.Center, Map.ClientRectangle.Size);
base.OnMouseWheel(e);
protected override void OnMouseMove(GeoMouseArgs e)
e.Handled =
base.OnMouseMove(e);
六、完善WinForm窗口事件
首先声明瓦片图图层与地图函数对象,加入到地图控件,代码如下:
private ResolutionL
private TileMapF
layer = new ResolutionLayer()
Projection = currentProjection,
WindowSize = mapCtrl.Size,
ZoomLevel = 10
func = new TileMapFunction(mapCtrl, layer);
mapCtrl.Layers.Add(layer);
mapCtrl.Projection = currentP
mapCtrl.MapFunctions.Add(func);
mapCtrl.ActivateMapFunction(func);
在窗口完成加载时初始化地图视野,设置图层记录的窗口大小以通知图层准备绘图。
protected override void OnLoad(EventArgs e)
base.OnLoad(e);
layer.WindowCreated =
mapCtrl.ViewExtents = layer.GetAvailableExtent(wuhanCoordinate, layer.WindowSize);
}处理窗品大小改变事件,使地图始终铺满窗口,代码如下:
protected override void OnSizeChanged(EventArgs e)
base.OnSizeChanged(e);
if(lastSize!=Size)
lastSize = S
if (WindowState != FormWindowState.Minimized && mapCtrl.Width &= 0)
layer.WindowSize = this.S
mapCtrl.Size = this.S
Console.WriteLine(&中心点:& + mapCtrl.ViewExtents.Center.X + &,& + mapCtrl.ViewExtents.Center.Y);
七、最终效果
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!分享与登录
推送与通讯
验证与安全
云服务对接
云服务对接
条相关信息
电商地图导航社交O2O
支持Android&iOS
APICloud提供
aMap 模块封装了高德地图的原生 SDK,集成了高德地图常用基本接口;手机版原生地图,不同于 js 地图,相对于js地图而言,本模块封装的原生手机地图更加流畅迅速、动画效果更加逼真。使用此模块可轻松把高德地图集成到自己的app内,实现高德地图常用的定位、关键字搜索、周边搜索、自定义标注及气泡、查公交路线等各种功能;另外本模块已支持高德地图离线版本。
若某些带UI的接口不能满足开发设计需求,开发者(借助于原生开发者)可在本模块基础上修改少量原生代码,随心所欲的自定义高德地图所具有的原生功能,简单、轻松、快捷、高效、迅速集成高德地图,将自己的 app 和高德地图实现无缝链接。
RELEVANT&相关模块
请问,授权码有效期是多长时间?能否用于多个app授权?
亲,授权码购买之后,永久有效,一个授权码只能应用于一个APP,不能多个APP同时授权。如有需要请重新进行购买。
请问购买后可以退款吗?
亲,抱歉!虚拟物品,一经使用无法进行退款,付费模块现支持您免费体验,建议在购买之前对模块进行全方位功能测试后再付费购买。
购买后发现模块有bug怎么办?
这个不用担心哦,为了保障平台用户的合法权益和正常使用,您可以随时把有问题的模块反馈给官方,我们会立刻联系模块提供者尽快修复,如无法修复,官方会安排给您退款。
NEW&最新发布
已成功添加到 hello app!
xxxxxxxxxx
支持Android及iOS
微信扫描购买
支付宝扫描购买
0?level==1?level1Renew():upLevel2():upLevel1()" type="button" class="winBtn loadingBtn btn-warning level2" :disabled="disabled1" v-text="level>0?level==1?'续费':'':'立即升级'">
微信扫描购买
支付宝扫描购买
请确认您的联系方式,客服尽快与您联系
客服会尽快与您联系
请求发送成功客服会尽快与您联系Android百度地图、高德地图、腾讯地图导航路线规划问题
在最近的项目中,需求是用户选择某个地址需要进行导航时,弹出百度地图、高德地图和腾讯地图让用户选择。如果该用户手机中已安装对应的地图App,则启动对应软件进行导航,否则跳转到网页版的地图进行导航。
在最近的项目中,需求是用户选择某个地址需要进行导航时,弹出百度地图、高德地图和腾讯地图让用户选择。如果该用户手机中已安装对应的地图App,则启动对应软件进行导航,否则跳转到网页版的地图进行导航。
如下为各个地图效果:
百度地图高德地图
一开始做时,这不就简单吗,坐标嘛,都是一样的,去各个地图平台找到对应的URL api,传入当前的坐标和目的地址的坐标(当前使用的是百度地图的SDK)。利用Intent跳转不就行了嘛。完成之后才发现,tooyoung too simple,原谅我对国家的安全知识了解有点少。坐标各地图是不一定相同的,地址是有偏移的。
下面是我找弄度娘来的(为什么不用google呢?):
我们平时用到的地球坐标,叫做WGS-84坐标,这个是国际通用的“准确”的坐标系统。国家保密插件,其实就是对真实坐标系统进行人为的加偏处理,即为GCJ-02坐标,戏称“火星坐标”。于是,我们有了下面的东西:
-地球坐标:指WGS84坐标系统
-火星坐标:指使用国家保密插件人为偏移后的坐标
-地球地图:指与地球坐标对应的客观真实的地图
-火星地图:指经过偏移后的,与火星坐标对应的地图
国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。于是,
-谷歌地图的大陆地图、高德国内地图采用GCJ-02对地图进行加偏。
-百度地图更是进一步发挥了天朝特色,除了GCJ-02加偏,自己又在此基础上继续进行加偏,相应的坐标称为BD-09坐标。
各地图厂商使用的坐标系:
-火星坐标 GCJ02坐标系
-Gogole地图
-搜搜(腾讯)、阿里云、高德地图
-地球坐标 WGS84坐标系
-Google 卫星地图(国外地图应该都是……)
-百度坐标 BD09坐标系
好了,弄懂了之后。也很简单嘛,用的是百度地图SDK,那手上的坐标当然也是百度的。那调用高德和腾讯地图时,
只需把百度地图的坐标转换为火星坐标就行啊。
public class MapTranslateUtils {
* 坐标转换,腾讯地图(火星坐标)转换成百度地图坐标
* @param lat 腾讯纬度
* @param lon 腾讯经度
* @return 返回结果:经度,纬度
public static
double[] map_hx2bd(double lat, double lon){
double bd_
double bd_
double x_pi=3.79324;
double x = lon, y =
double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
bd_lon = z * Math.cos(theta) + 0.0065;
bd_lat = z * Math.sin(theta) + 0.006;
double[] doubles = new double[]{bd_lat,bd_lon};
System.out.println("bd_lat:"+bd_lat);
System.out.println("bd_lon:"+bd_lon);
* 坐标转换,百度地图坐标转换成腾讯地图坐标
* @param lat
百度坐标纬度
* @param lon
百度坐标经度
* @return 返回结果:纬度,经度
public static
double[] map_bd2hx(double lat, double lon){
double tx_
double tx_
double x_pi=3.79324;
double x = lon - 0.0065, y = lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
tx_lon = z * Math.cos(theta);
tx_lat = z * Math.sin(theta);
double[] doubles = new double[]{tx_lat,tx_lon};
ok,现在百度地图坐标系,火星坐标系都在手了。开干。
那首先要创建 一个webView页面:
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical"&
&mon.TitleBarView
android:id="@+id/titleBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/title_bg"/&
android:id="@+id/web_wv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/&
LinearLayout&
WebView的Activity:
public class WebViewActivity extends AppCompatActivity {
private WebView detailsWebV
private String mU
private ProgressD
private String mT
public static void launch(Activity activity, String url, String title) {
Intent intent = new Intent(activity, WebViewActivity.class);
intent.putExtra("url", url);
intent.putExtra("title", title);
activity.startActivity(intent);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
mUrl = this.getIntent().getStringExtra("url");
mTitle = this.getIntent().getStringExtra("title");
detailsWebView = (WebView) findViewById(R.id.web_wv);
detailsWebView.getSettings().setScriptEnabled(true);
detailsWebView.getSettings().setDomStorageEnabled(true);
detailsWebView.requestFocus(View.FOCUS_DOWN);
detailsWebView.getSettings().setUserAgentString("User-Agent");
detailsWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
// 设置web视图客户端
detailsWebView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {// 载入进度改变而触发
if (progress == 100) {
handler.sendEmptyMessage(1);// 如果全部载入,隐藏进度对话框 }
detailsWebView.setVisibility(View.VISIBLE);
super.onProgressChanged(view, progress);
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
detailsWebView.setVisibility(View.GONE);
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("数据载入中,请稍候!");
handler = new Handler() {
public void handleMessage(Message msg) {// 定义一个Handler,用于处理下载线程与UI间通讯
super.handleMessage(msg);
if (!Thread.currentThread().isInterrupted()) {
switch (msg.what) {
pd.show();// 显示进度对话框
pd.hide();// 隐藏进度对话框,不可使用dismiss()、cancel(),否则再次调用show()时,显示的对话框小圆圈不会动。
loadurl(detailsWebView, mUrl);
public void loadurl(final WebView view, final String url) {
handler.post(new Runnable() {
public void run() {
handler.sendEmptyMessage(0);
view.loadUrl(url);// 载入网页
首先,选择判断是否安装对应地图App时,有则启动,没有则转网页地图。
1、百度地图:开发平台URL地址:
private void selectBaidu() {
this.dismiss();
if (isInstallByread("com.baidu.BaiduMap")) {
Intent intent = Intent.getIntent("intent://map/direction?origin=latlng:"
+ nowLat + "," + nowLng
+ "|name:&destination=" + desAddress + "&mode=driving?ion=" + "我的位置"
+ "&referer=Autohome|GasStation#Ischeme=package=com.baidu.BaiduMend");
mActivity.startActivity(intent);
/*String url = "http://api./direction?origin=latlng:" + mLatitude + ","
+ mLongitude + "|name:&destination=" + mDestination
+ "&mode=driving&output=html&src=天工项目共建";
WebViewActivity.launch(getActivity(), url, "网页版地图导航");*/
Toast.makeText(mActivity, "如果您没有安装百度地图APP," +
"可能无法正常使用导航,建议选择其他地图", Toast.LENGTH_SHORT).show();
} catch (URISyntaxException e) {
e.printStackTrace();
2、高德地图 :
private void selectGaode() {
this.dismiss();
double[] txDesLatLng = MapTranslateUtils.map_bd2hx(desLat, desLng);
double[] txNowLatLng = MapTranslateUtils.map_bd2hx(nowLat, nowLng);
if (isInstallByread("com.autonavi.minimap")) {
Intent intentOther = new Intent("android.intent.action.VIEW",
Uri.parse("androidamap://navi?sourceApplication=amap&lat="
+ desLat + "&lon=" + desLng + "&dev=1&stype=0"));
intentOther.setPackage("com.autonavi.minimap");
intentOther.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
mActivity.startActivity(intentOther);
} catch (Exception e) {
String url = "/?from="
+ nowLat + "," + nowLng
+ "(from)&to=" + desLat + "," + desLng + "(to)&type=0&opt=1&dev=0";
WebViewActivity.launch(mActivity, url, "网页版地图导航");
String url = "/?from="
+ txNowLatLng[0] + "," + txNowLatLng[1]
+ "(from)&to=" + txDesLatLng[0] + "," + txDesLatLng[1] + "(to)&type=0&opt=1&dev=0";
WebViewActivity.launch(mActivity, url, "网页版地图导航");
需要注意的是上面的dev参数,如果你传入的已经是火星坐标,参数为0就行,如果你传入的是高德坐标,则传入1。这里是个坑,要注意一下。
3、腾讯地图: 开发平台URL地址:
看官方介绍目前腾讯还不支持直接启动腾讯地图App。
所以只能调用web的地图:
private void selectTencent() {
this.dismiss();
double[] txDesLatLng = MapTranslateUtils.map_bd2hx(desLat, desLng);
double[] txNowLatLng = MapTranslateUtils.map_bd2hx(nowLat, nowLng);
String url = "http://apis./uri/v1/routeplan?type=drive&from=&fromcoord="
+ txNowLatLng[0] + "," + txNowLatLng[1]
+ "&to=&tocoord=" + txDesLatLng[0] + "," + txDesLatLng[1] + "&policy=0&referer=myapp";
WebViewActivity.launch(mActivity, url, "网页版地图导航");
另外此处是高德地图对其他坐标进行转换的api:

我要回帖

更多关于 高德地图瓦片数据下载 的文章

 

随机推荐