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); } } }