Android的关于高德地图加载谷歌瓦片,并缓存本地的功能

最近开发的Android的App需要使用到卫星图,不过发现国内现有的百度,高德的卫星图对郊区图层支持的不好,只能使用谷歌的卫星图.

在尝试使用谷歌的Google Map API for Android后又发现去要手机安装谷歌服务,并且有可能用到科学上网.所以就想有没有一个既能加载谷歌卫星图的,又不需要安装谷歌服务.

最后找到了osmdroid,经过一段时间的研究,发现使用osmdroid的还是少数,教程不多.

最后偶尔的一个机会看到了虎虎之王的博客

https://blog.csdn.net/xiaolaohuqwer/article/details/71583651

就打算从这下手了.再次感谢虎虎之王.

中途还有一些博主的文章被参阅,可惜没有记下具体链接,望海涵.

 

在原作者的基础上,我修改了图源,用于加载谷歌的卫星图,并且在第一次加载的时候,自动缓存本地,既能在二次加载减少加载时间,又能节省流量,毕竟是手机使用.流量能省则省

上主要代码:

 
  1. /**

  2. * 加载在线瓦片数据

  3. */

  4. private void useOMCMap() {

  5. final String url = "http://www.google.cn/maps/vt?lyrs=y&gl=cn&x=%d&s=&y=%d&z=%d";

  6. //final String url = "http://mt1.google.cn/vt/lyrs=y&hl=zh-CN&gl=cn&x=%d&s=&y=%d&z=%d";

  7.  
  8. TileOverlayOptions tileOverlayOptions =

  9. new TileOverlayOptions().tileProvider(new UrlTileProvider(256, 256) {

  10. @Override

  11. public URL getTileUrl(int x, int y, int zoom) {

  12. try {

  13. //return new URL(String.format(url, zoom + 1, TileXYToQuadKey(x, y, zoom)));

  14. //return new URL(String.format(url, x, y, zoom));

  15. String mFileDirName;

  16. String mFileName;

  17. mFileDirName = String.format("L%02d/", zoom + 1);

  18. mFileName = String.format("%s", TileXYToQuadKey(x, y, zoom));//为了不在手机的图片中显示,下载的图片取消jpg后缀,文件名自己定义,写入和读取一致即可,由于有自己的bingmap图源服务,所以此处我用的bingmap的文件名

  19. String LJ = ALBUM_PATH +mFileDirName+ mFileName;

  20. if (MapImageCache.getInstance().isBitmapExit( mFileDirName + mFileName)) {//判断本地是否有图片文件,如果有返回本地url,如果没有,缓存到本地并返回googleurl

  21. return new URL("file://" + LJ);

  22. } else {

  23. String filePath = String.format(url, x, y, zoom);

  24. Bitmap mBitmap;

  25. //mBitmap = BitmapFactory.decodeStream(getImageStream(filePath));//不知什么原因导致有大量的图片存在坏图,所以重写InputStream写到byte数组方法

  26. mBitmap = getImageBitmap(getImageStream(filePath));

  27. try {

  28. saveFile(mBitmap, mFileName, mFileDirName);

  29. } catch (IOException e) {

  30. e.printStackTrace();

  31. }

  32. return new URL(filePath);

  33. }

  34. }catch (Exception e) {

  35. e.printStackTrace();

  36. }

  37. return null;

  38. }

  39. });

  40. tileOverlayOptions.diskCacheEnabled(false) //由于高德自带的瓦片缓存在关闭程序后会自动清空,所以无意义,关闭本地缓存

  41. .diskCacheDir("/storage/emulated/0/amap/OMCcache")

  42. .diskCacheSize(1024000)

  43. .memoryCacheEnabled(true)

  44. .memCacheSize(102400)

  45. .zIndex(-9999);

  46. mtileOverlay = aMap.addTileOverlay(tileOverlayOptions);

  47. }

瓦片数据下载途中发现会有图片出现黑块,格式损坏的问题,参考了下面的文章进行解决.

https://www.cnblogs.com/henkun010/p/6605554.html

 
  1. public Bitmap getImageBitmap(InputStream imputStream){

  2. // 将所有InputStream写到byte数组当中

  3. byte[] targetData = null;

  4. byte[] bytePart = new byte[4096];

  5. while (true) {

  6. try {

  7. int readLength = imputStream.read(bytePart);

  8. if (readLength == -1) {

  9. break;

  10. } else {

  11. byte[] temp = new byte[readLength + (targetData == null ? 0 : targetData.length)];

  12. if (targetData != null) {

  13. System.arraycopy(targetData, 0, temp, 0, targetData.length);

  14. System.arraycopy(bytePart, 0, temp, targetData.length, readLength);

  15. } else {

  16. System.arraycopy(bytePart, 0, temp, 0, readLength);

  17. }

  18. targetData = temp;

  19. }

  20. } catch (Exception e) {

  21. e.printStackTrace();

  22. }

  23. }

  24. // 指使Bitmap通过byte数组获取数据

  25. Bitmap bitmap = BitmapFactory.decodeByteArray(targetData, 0, targetData.length);

  26. return bitmap;

  27. }

最终保存图片的代码!

 
  1. /**

  2. * 保存文件

  3. */

  4. public void saveFile(final Bitmap bm, final String fileName,final String fileDirName) throws IOException {

  5. new Thread(new Runnable() {

  6. @Override

  7. public void run() {

  8. try {

  9. if(bm != null) {

  10. File dirFile = new File(ALBUM_PATH + fileDirName);

  11. if(!dirFile.exists()){

  12. dirFile.mkdir();

  13. }

  14. File myCaptureFile = new File(ALBUM_PATH + fileDirName + fileName);

  15. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));

  16. bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);

  17. bos.flush();

  18. bos.close();

  19. }

  20.  
  21. } catch (IOException e) {

  22. e.printStackTrace();

  23. }

  24. }

  25. }).start();

  26. }

 

demo下载地址:

https://download.csdn.net/download/zfcomfort/10447822

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值