1.简介

osmdroid是一个开源的地图填充器,全称是 open street map ,至于droid我个人认为应该是安卓版的后缀吧。

在网络上找了很多资料,大多是加载在线地图的,加载离线地图的很少,所以把代码记录一下。

2.初始化

1.在布局中添加地图控件

<org.osmdroid.views.MapViewandroid:id="@+id/map_view"android:layout_width="match_parent"android:layout_height="match_parent"/>

2.初始化地图

        MapView map_view = (MapView) findViewById(R.id.map_view);//设置地图是可点击的map_view.setClickable(true);//显示地图下方的缩放按钮map_view.setBuiltInZoomControls(true);mMapController = map_view.getController();//设置初始化缩放级别mMapController.setZoom(8);//设置当前最大缩放级别map_view.setMaxZoomLevel(8);//添加比例尺ScaleBarOverlay scaleBar = new ScaleBarOverlay(context);map_view.getOverlays().add(scaleBar);//初始化放大缩小控制器initZoomController();//设置中心点mMapController.setCenter(new GeoPoint(34.5063810566, 122.9272579323));/*** 初始化放大缩小的处理 -- 对放大缩小方法进行监听*/private void initZoomController() {Field f = null;try {f = map_view.getClass().getDeclaredField("mZoomController");//通过反射找到缩放的控制器f.setAccessible(true);Log.d(TAG, "zoomControllerClass--" + f.getGenericType().toString());System.out.println("反射类中所有的方法");Method[] fm = Class.forName("android.widget.ZoomButtonsController").getMethods();for (int i = 0; i < fm.length; i++) {if (fm[i].getName().equals("setOnZoomListener")) {fm[i].setAccessible(true);fm[i].invoke((ZoomButtonsController) f.get(map_view), new ZoomButtonsController.OnZoomListener() {@Overridepublic void onVisibilityChanged(boolean b) {}@Overridepublic void onZoom(boolean b) {if (b) {map_view.getController().zoomIn();} else {map_view.getController().zoomOut();}zoom();//自己要处理的方法}});}System.out.println("fm:" + fm[i].getName() + "____"+ fm[i].getReturnType().getName());}} catch (NoSuchFieldException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}

