【Android】3.23 示例23--瓦片图功能
分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-02-04
一、简介
地图SDK自v3.6.0起,新增瓦片图层(tileOverlay), 该图层支持开发者添加自有瓦片数据,包括本地加载和在线下载两种方式。该图层可随地图的平移、缩放、旋转等操作做相应的变换,它仅位于底图之上(即瓦片图层将会遮挡底图,不遮挡其他图层),瓦片图层的添加顺序不会影响其他图层(例如:POI搜索图层、我的位置图层等)的叠加关系,适用于开发者拥有某一区域的地图,并希望使用此区域地图覆盖相应位置的百度地图。
1、瓦片划分规则
百度地图SDK会根据不同的比例尺将地图划分成若干个瓦片,并且以中心点经纬度(0,0)开始计算瓦片,当地图显示缩放级别增大时,每一个瓦片被划分成4个瓦片。如:
地图级别为0时,只有1张瓦片;
地图级别为1时,会分成 1 * 4 = 4 张瓦片;
依次类推。
当地图级别为n时,总共划分的瓦片为:4的n次方。
为了保证瓦片的显示效果,第n级的瓦片显示的地图level范围为[n - 0.5, n + 0.5)
2、本地加载和在线下载
瓦片图层分为本地加载和在线下载两种绘制方式。
(1)本地加载方式,将图片打包于应用内(保存到Assets文件夹下),适用于图片较小且不需要频繁变更的情况。
(2)在线下载,将图片存放于开发者提供的服务中,提供给SDK一个URL模板,通过URLTileLayer调用在线瓦片图层的URL。
二、运行截图
简介:瓦片图层支持开发者添加自有瓦片数据,包括在线下载和本地加载两种方式。
详述:
(1)在线下载方式
(2)本地加载方式
本示例运行截图如下:

