google map

com.google.android.maps包,其中包含了一系列用于在Google Map上显示、控制和层叠信息的功能类,以下是该包中最重要的几个类:

·MapActivity:这个类是用于显示Google Map的Activity类,它需要连接底层网络。MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity,并且在其派生类的onCreate()中,都要创建一个MapView实例。

·MapView:MapView是用于显示地图的View组件。它派生自android.view.ViewGroup。它必须和MapActivity配合使用,而且只能被MapActivity创建,这是因为MapView需要通过后台的线程来连接网络或者文件系统,而这些线程要由MapActivity来管理。

·MapController:MapController用于控制地图的移动、缩放等。

·Overlay:这是一个可显示于地图之上的可绘制的对象。

·GeoPoint:这是一个包含经纬度位置的对象。

 

com.google.android.location包,其中包括以下几个重要的功能类:

·LocationManager:本类提供访问定位服务的功能,也提供获取最佳定位提供者的功能。另外,临近警报功能也可以借助该类来实现。

·LocationProvider:该类是定位提供者的抽象类。定位提供者具备周期性报告设备地理位置的功能。

·LocationListener:提供定位信息发生改变时的回调功能。必须事先在定位管理器中注册监听器对象。

·Criteria:该类使得应用能够通过在LocationProvider中设置的属性来选择合适的定位提供者。

·Geocoder:用于处理地理编码和反向地理编码的类。地理编码是指将地址或其他描述转变为经度和纬度,反向地理编码则是将经度和纬度转变为地址或描述语言,其中包含了两个构造函数,需要传入经度和纬度的坐标。getFromLocation方法可以得到一组关于地址的数组。

要使用地理定位,首先需要取得LocationManager的实例,在Android中,获得LocationManager的唯一方法是通过getSystemService()方法的调用。通过使用LocationManager,我们可以获得一个位置提供者的列表。在一个真实的手持设备中,这个列表包含了一些GPS服务。我们也可以选择更强大、更精确、不带有其他附加服务的GPS。

 

 

一:创建MapView

定位服务如何在地图上更好的为用户服务

1.Google Map

提供了一组API,方便在英语程序中提供了基于地图的功能,

Android将大部分的地图功能封装在MapView当中

MapView通过GoogleMaps服务取得数据并以地图方式显示出来

MapView提供了一组控件用于地图的控制(放大,缩小......)

 

2.获取Maps API Key

 

3.创建第一个Mapview

创建项目 选择google APIs:

创建模拟器:选择Target:Googel APIs

 

在AndroidManifest.xml文件中添加库及权限设置

<uses-permission android:name="android.permission.INTERNET" /> 根目录:manifest

<uses-library android:name="com.google.android.maps" />根目录:application

 

 

xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <com.google.android.maps.MapView
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:enabled="true"
    	android:clickable="true"
    	android:apiKey="0pkT0EYxPi2VZ5beDaJ0g08aCtWGmKTFnOvj6iw"
    	/>
</LinearLayout>

 

继承MapActivity:

 

public class MainActivity extends MapActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
   
}

 



 

 

 

二:在地图上进行标记

1.在地图上添加标记

1)在MapView之上创建一个单独的图层

2)创建标记对象

3)将标记显示在指定的图层的指定位置

4)处理点击事件的处理

 



 

 

2.Overlay的使用

一个overlay对象就代表了显示在mapview之上的图层,在一个overlay当中可以包含多个标记;

3.ItemizedOverlay的作用

1)ItemizedOverlay是Overlay的子类

2)在该类当中有一个或者多个OverlayItem

3)每一个OverlayItem代表一个标记

4.ItemizedOverlay的使用方法

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<com.google.android.maps.MapView
		android:id="@+id/mapViewId"
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:enabled="true"
    	android:clickable="true"
    	android:apiKey="0na4gDfg_3L5BYZfFIsssUlzaxw1NkpuyDxsWsA"
    	/>
</LinearLayout>

 

MainActivity.java

public class MainActivity extends MapActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MapView mapView = (MapView)findViewById(R.id.mapViewId);
        //设置mapView显示用于缩放的工具条
        mapView.setBuiltInZoomControls(true);
        
        Drawable drawable = getResources().getDrawable(R.drawable.index);//图标设置
        FirstOverlay firstOverlay = new FirstOverlay(drawable,this);//创建一个新的overlay
      //创建一个GeoPoint对象,用于通过经纬度指定地图上的一个点
        GeoPoint point = new GeoPoint(19240000,-99120000);
        //创建一个OverlayItem对象,代表图层上的一个标记
        OverlayItem overlayItem = new OverlayItem(point,"hola,mundo!","I'm in china!");
        //将创建好的overlayItem对象添加到创建好的FirstOverlay当中
        firstOverlay.addOverlay(overlayItem);
        //调用MapView对象的getOverlays(),得到所有的图层对象
        List<Overlay> mapOverlays = mapView.getOverlays();
        //将创建好的FirstOverlay对象添加到MapOverlay当中
        mapOverlays.add(firstOverlay);
    }

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
}

  

Firstoverlay.java

 

/**
 * 在MapView之上创建一个图层,需要创建一个类,实现Overlay,
 * 并生成该类的对象,然后将该对象添加到MapView.getOverlays()中;
 * 一个overlayItem对象就代表了一个在地图上显示的标记
 */
public class FirstOverlay extends ItemizedOverlay<OverlayItem>{
	//创建一个List对象,用于持有该图层当中所有的标记对象
	private ArrayList<OverlayItem> overlayItems = new ArrayList<OverlayItem>();
	private Context context;
	
