osmdroid地图
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地图相关推荐
- osmdroid 地图 加载离线地图资源包 zip格式
osmdroid 加载离线地图资源包.我这只用了zip的.其他格式没试. storage/emulated/0/osmdroid/hefeiosm.zip 主要逻辑是,拷贝 hefeiosm.zip ...
- osmdroid 在线加载谷歌瓦片(谷歌地图瓦片地址解释)
osmdroid作为一个开源的项目,在在线地图上还是做的不错,离线地图上也能支持多种格式,例如:zip,sqlite,.mbtiles,gemf,map,gpkg等格式.就是不能直接加载shp文件大为 ...
- 安卓使用osmdroid显示谷歌地图、高德地图及离线地图详解
最近公司有这个需求,需要能切换不同的地图,并且数据需要互通,如果引入每一个地图的SDK(例如百度地图SDK.高德地图SDK.谷歌地图等)的话apk包就太大了,而且操作数据及操作地图就会变得特别麻烦,所 ...
- Osmdroid加载第三方地图googlemap、bingmap等
1.osmdroid加载第三方地图的方式 第一种:通过拓展图源的方式 第二种:通过包装(如对google地图的api进行包装),用统一的接口进行调用. 2.osmdroid-third-party源码 ...
- Osm地图osmdroid下载离线地图,第三方瓦片地图
final MapTileProviderBasic tileProvider = new MapTileProviderBasic(getContext().getApplicationContex ...
- android 导入离线地图,Android, 离线地图-2
注意问题: 首先了解osmdroid支持的离线地图格式,官方也有介绍官方离线地图介绍相关入门介绍里面都有,这里需要注意的有以下几 个地方: 如果是zip包的话需要放在sdcard/osmdroid目录 ...
- android中一些能在国外使用的第三方地图
前段时间由于公司项目原因,需要做一些国外的地图功能,尝试了百度地图和高德地图后发现效果不理想,基本没有国外的详细图层(截止到2013年底,最新的没有去关注). 于是去找了android上可用的国外第三 ...
- 高德地图加载谷歌地图瓦片
简介 苦逼外业实验需要用到无人机采集数据,遂利用高德地图SDK和DJI Mobile SDK开发了一款无人机航线规划软件.当地也不算偏僻,然而高德卫星地图缩放等级约为16,无法满足作业需求.调查了其他 ...
- 对于Osmdroid源码资源的简单研究
1.首先了解一下OSM OpenStreetMap 是一个世界地图,可依据开放许可协议自由使用.OpenStreetMap的优缺点:优点:数据开放,可自己搭建服务器,自己修改数据:缺点:数据尚不完善, ...
最新文章
- 各种Web漏洞测试平台
- Java虚拟机的研究与实现
- 【题解】Luogu P3674 小清新人渣的本愿
- Raid5.h注释翻译
- php mysql 全文检索_MySQL中文全文检索
- MS CRM 4中,添加营销列表成员查找列
- Atitit 非结构化数据管理法 目录 1. 什么是非结构化数据?	1 2. 对非结构化数据也即对全文数据的搜索主要有两种方法:	2 2.1. 顺序扫描法(Serial Scanning):	2 2
- python虚拟环境--virtualenv
- vdbench - 性能压力测试工具
- 如何使用Frontline实时抓取蓝牙协议栈HCI LOG
- Elasticsearch7 mapping和setting简介
- 初中英语语法(010)-分词
- Closures in OOC
- 网易我的世界服务器存档在哪个文件夹,网易版我的世界如何删除玩家存档
- 错误 编码(此代码是错误的)
- DS_Store是什么?
- 不要跟穷鬼学着做副业
- AWS s3 java api使用
- 【宋红康 MySQL数据库 】【高级篇】【03】MySQL的数据目录
- java实现lz77算法实例_数据压缩算法---LZ77算法 的分析与实现
热门文章
- Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)
- 开发神技能 | Python Mock 的入门
- 用计算机弹出thatgirl,抖音thatgirl谐音唱法音译 thatgirl歌词是什么意思中文翻译...
- (网络视频监控)面试题12
- 【比亚迪半导体】关联销售占比超过50%,关联销售毛利率是非关联销售的一倍
- Javaweb零基础学习(壹)
- C#练习题答案: 英雄的根【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
- 升级生态主张:阿里云为千行百业带来了什么?
- FAL_SERVER参数解释
- 关于在手机端可以看到加入的百度网盘群,在pc段找不到的原因