三、设计步骤
1、添加demo23_tile_overlay.xml文件
在layout文件夹下添加该文件,代码不再列出。
2、添加Demo23TileOverlay.cs文件
在SrcSdkDemos文件夹下添加该文件,然后将代码改为下面的内容:
using System;
using Android.App;
using Android.OS;
using Android.Widget;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using Android.Graphics;
using Android.Util;
namespace BdMapV371Demos.SrcSdkDemos
{
/// <summary>
/// TileOverlay 测试demo
/// </summary>
[Activity(Label = "@string/demo_name_tileoverlay")]
public class Demo23TileOverlay : Activity, BaiduMap.IOnMapLoadedCallback
{
private TextureMapView mMapView;
private BaiduMap mBaiduMap;
// 设置瓦片图的在线缓存大小,默认为20 M
public const int TileTmpOnlineCache = * * ;
public string onlineUrl = "http://api0.map.bdimg.com/customimage/tile"
+ "?&x={x}&y={y}&z={z}&udt=20150601&customid=light";
private TileOverlay tileOverlay;
private MapStatusUpdate mMapStatusUpdate;
private bool mapLoaded = false;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.demo23_tile_overlay);
mMapView = FindViewById<TextureMapView>(Resource.Id.mapview);
mBaiduMap = mMapView.Map;
mBaiduMap.SetOnMapLoadedCallback(this); MapStatus.Builder builder = new MapStatus.Builder();
builder.Zoom(16.0f);
builder.Target(new LatLng(39.914935D, 116.403119D));
mMapStatusUpdate = MapStatusUpdateFactory.NewMapStatus(builder.Build());
mBaiduMap.SetMapStatus(mMapStatusUpdate); Button btnOnline = FindViewById<Button>(Resource.Id.online);
Button btnOffline = FindViewById<Button>(Resource.Id.offline);
CheckBox hidePoiInfo = FindViewById<CheckBox>(Resource.Id.hide_poiinfo);
// 设置在线方法监听
btnOnline.Click += delegate
{
OnlineTile();
};
// 设置离线方法监听
btnOffline.Click += delegate
{
OfflineTile();
};
hidePoiInfo.CheckedChange += (s, e) =>
{
if (e.IsChecked)
{
mBaiduMap.ShowMapPoi(false);//仅显示交通图
}
else
{
mBaiduMap.ShowMapPoi(true);
}
};
Button btnClearTile = FindViewById<Button>(Resource.Id.btnClearTile);
btnClearTile.Click += delegate
{
RemoveTile();
};
}
private void RemoveTile()
{
if (tileOverlay != null && mBaiduMap != null)
{
tileOverlay.RemoveTileOverlay();
}
} /// <summary>使用瓦片图的在线方式</summary>
private void OnlineTile()
{
RemoveTile();
// 构造显示瓦片图范围,当前为世界范围
LatLng northeast = new LatLng(, );
LatLng southwest = new LatLng(-, -);
LatLngBounds bounds = new LatLngBounds.Builder()
.Include(northeast)
.Include(southwest)
.Build();
var tileProvider = new MyUrlTileProvider(this);
// 通过option指定相关属性,向地图添加在线瓦片图对象
TileOverlayOptions options = new TileOverlayOptions()
.TileProvider(tileProvider)
.SetMaxTileTmp(TileTmpOnlineCache)
.SetPositionFromBounds(bounds);
tileOverlay = mBaiduMap.AddTileLayer(options);
if (mapLoaded)
{
//mBaiduMap.MapType = BaiduMap.MapTypeNormal;
mBaiduMap.SetMaxAndMinZoomLevel(21.0f, 3.0f);
mBaiduMap.SetMapStatusLimits(new LatLngBounds.Builder()
.Include(northeast).Include(southwest)
.Build());
mBaiduMap.SetMapStatus(mMapStatusUpdate);
}
} /// <summary>瓦片图的离线添加</summary>
private void OfflineTile()
{
RemoveTile();
//// 构造显示瓦片图范围,当前为世界范围
LatLng northeast = new LatLng(, );
LatLng southwest = new LatLng(-, -);
var tileProvider = new MyFileTileProvider(this);
// 通过option指定相关属性,向地图添加离线瓦片图对象
LatLngBounds bounds = new LatLngBounds.Builder()
.Include(northeast).Include(southwest).Build();
//// 设置离线瓦片图属性option
TileOverlayOptions options = new TileOverlayOptions()
.TileProvider(tileProvider)
.SetPositionFromBounds(bounds);
mBaiduMap.MapType = BaiduMap.MapTypeSatellite;
tileOverlay = mBaiduMap.AddTileLayer(options);
if (mapLoaded)
{
mBaiduMap.MapType = BaiduMap.MapTypeNormal;
LatLng northeast1 = new LatLng(39.94001804746338, 116.41224644234747);
LatLng southwest1 = new LatLng(39.90299859954822, 116.38359947963427);
LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.Include(northeast1)
.Include(southwest1);
mBaiduMap.SetMapStatusLimits(builder.Build());
mBaiduMap.SetMaxAndMinZoomLevel(17.0f, 16.0f);
mBaiduMap.SetMapStatus(mMapStatusUpdate);
}
} //实现接口
public void OnMapLoaded()
{
mapLoaded = true;
}
protected override void OnPause()
{
base.OnPause();
mMapView.OnPause();
}
protected override void OnResume()
{
base.OnResume();
mMapView.OnResume();
}
protected override void OnDestroy()
{
base.OnDestroy();
mMapView.OnDestroy();
}
} // 定义瓦片图的在线Provider,并实现相关接口
public class MyUrlTileProvider : UrlTileProvider
{
private Demo23TileOverlay a;
public MyUrlTileProvider(Demo23TileOverlay a)
{
this.a = a;
}
public override int MaxDisLevel
{
get { return ; } //显示瓦片图的最大级别
}
public override int MinDisLevel
{
get { return ; }//显示瓦片图的最小级别
}
public override string TileUrl
{
get { return a.onlineUrl; }
}
}
/// <summary>
/// 定义瓦片图的离线Provider,并实现相关接口
/// </summary>
public class MyFileTileProvider : FileTileProvider
{
private Demo23TileOverlay a;
public MyFileTileProvider(Demo23TileOverlay a)
{
this.a = a;
}
public override int MaxDisLevel
{
get { return ; }
}
public override int MinDisLevel
{
get { return ; }
}
public override Tile GetTile(int x, int y, int z)
{
// 根据地图某一状态下x、y、z加载指定的瓦片图
string filedir = string.Format(
"LocalTileImage/{0}/{0}_{1}_{2}.jpg", z, x, y);
Android.Graphics.Bitmap bm = null;
System.IO.Stream inputStream = null;
try
{
inputStream = a.Assets.Open(filedir);
bm = BitmapFactory.DecodeStream(inputStream);
}
catch (Exception e)
{
Log.Debug("MyFileTileProvider", "瓦片图加载错误。\n" + e.StackTrace);
return null;
}
if (bm == null)
{
Log.Debug("MyFileTileProvider", "bm为null");
return null;
}
byte[] bytes = new byte[bm.ByteCount];
inputStream.Read(bytes, , bytes.Length);
// 瓦片图尺寸必须满足256 * 256
var offlineTile = new Tile(bm.Width, bm.Height, bytes);
bm.Recycle();
return offlineTile;
}
}
}
3、修改MainActivity.cs文件
在MainActivity.cs文件的demos字段定义中,去掉【示例23】下面的注释。
运行观察效果。
【Android】3.23 示例23--瓦片图功能的更多相关文章
- [转] This Android SDK requires Android Developer Toolkit version 23.0.0 or above
问题描述: This Android SDK requires Android Developer Toolkit version 23.0.0 or above. Current version ...
- This Android SDK requires Android Developer Toolkit version 23.0.0 or above
2014-07-05 12:58 6445人阅读 评论(1) 收藏 举报 This Android SDK requires Android Developer Toolkit version 23. ...
- 【边做项目边学Android】小白会遇到的问题--This Android SDK requires Android Developer Toolkit version 23.0.0 or above
问题描写叙述: 上一篇讲到解决Appcompat_V7问题要减少adt版本号,于是就换旧版本号22.3.0啊,又一次打开Eclipse.立刻弹出: This Android SDK requires ...
- 解决在sdk manager中更新文件后出现This Android SDK requires Android Developer Toolkit version 23.1的错误
起因:在sdksdk manager中更新了adt及其它的支持库后,eclipse报错:This Android SDK requires Android Developer Toolkit vers ...
- Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展
本文由“猫爸iYao”原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样: ▲ 微信群聊界面里的@人功能 ▲ QQ群聊界面里 ...
- Android图表库MPAndroidChart(二)——线形图的方方面面,看完你会回来感谢我的
Android图表库MPAndroidChart(二)--线形图的方方面面,看完你会回来感谢我的 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库MP ...
- 独辟蹊径:逆推Krpano切图算法,实现在浏览器切多层级瓦片图
前言 此文我首发于CSDN(所以里面的图片有它的水印) 趁着隔离梳理一下之前做的一个有用的功能:在浏览器中去切割多分辨率瓦片图 这是一个有趣的过程,跟我一起探索吧 阅读本文需具备前置知识:对krpan ...
- Android 高清加载巨图方案 拒绝压缩图片
Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自:[张 ...
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3364728.html 我前两天写过一篇博客<Android使用Fragment来 ...
随机推荐
- Python网络编程 - 请求地址上的文件并下载
我们用到了requests库,由于是第三方的,必须下载 如果是python 2.x用下面命令 pip install requests python 3.x用下面命令 easy_install req ...
- ZH奶酪:PHP上传图片三个步骤
1. 上传图片三步骤 第一步:首先判断文件类型是否为图片格式,若是则上传文件; 第二步:然后重命名文件(一般都是避免上传文件重名,现在基本上都是以为时间来命名); 第三步:最后把文件上传到指定目录,成 ...
- MVC应用积累
1.Controller中的跳转 (1)直接Redirect后加(Controller/Action):Response.Redirect("/Home/Index"); (2)直 ...
- C++生成十字绣图案(二) 面向对象
基本的十字绣线性生成中提供了判断下一步可以画的位置并且逐步生成的函数.以这些基本函数为基础,可以进行更多变化的图案设计. 为了方便的扩展,可以把线性生成写成一个类,以后的修改继承这个类. 头文件Bas ...
- [SQL]查询某一个字段在某一段时期数据库中使用到的记录
有些时候我们常常须要哪里用到了一些表,又或者什么时候运行了某一个存储过程.整理出了在某段时期内数据库运行的sql查询.也能够查询到数据库中某些字段的存放处.非常好非常强大.希望能帮到大家~ SELEC ...
- ios上线流程
一.前言: 作为一名iOSer,把开发出来的App上传到App Store是必要的.下面就来详细讲解一下具体流程步骤. 二.准备: 一个已付费的开发者账号(账号类型分为个人(Individual).公 ...
- java各种框架的比较,分析
Spring 框架 优点 1.提供了一种管理对象的方法,可以把中间层的对象有效地组织起来 2.采用了分层结构,可以增量引入到项目中. 3.代码测试较容易 4.非侵入性,应用程序对Spring API的 ...
- CMake 基本用法--写CMakeList.txt
http://techbase.kde.org/Development/Tutorials/CMake_(zh_CN) http://www.cmake.org/Wiki/CMake 这一章将从软件开 ...
- 【Linux】文件描述符与重定向
重定向符号 符号 描述 > 输出重定向到一个文件或设备 覆盖原来的文件 >! 输出重定向到一个文件或设备 强制覆盖原来的文件 >> 输出重定向到一个文件或设备 追加原来的文件 ...
- 【LeetCode】27. Remove Element (2 solutions)
Remove Element Given an array and a value, remove all instances of that value in place and return th ...