osmdroid基础教程(1)

开端

本文皆在指引大家在自己的项目里嵌入OpenStreetMap,并可以在地图上添加覆盖物、折线等常用地图功能。


1.1 API和文档

相关网站:

osm android版 : https://code.google.com/p/osmdroid/

osm android官方简介:http://wiki.openstreetmap.org/wiki/Android#OpenStreetMap_editing_features

osm 官方入口:http://wiki.openstreetmap.org/wiki/Main_Page

wiki 开发FAQ:http://wiki.openstreetmap.org/wiki/Developer_FAQ#Do_you_have_an_API.3F

osm tracker 简介:https://code.google.com/p/osmtracker-android/


1.2osmroid-android-3.0.10.jar

从openstreetmap android版官方网站下载jar包:osmroid-android-3.0.10.jar和slf4j-api-1.7.2.jar包,前者是地图库后者是个输出日志库,因为地图类库里使用到了,所以两者缺一不可。


1.3地图实例化

layout.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent" >  
  5.   
  6.     <org.osmdroid.views.MapView  
  7.         android:id="@+id/myOSMmapview"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         tilesource="MapquestOSM"  
  11.         android:clickable="true">  
  12.     </org.osmdroid.views.MapView>  
  13.   
  14. </RelativeLayout>  
osm.java:

[java]  view plain copy
  1. 示例代码:  
  2.         mMapView = (MapView) findViewById(R.id.myOSMmapview);  
  3.         mController = mMapView.getController();  
  4.         //ResourceProxy init  
  5.         mResourceProxy = new DefaultResourceProxyImpl(this);  
  6.         mMapView.setTileSource(TileSourceFactory.MAPNIK);  
  7.         mMapView.setBuiltInZoomControls(true);  
  8.         mMapView.setMultiTouchControls(true);  
  9.         //定位当前位置,北京市西长安街复兴路  
  10.         GeoPoint center = new GeoPoint(39.901873116.326655);  
  11.         mController.setCenter(center);  
  12.         mController.setZoom(8);  
效果图:

初始化后,地图可以正常显示,双指可以缩放地图比例尺

1.4 ItemizedOverlayWithFocus(overlay)

添加一个ItemizedOerlayWithFoucs类型的overlay
[java]  view plain copy
  1. 示例代码:  
  2.         //添加自定义image Overlay  
  3.         Drawable drawable = this.getResources().getDrawable(  
  4.                 R.drawable.marker_gpsvalid);  
  5.         ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();  
  6.         OverlayItem item = new OverlayItem("~title~""I`m a marker,a subtitile", center);  
  7.         item.setMarker(drawable);  
  8.         items.add(item);  
  9.           
  10.         this.mLocationOverlay = new ItemizedOverlayWithFocus<OverlayItem>(    
  11.                 items,    
  12.                 new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {    
  13.                     @Override    
  14.                     public boolean onItemSingleTapUp(final int index,    
  15.                             final OverlayItem item) {    
  16.                         return true;    
  17.                     }    
  18.   
  19.                     @Override    
  20.                     public boolean onItemLongPress(final int index,    
  21.                             final OverlayItem item) {    
  22.                         return false;    
  23.                     }    
  24.                 }, mResourceProxy);    
  25.         this.mLocationOverlay.setFocusItemsOnTap(true);  
  26.         this.mLocationOverlay.setFocusedItem(0);    
  27.         mMapView.getOverlays().add(mLocationOverlay);     
效果图:


可以添加自定义的Overlay,设置image。但是如代码中所示,实现了OnItemGestureListener接口,并返回true。

1.5 自定义Overlay