	public FirstOverlay(Drawable defaultMaker) {
		super(boundCenter(defaultMaker));
	}
	
   // 指定标记所使用的默认图片
	public FirstOverlay(Drawable defaultMaker,Context context) {
		//boundCenter(defaultMaker):将要标记的经纬度点放在defaultMaker的正下方
		//必须调用弗雷的构造函数
		super(boundCenter(defaultMaker));
		this.context = context;
	}
	
	//用于将生成好的overlayItem对象添加到List当中
	public void addOverlay(OverlayItem overlayItem){
		overlayItems.add(overlayItem);
		//为新添加进来的overlayItem统一执行相关的操作,
		//有新的overlayItem进来时,在调用其他函数前要先调用populate()
		populate();
	}
	
	//用于创建一个OverlayItem对象
	@Override
	protected OverlayItem createItem(int i) {
		// TODO Auto-generated method stub
		return overlayItems.get(i);
	}

	//返回当前的Overlay当中所包含的overlayItem对象
	@Override
	public int size() {
		// TODO Auto-generated method stub
		return overlayItems.size();
	}
	
	//当用户点击标记执行的操作
	@Override
	public boolean onTap(int index) {//点击了index表示的标记
		OverlayItem item = overlayItems.get(index);
		AlertDialog.Builder builder = new AlertDialog.Builder(context);//新弹出框
		builder.setTitle(item.getTitle());
		builder.setMessage(item.getSnippet());
		Dialog dialog = builder.create();
		dialog.show();
		return true;
	}

}

 

三:在overlay上面绘制一条直线

 

1.project的作用

地理坐标<------->屏幕坐标
topixles()      经纬度---->屏幕坐标

frompixles()  屏幕坐标----->经纬度

2.在Google Map上绘制直线的方法

确定线路的起始位置的经纬度坐标

在起点终点绘制图标

经纬度坐标转换为屏幕的X,Y坐标

在起点和终点之间绘制路线

 

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<com.google.android.maps.MapView
		android:id="@+id/mapViewId"
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:enabled="true"
    	android:clickable="true"
    	android:apiKey="0na4gDfg_3L5BYZfFIsssUlzaxw1NkpuyDxsWsA"
    	/>
</LinearLayout>

  

 

MainActivity.java

public class MainActivity extends MapActivity {
	private Projection projection;
	private List<Overlay> overlays;
	private MapController mapController;
	private GeoPoint beginGeoPoint;
	private GeoPoint endGeoPoint;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //创建起点和终点的GeoPoint对象
        beginGeoPoint = new GeoPoint(19240000,-99120000);
        endGeoPoint = new GeoPoint(19340000,-99220000);
        //得到mapView对象
        MapView mapView = (MapView)findViewById(R.id.mapViewId);
        mapView.setBuiltInZoomControls(true); //放大缩小工具条
        
        //mapController主要用于对地图进行控制
        mapController = mapView.getController();
        overlays = mapView.getOverlays();
        projection = mapView.getProjection();
        
        //把pointOverlay对象添加到List<overlay>中
        overlays.add(new PointOverlay(beginGeoPoint));
        //把pointOverlay对象添加到List<overlay>中
        overlays.add(new PointOverlay(endGeoPoint));
        //把lineOverlay添加到List<overlay>中
        overlays.add(new LineOverlay(beginGeoPoint,endGeoPoint));
        
        
        //将地图以动画的形式移动到指定的点
        mapController.animateTo(beginGeoPoint);
        //设置地图的放大级别
        mapController.setZoom(12);
    }
    

	@Override
	protected boolean isRouteDisplayed() 
	{
		// TODO Auto-generated method stub
		return false;
	}
	
	//内部类,该类的对象的作用是在地图上绘制图标
	class PointOverlay extends Overlay
	{
		private GeoPoint geoPoint;
		public PointOverlay(){	}
		public PointOverlay(GeoPoint geoPoint){
			this.geoPoint = geoPoint;
		}
		public void draw(Canvas canvas,MapView mapView,boolean shadow){
			super.draw(canvas, mapView, shadow);
			
			Point point = new Point();
			//将geoPoint转换为屏幕上的X、Y轴坐标
			projection.toPixels(geoPoint, point);
			//设置图标
			Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.tool);
			Paint paint = new Paint();//新建一个画笔对象
			//Y轴-30是为了调整图片的显示位置(默认是讲图片的左上角对应到经纬度点)
			canvas.drawBitmap(bmp,point.x,point.y-30,paint);
		}
	}
	
	//内部类,在起点和终点间画路线层
	class LineOverlay extends Overlay
	{
		private GeoPoint begin;
		private GeoPoint end;
		public LineOverlay(){}
		public LineOverlay(GeoPoint begin,GeoPoint end){
			this.begin = begin;
			this.end = end;
		}
		public void draw(Canvas canvas,MapView mapView,boolean shadow)
		{
			super.draw(canvas, mapView, shadow);
			Paint paint = new Paint();
			paint.setColor(Color.BLUE);
			//设置线条的样式(填满的空心线)
			paint.setStyle(Paint.Style.FILL_AND_STROKE);
			paint.setStrokeWidth(2);
			Point beginPoint = new Point();
			Point endPoint = new Point();
			Path path = new Path();
			projection.toPixels(begin,beginPoint);
			projection.toPixels(end,endPoint);
			//指定划线的起始点
			path.moveTo(beginPoint.x,beginPoint.y);
			//指定划线的终点
			path.lineTo(endPoint.x,endPoint.y);
			canvas.drawPath(path,paint);
		}
	}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值