###3.对地图进行操作
####1 加载离线地图

    /*** 离线地图文件--离线地图在内存卡中的位置,如果随机可以遍历文件,不过时间可能会稍微慢一些*/public static File OSMDROID_PATH = new File("/storage/sdcard1/osmdroid");/*** 查找离线地图--在有网络的情况下会加载谷歌地图*/private void findOfflineMap() {ThreadPoolManager.getInstance().execute(new Runnable() {@Overridepublic void run() {//指定地图加载提供器registerReceiver = new SimpleRegisterReceiver(context);final TileWriter tileWriter = new TileWriter();fileSystemProvider = new MapTileFilesystemProvider(registerReceiver, null);// Create an archive file modular tile providerfileArchiveProvider = new MapTileFileArchiveProvider(registerReceiver, null, findArchiveFiles());// Create a download modular tile providerfinal NetworkAvailabliltyCheck networkAvailabliltyCheck = new NetworkAvailabliltyCheck(context);final MapTileDownloader downloaderProvider = new MapTileDownloader(null, tileWriter, networkAvailabliltyCheck);DisplayMetrics dm = getResources().getDisplayMetrics();//google卫星图float mDensity = dm.density;if (mDensity > 1.5)mDensity = 1.5f;String url1 = "http://mt1.google.cn/vt/lyrs=y&hl=zh-CN&gl=cn&scale=" + mDensity;String url2 = "http://mt2.google.cn/vt/lyrs=y&hl=zh-CN&gl=cn&scale=" + mDensity;String url3 = "http://mt3.google.cn/vt/lyrs=y&hl=zh-CN&gl=cn&scale=" + mDensity;//含路网ms_googleSatellite = new GoogleMapsTileSource("GoogleMap", null, 1, 19, (int) (256 * dm.density), ".jpg",new String[]{url1, url2, url3});// Create a custom tile provider array with the custom tile source and  the custom tile providerstileProviderArray = new MapTileProviderArray(ms_googleSatellite, registerReceiver,new MapTileModuleProviderBase[]{fileSystemProvider, fileArchiveProvider, downloaderProvider});map_view.getTileProvider().clearTileCache();
//      Log.d("tag", "清理tile缓存........");map_view.setTileProvider(tileProviderArray);map_view.setTileSource(ms_googleSatellite);map_view.setTilesScaledToDpi(false);//重要}});}

GoogleMapsTileSource.java

    public class GoogleMapsTileSource extends OnlineTileSourceBase/* implements IStyledTileSource<Integer> */{public GoogleMapsTileSource(String aName, string aResourceId,int aZoomMinLevel, int aZoomMaxLevel, int aTileSizePixels,String aImageFilenameEnding, String[] aBaseUrl) {super(aName, aZoomMinLevel, aZoomMaxLevel, aTileSizePixels,aImageFilenameEnding, aBaseUrl);}@Overridepublic String getTileURLString(MapTile aTile) {return getBaseUrl() + "&x=" + aTile.getX() + "&y=" + aTile.getY() + "&z=" + aTile.getZoomLevel(); }}

####2 向地图中添加图片

/*** 添加图片* @param point* @return*/private Overlay addImg(ArrowPoint point) {ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();Drawable drawable = this.getResources().getDrawable(point.imgResource);OverlayItem item = new OverlayItem("", "", point.geoPoint);item.setMarker(drawable);items.add(item);CustomMarker marker = new CustomMarker(items,new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {@Overridepublic boolean onItemSingleTapUp(final int index,final OverlayItem item) {return true;}@Overridepublic boolean onItemLongPress(final int index,final OverlayItem item) {return false;}}, map_view.getResourceProxy());map_view.getOverlays().add(marker);map_view.invalidate();return marker;}

####3 在地图中添加实线区域

/*** 添加实线区域*/private Overlay addFullArea(List<GeoPoint> pointList, int color) {PathOverlay myPath = new PathOverlay(color, this);Paint paint = new Paint();paint.reset();paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(3);paint.setColor(color);
//        paint.setAntiAlias(true);paint.setPathEffect(null);myPath.setPaint(paint);for (GeoPoint geoPoint : pointList) {myPath.addPoint(geoPoint);}map_view.getOverlays().add(myPath);map_view.invalidate();return myPath;}

####4 在地图中添加虚线区域

/*** 添加虚线区域*/private Overlay addDottedArea(List<GeoPoint> pointList) {PathOverlay myPath = new PathOverlay(Color.RED, this);PathEffect effect = null;//虚线effect = getDottedLine(30, 30);Paint paint = new Paint();paint.reset();paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(3);paint.setColor(Color.RED);
//        paint.setAntiAlias(true);paint.setPathEffect(effect);myPath.setPaint(paint);for (GeoPoint geoPoint : pointList) {myPath.addPoint(geoPoint);}map_view.getOverlays().add(myPath);return myPath;}/*** 获取虚线* @param lineLength* @param space* @return*/private PathEffect getDottedLine(int lineLength, int space) {//虚线DashPathEffect pee = new DashPathEffect(new float[]{lineLength, space}, 0);return pee;}

####5 在地图中添加T型区域

 /*** 添加T型虚线区域* 点从右向左添加时T型向内*/private Overlay addTShapeArea(List<GeoPoint> pointList) {PathOverlay myPath = new PathOverlay(Color.RED, this);PathEffect effect = null;//T型虚线effect = getTShape(15, 20);Paint paint = new Paint();paint.reset();paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(3);paint.setColor(Color.RED);
//        paint.setAntiAlias(true);paint.setPathEffect(effect);myPath.setPaint(paint);for (GeoPoint geoPoint : pointList) {myPath.addPoint(geoPoint);}map_view.getOverlays().add(myPath);return myPath;}/*** 获取T型虚线* @param lineLength* @param space* @return*/private PathEffect getTShape(int lineLength, int space) {//T型虚线TShaped(lineLength);PathDashPathEffect pe = new PathDashPathEffect(tShaped, space, 0, PathDashPathEffect.Style.MORPH);return pe;}/*** 画T型虚线中的一个T* @param length T的长度*/private void TShaped(float length) {tShaped = new Path();float dis1 = (float) ((length / 2) / Math.tan((54f / 180) * Math.PI));tShaped.moveTo(length / 2 - length / 10, 0);tShaped.lineTo(length / 2 + length / 10, 0);tShaped.lineTo(length / 2 + length / 10, dis1);tShaped.lineTo(length, dis1);tShaped.lineTo(length, dis1 + length / 5);tShaped.lineTo(0, dis1 + length / 5);tShaped.lineTo(0, dis1);tShaped.lineTo(length / 2 - length / 10, dis1);tShaped.lineTo(length / 2 - length / 10, 0);}

T的大小都是自定义的,在最后一个方法中,当前是将大小定死了,如果需要,可以在此基础上修改。

####6 箭头的画法
再附加一个根据经纬度值和角度,画箭头的方法

private List<Overlay> tidalChartLineList;private List<GeoPoint> tidalChartPointList;/*** 箭头* @param geoPoint 中心点* @param degree 角度* @param length 长度*/private void addArrows(GeoPoint geoPoint,double degree,double length) {try {double lineX = length * Math.sin(degree * Math.PI / 180);double lineY = length * Math.cos(degree * Math.PI / 180);GeoPoint latlng2 = new GeoPoint(geoPoint.getLatitude() + lineY, geoPoint.getLongitude() + lineX);double tempLine = length * 3 / 4 * Math.cos(15 * Math.PI / 180);GeoPoint latlng3 = new GeoPoint(geoPoint.getLatitude() + (tempLine * Math.sin((90 - degree + 15) * Math.PI / 180)),geoPoint.getLongitude() + (tempLine * Math.cos((90 - degree + 15) * Math.PI / 180)));GeoPoint latlng4 = new GeoPoint(geoPoint.getLatitude() + (tempLine * Math.sin((90 - degree - 15) * Math.PI / 180)),geoPoint.getLongitude() + (tempLine * Math.cos((90 - degree - 15) * Math.PI / 180)));List<GeoPoint> latLngPolygon = new ArrayList<GeoPoint>();latLngPolygon.add(geoPoint);latLngPolygon.add(latlng2);latLngPolygon.add(latlng3);latLngPolygon.add(latlng2);latLngPolygon.add(latlng4);tidalChartPointList.add(geoPoint);tidalChartLineList.add(addFullArea(latLngPolygon, 0xFFFF0000));} catch (Exception e) {e.printStackTrace();}}

7 添加自定义布局

View view = LayoutInflater.from(context).inflate(R.layout.view, null, false);
Bitmap bitmap = Bitmap.createBitmap(view.geth, 150,Bitmap.Config.ARGB_8888);
//利用bitmap生成画布
Canvas canvas = new Canvas(bitmap);
//把view中的内容绘制在画布上
view.draw(canvas);
Drawable drawable = ImageUtils.bitmapToDrawable(bitmap);
OverlayItem item = new OverlayItem("", "", point);
item.setMarker(drawable);
CustomMarker trafficMarker = new CustomMarker(items,listener,map_view.getResourceProxy());

demo地址:https://download.csdn.net/download/a569503963/10941384

osmdroid地图相关推荐

  1. osmdroid 地图 加载离线地图资源包 zip格式

    osmdroid 加载离线地图资源包.我这只用了zip的.其他格式没试. storage/emulated/0/osmdroid/hefeiosm.zip 主要逻辑是,拷贝  hefeiosm.zip ...

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

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

  3. 安卓使用osmdroid显示谷歌地图、高德地图及离线地图详解

    最近公司有这个需求,需要能切换不同的地图,并且数据需要互通,如果引入每一个地图的SDK(例如百度地图SDK.高德地图SDK.谷歌地图等)的话apk包就太大了,而且操作数据及操作地图就会变得特别麻烦,所 ...

  4. Osmdroid加载第三方地图googlemap、bingmap等

    1.osmdroid加载第三方地图的方式 第一种:通过拓展图源的方式 第二种:通过包装(如对google地图的api进行包装),用统一的接口进行调用. 2.osmdroid-third-party源码 ...

  5. Osm地图osmdroid下载离线地图,第三方瓦片地图

    final MapTileProviderBasic tileProvider = new MapTileProviderBasic(getContext().getApplicationContex ...

  6. android 导入离线地图,Android, 离线地图-2

    注意问题: 首先了解osmdroid支持的离线地图格式,官方也有介绍官方离线地图介绍相关入门介绍里面都有,这里需要注意的有以下几 个地方: 如果是zip包的话需要放在sdcard/osmdroid目录 ...

  7. android中一些能在国外使用的第三方地图

    前段时间由于公司项目原因,需要做一些国外的地图功能,尝试了百度地图和高德地图后发现效果不理想,基本没有国外的详细图层(截止到2013年底,最新的没有去关注). 于是去找了android上可用的国外第三 ...

  8. 高德地图加载谷歌地图瓦片

    简介 苦逼外业实验需要用到无人机采集数据,遂利用高德地图SDK和DJI Mobile SDK开发了一款无人机航线规划软件.当地也不算偏僻,然而高德卫星地图缩放等级约为16,无法满足作业需求.调查了其他 ...

  9. 对于Osmdroid源码资源的简单研究

    1.首先了解一下OSM OpenStreetMap 是一个世界地图,可依据开放许可协议自由使用.OpenStreetMap的优缺点:优点:数据开放,可自己搭建服务器,自己修改数据:缺点:数据尚不完善, ...

最新文章

  1. 各种Web漏洞测试平台
  2. Java虚拟机的研究与实现
  3. 【题解】Luogu P3674 小清新人渣的本愿
  4. Raid5.h注释翻译
  5. php mysql 全文检索_MySQL中文全文检索
  6. MS CRM 4中,添加营销列表成员查找列
  7. Atitit 非结构化数据管理法 目录 1. 什么是非结构化数据? 1 2. 对非结构化数据也即对全文数据的搜索主要有两种方法: 2 2.1. 顺序扫描法(Serial Scanning): 2 2
  8. python虚拟环境--virtualenv
  9. vdbench - 性能压力测试工具
  10. 如何使用Frontline实时抓取蓝牙协议栈HCI LOG
  11. Elasticsearch7 mapping和setting简介
  12. 初中英语语法(010)-分词
  13. Closures in OOC
  14. 网易我的世界服务器存档在哪个文件夹,网易版我的世界如何删除玩家存档
  15. 错误 编码(此代码是错误的)
  16. DS_Store是什么?
  17. 不要跟穷鬼学着做副业
  18. AWS s3 java api使用
  19. 【宋红康 MySQL数据库 】【高级篇】【03】MySQL的数据目录
  20. java实现lz77算法实例_数据压缩算法---LZ77算法 的分析与实现

热门文章

  1. Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)
  2. 开发神技能 | Python Mock 的入门
  3. 用计算机弹出thatgirl,抖音thatgirl谐音唱法音译 thatgirl歌词是什么意思中文翻译...
  4. (网络视频监控)面试题12
  5. 【比亚迪半导体】关联销售占比超过50%,关联销售毛利率是非关联销售的一倍
  6. Javaweb零基础学习(壹)
  7. C#练习题答案: 英雄的根【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  8. 升级生态主张:阿里云为千行百业带来了什么?
  9. FAL_SERVER参数解释
  10. 关于在手机端可以看到加入的百度网盘群,在pc段找不到的原因