[java]  view plain copy
  1. 示例代码:  
  2.         //自定义marker图层  
  3.         ArrayList<OverlayItem> markers = new ArrayList<OverlayItem>();  
  4.         OverlayItem one = new OverlayItem("~one~""custom marker", gp1);  
  5.         one.setMarker(drawable);  
  6.         markers.add(one);  
  7.         CustomMarker marker = new CustomMarker(markers, gestureListener, mResourceProxy);  
  8.         mMapView.getOverlays().add(marker);  
  9.         mController.setCenter(gp1);  
  10.         mMapView.invalidate();  
  11. 自定义Overlay:  
  12.     /** 
  13.      * 自定义Marker 
  14.      * @author Administrator 
  15.      * 
  16.      */  
  17.     public class CustomMarker  extends ItemizedOverlayWithFocus<OverlayItem> implements org.osmdroid.views.overlay.ItemizedIconOverlay.OnItemGestureListener<OverlayItem>{  
  18.         public CustomMarker(  
  19.                 List<OverlayItem> aList,  
  20.                 org.osmdroid.views.overlay.ItemizedIconOverlay.OnItemGestureListener<OverlayItem> aOnItemTapListener,  
  21.                 ResourceProxy pResourceProxy) {  
  22.             super(aList, aOnItemTapListener, pResourceProxy);  
  23.         }  
  24.           
  25.         @Override  
  26.         public void addItem(int location, OverlayItem item) {  
  27.             super.addItem(location, item);  
  28.         }  
  29.         @Override  
  30.         protected boolean onTap(int index) {  
  31.             return super.onTap(index);  
  32.         }  
  33.         @Override  
  34.         public boolean onSingleTapUp(MotionEvent event, MapView mapView) {  
  35.             return super.onSingleTapUp(event, mapView);  
  36.         }  
  37.         @Override  
  38.         public int size() {  
  39.             return super.size();  
  40.         }  
  41.   
  42.         @Override  
  43.         public boolean onItemLongPress(int arg0, OverlayItem arg1) {  
  44.             return true;  
  45.         }  
  46.   
  47.         @Override  
  48.         public boolean onItemSingleTapUp(int arg0, OverlayItem arg1) {  
  49.             return true;  
  50.         }  
  51.           
  52.     }  

效果图:


1.6 MinimapOverlay(小地图)

[java]  view plain copy
  1. 示例代码:  
  2.                    //右下角小地图Overlay  
  3.                    MinimapOverlayoverlay = new MinimapOverlay(this,  
  4.                                      mMapView.getTileRequestCompleteHandler());  
  5.                    mMapView.getOverlays().add(overlay);  
效果图:


1.7PathOverlay(画线)和SimpleLocationOverlay

[java]  view plain copy
  1. 示例代码:  
  2.         //PathOverlay 路线Overlay  
  3.         GeoPoint gp1 = new GeoPoint(40.067225116.369758);  
  4.         GeoPoint gp2 = new GeoPoint(40.064808116.346362);  
  5.         GeoPoint gp3 = new GeoPoint(40.058669116.336648);  
  6.         GeoPoint gp4 = new GeoPoint(40.036685116.343619);  
  7.         GeoPoint gp5 = new GeoPoint(40.036368116.327699);  
  8.           
  9.         PathOverlay line = new PathOverlay(Color.BLUE, this);  
  10.         line.addPoint(gp1);  
  11.         line.addPoint(gp2);  
  12.         line.addPoint(gp3);  
  13.         line.addPoint(gp4);  
  14.         line.addPoint(gp5);  
  15.         mMapView.getOverlays().add(line);  
  16.         mController.setCenter(gp1);  
  17.         //Simple图层  
  18.         SimpleLocationOverlay simpleLocation = new SimpleLocationOverlay(this);  
  19.         simpleLocation.setEnabled(true);  
  20.         simpleLocation.setLocation(gp5);  
  21.         mMapView.getOverlays().add(simpleLocation);  

效果图:


黄色的小人便是simpleLocationOverlay


转载自http://blog.csdn.net/mad1989/article/details/9733985

OSMDroid 是一个开源Android 地图库,它允许开发者在 Android 应用程序中嵌入 OpenStreetMap 数据和地图功能。与原生 Google Maps API 不同,OSMDroid 是基于轻量级的 OSM 数据,这意味着它可以提供更好的离线地图支持,并且对隐私更加友好。 防止内存泄露(Memory Leaks)是 Android 开发中非常重要的一环,特别是在处理地图相关组件时,因为地图数据加载和绘制可能会占用大量内存。以下是一些避免 OSMDroid 防止内存泄露的方法: 1. **及时释放资源**:确保每次不再使用地图视图(MapView)、图层(Overlay)或数据源(TileProvider)时,调用相应的 `dispose()` 或 `removeAllOverlays()` 方法释放它们。 2. **使用弱引用**:对于持有地图对象的引用,可以考虑使用 WeakReference,这样即使其他强引用消失,弱引用也不会阻止垃圾回收。 3. **监听生命周期**:地图视图的 `OnDestroy()` 或 `onSaveInstanceState()` 方法中,记得清除地图相关的回调和监听器,以防止内存泄漏。 4. **批处理操作**:尽量减少在主线程执行耗时的操作,如绘制大图层或加载大量数据,可以使用异步任务或者 `AsyncTask` 来处理。 5. **使用 LruCache**:对于频繁访问但占用空间较大的地图数据,可以使用 LruCache 来缓存,当内存不足时自动清理最久未使用的数据。 6. **跟踪内存使用**:利用 Android 的内存分析工具(如 Android Studio 的 Memory Profiler 或第三方库如 LeakCanary)定期检查应用内存状况,找出可能的泄漏点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值