`
longgangbai
  • 浏览: 7339366 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GIS的学习(三十九)针对osmdroid的扩展之MyLocationOverlay

阅读更多

          在许多用地图应用中,在地图第一次加载的时候,可能将用户当前的位置定位的地图的中心,有时候可能有一个定位的功能,那么当点击点位的时候,需要地图的以当前用户所在位置为中心那么就需要重写MyLocationOverlay类实现相关的功能。

 

针对MyLocationOverlay的重写如下:

package com.etrip.osmdroid;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.MyLocationOverlay;
import com.etrip.osmdroid.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Location;
/**
 * 重写的目的是在于
 * 1.让当前的位置位于地图的中心位置
 * 
 * 
 * 原文:
 *   http://stackoverflow.com/questions/4175432/mylocationoverlay-change-the-marker
 *   
 *   如果想改变当前位置的图标和标记颜色,可以采用以下两种方式实现:
 *   Step #1: Create a subclass of MyLocationOverlay.
 *   Step #2: Override drawMyLocation() 
 *   
 *   
 *   
 * 
 */
public class CurrentLocationOverlay extends MyLocationOverlay {    
	private final static int PADDING_ACTIVE_ZOOM     = 50;    
	private MapController    mc;   
	private Bitmap           marker;   
	private Point            currentPoint            = new Point();    
	private boolean          centerOnCurrentLocation = true;    
	private int              height;   
	private int              width;    
	/**    
	 * By default this CurrentLocationOverlay will center on the current location, 
	 * if the currentLocation is near the    
	 * edge, or off the screen. To dynamically enable/disable this, 
	 * use {@link #setCenterOnCurrentLocation(boolean)}.    
	 * @param context    
	 * @param mapView    
	 */   
	public CurrentLocationOverlay(Context context, MapView mapView) {     
		super(context, mapView);     
		this.mc = mapView.getController();    
		this.marker = BitmapFactory.decodeResource(context.getResources(), R.drawable.marker_default);   
	}    
	protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLocation, long when) {  
		if (this.height == 0) {       
			this.height = mapView.getHeight();       
			this.width = mapView.getWidth();    
		}    
		mapView.getProjection().toPixels(myLocation, currentPoint); 
		
		canvas.drawBitmap(marker, currentPoint.x, currentPoint.y - 40, null);   
	}    
	@Override   
	public synchronized void onLocationChanged(Location location) {     
		super.onLocationChanged(location);    
		// only move to new position if enabled and we are in an border-area
		if (mc != null && centerOnCurrentLocation && inZoomActiveArea(currentPoint)) {
			mc.animateTo(getMyLocation());  
			setCenterOnCurrentLocation(true);
		}   
	}    
	private boolean inZoomActiveArea(Point currentPoint) {     
		if ((currentPoint.x > PADDING_ACTIVE_ZOOM && currentPoint.x < width - PADDING_ACTIVE_ZOOM) && (currentPoint.y > PADDING_ACTIVE_ZOOM && currentPoint.y < height - PADDING_ACTIVE_ZOOM)) {       
			return false;     
		}     
		return true;   
	}    
	public void setCenterOnCurrentLocation(boolean centerOnCurrentLocation) {     
		this.centerOnCurrentLocation = centerOnCurrentLocation;   
	} 
}

 

 

测试代码如下:

package com.etrip.osmdroid;

import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;

import android.app.Activity;
import android.os.Bundle;

/**
 * 
 * 
 * 
 * @author longgangbai
 */
public class MainActivity extends Activity {

		private MapController mapController;   
	    private MapView mapView;   
	    /** Called when the activity is first created. */  
	    @Override  
	    public void onCreate(final Bundle savedInstanceState) {   
	        super.onCreate(savedInstanceState);   
	        setContentView(R.layout.activity_main);   
	        mapView = (MapView) findViewById(R.id.map);   
	        mapView.setTileSource(TileSourceFactory.MAPNIK);    
	        mapView.setBuiltInZoomControls(true);   
	        mapController = mapView.getController();   
	        mapController.setZoom(8);  
	        CurrentLocationOverlay locationOverlay=new CurrentLocationOverlay(this,mapView);
	        locationOverlay.enableCompass();
	        locationOverlay.enableFollowLocation();
	        locationOverlay.enableMyLocation();
	        //GeoPoint geopoint=new GeoPoint(39.92605, 116.42616);    
	       // mapController.setCenter(locationOverlay.getMyLocation()); 
	        mapView.getOverlays().add(locationOverlay);
	     }   
}

 

 

 

 

 

分享到:
评论

相关推荐

    Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用 实例源码

    Android 百度地图开发(二)--- 定位功能之MyLocationOverlay,PopupOverlay的使用,项目详情http://blog.csdn.net/xiaanming/article/details/11380619

    Google!Android手機應用程式設計入門

    第三十九章 取得現在位置(GPS/基地台三角定位) 第四十章 結合地圖與定位功能(MyLocationOverlay) 第四十一章 為地圖標上地標(ItemizedOverlay) 附錄A 後記 附錄B如何取得範例原始碼 这个是他BLOG的电子版,如...

    Android地图和定位学习总结.docx

    以下是对Android地图和定位学习的详细总结。 首先,Android的定位功能主要依赖于`LocationManager`类,它是系统服务`Context.LOCATION_SERVICE`的一部分。`LocationManager`提供了与各种位置提供者(如GPS和网络...

    Android地图和定位学习总结.pdf

    在本文中,我们将深入探讨Android地图和定位学习的一些核心知识点。 首先,Android的定位服务主要依赖于`android.location`包。该包包含了几个关键的接口和类,例如`GpsStatus.Listener`用于监听GPS的状态变化,`...

    百度地图在范围内进行标注

    MyLocationOverlay myLocationOverlay = new MyLocationOverlay(this, mapView); myLocationOverlay.addItem(overlayItem); mapView.getOverlays().add(myLocationOverlay); ``` 为了实现范围内的标注,我们需要...

    搜狗地图API_Demo

    总结,"搜狗地图API_Demo"是学习和实践搜狗地图API的理想资源。通过上述各个组件的运用,开发者不仅可以创建具有三维视图的地图应用,还能实现精确的定位服务、高效的地图搜索、丰富的标注展示以及交互式的信息窗口...

    百度地图信息推送报告

    (四)地图定位和我的位置图层MyLocationOverlay 9 (五)自定义图层ItemizedOverlay和在地图上增加标注 10 (六)增加点击标注弹出气泡(显示标注信息)的功能 12 (七)增加POI搜索功能 15 三、百度地图的信息推送 ...

    百度地图定位demo

    这个demo旨在帮助开发者了解和学习如何使用百度地图SDK进行位置服务的开发。 【描述】:百度地图定位demo包含了完整的源代码,演示了如何获取用户的实时位置、设置定位模式(如高精度、节约电量等)、显示定位信息...

    一种基于Android平台的智能导游系统.pdf

    - **自身定位**:借助百度地图API中的MyLocationOverlay类实现定位功能,并定时向服务器发送用户位置信息,以便更新服务器上的位置记录,同时也用于其他用户获取。 - **附近用户显示**:客户端向服务器发送请求...

    mapabc的文档

    #### 第九部分:API的MyLocationOverlay需要添加什么权限 为了使`MyLocationOverlay`功能正常工作,需要在AndroidManifest.xml中添加以下权限: ```xml ``` #### 第十部分:如何使用实时路况 使用实时路况功能...

    android开发培训实现GPS定位服务.docx

    #### 三、修改AndroidManifest.xml 为了使应用能够访问位置信息并使用Google Maps API,需要在`AndroidManifest.xml`文件中添加相应的权限声明: ```xml ``` #### 四、布局文件配置 接下来,在布局文件(如...

    android开发培训实现GPS定位服务

    在Android开发中,实现GPS定位服务是移动应用中常见的需求,尤其对于地理位置相关的应用来说至关重要。...通过不断学习和实践,开发者可以更好地掌握这些技能,为用户提供更加精准和便捷的地理位置服务。

    百度地图demo

    本文将深入探讨“百度地图Demo”的核心功能和实现原理,主要针对Android平台进行讲解。 首先,我们要理解“百度地图Demo”是百度地图SDK提供的一款示例程序,它包含了百度地图API的各种基本和高级功能的实例,帮助...

    Android高级编程--源代码

    由于现有的手机应用程序的开发是构建在各手机厂家的私有操作系统之上的,所以它限制了第三方应用程序的开发,而Android为我们提供了一个开放和通用的选择。因为没有了人为制造的障碍,所以Android开发人员可以自由地...

    beginning android

    * Work with TabActivity, MyLocationOverlay, DDMS, and more * Utilize the distinctive capabilities of the Android engine including maps, Internet access, integrated search, media playback, and more ...

    Baidu_map(百度地图)Android平台开发指南(PDF)

    百度地图Android平台开发指南是一份专门针对Android开发者的详细文档,旨在指导开发者如何在Android平台上利用百度地图API开发出功能丰富的地图应用程序。文档内容涵盖了从基础的应用设置到地图功能实现的各个阶段,...

    Android-基于百度地图API实现定位功能

    在Android应用开发中,集成地图服务是常见的需求之一,尤其是实现定位功能。本教程将详细介绍如何利用百度地图API在Android应用程序中实现精准的定位服务。首先,我们需要了解百度地图API的基本概念及其在Android中...

Global site tag (gtag.js) - Google Analytics