zoukankan      html  css  js  c++  java
  • Android应用中使用百度地图API并加入标注(一)

    网上一些资料这样的的内容已经过时了,这里是最新的内容,假设哪里不正确,请吐槽。。。

    1)下载百度地图移动版API(Android)开发包
          要在Android应用中使用百度地图API,就须要在project中引用百度地图API开发包,这个开发包包括两个文件:

    下载地址:http://pan.baidu.com/s/1i31enrB

    2)申请API Key

    //包名

    格式:比如:B7:6C:CF:E2:47:50:9B:3E:34:F7:08:72:F3:AC:F1:BE:55:D3:77:FB;com.majianjie.baidumap
       申请地址:http://lbsyun.baidu.com/apiconsole/key

    3)创建一个Androidproject  文件夹结构例如以下:


    4)在布局文件里加入地图控件(res/layout/activity_main.xml)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
    
        <com.baidu.mapapi.map.MapView
            android:id="@+id/bmapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />
    
    </LinearLayout>

    5)创建Activity

    package com.majianjie.baidumap;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.widget.Toast;
    
    import com.baidu.mapapi.BMapManager;
    import com.baidu.mapapi.MKGeneralListener;
    import com.baidu.mapapi.map.MKEvent;
    import com.baidu.mapapi.map.MKMapViewListener;
    import com.baidu.mapapi.map.MapController;
    import com.baidu.mapapi.map.MapPoi;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.map.OverlayItem;
    import com.baidu.platform.comapi.basestruct.GeoPoint;
    import com.example.baidumap.R;
    
    public class MainActivity extends Activity {
    	private Toast mToast;
    	private BMapManager mBMapManager;
    	public MapView mMapView = null;			//MapView 是地图主控件
    	private MapController mMapController = null;//用MapController完毕地图控制
    	MKMapViewListener mMapListener = null;     //MKMapViewListener 用于处理地图事件回调
    	// 显示交通地图
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		/**
    		 * 使用地图sdk前需先初始化BMapManager,这个必须在setContentView()先初始化
    		 */
    		mBMapManager = new BMapManager(this);
    		
    		//第一个參数是API key,   第二个參数是经常使用事件监听,用来处理通常的网络错误,授权验证错误等,你也能够不加入这个回调接口
    		mBMapManager.init("LDtH1sVwr7kygaF0aTqaVwWU", new MKGeneralListener() {
    			
    			//授权错误的时候调用的回调函数
    			@Override
    			public void onGetPermissionState(int iError) {
    				if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
    					showToast("API KEY错误, 请检查!");
    	            }
    			}
    			
    			//一些网络状态的错误处理回调函数
    			@Override
    			public void onGetNetworkState(int iError) {
    				if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
    					Toast.makeText(getApplication(), "您的网络出错啦!", Toast.LENGTH_LONG).show();
    	            }
    			}
    		});
    		
    		
    		setContentView(R.layout.activity_main);
    		
    		mMapView = (MapView) findViewById(R.id.bmapView);
    		
            
            mMapController = mMapView.getController();     // * 获取地图控制器
            mMapController.enableClick(true);                //*  设置地图是否响应点击事件  . 
            mMapController.setZoom(12);					// * 设置地图缩放级别
            mMapView.setBuiltInZoomControls(true);      // * 显示内置缩放控件
            mMapView.setSatellite(true);				//设置显示为卫星地图:
            //mMapView.setBuiltInZoomControls(true);
            
            /** 
             *  在想要加入Overlay的地方使用下面代码, 
             *  比方Activity的onCreate()中 
             */  
            //准备要加入的Overlay  
            double mLat1 = 39.904508;  
            double mLon1 = 119.53971899999999;  
           
            // 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)  
            GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));  
            //准备overlay图像数据,依据实情情况修复  
            Drawable mark= getResources().getDrawable(R.drawable.set);  
            //用OverlayItem准备Overlay数据  
            OverlayItem item1 = new OverlayItem(p1,"item1","item1");  
            //使用setMarker()方法设置overlay图片,假设不设置则使用构建ItemizedOverlay时的默认设置  
               
            //创建IteminizedOverlay  
            CustomItemizedOverlay itemOverlay = new CustomItemizedOverlay(mark, mMapView);  
            //将IteminizedOverlay加入到MapView中  
              
            mMapView.getOverlays().clear();  
            mMapView.getOverlays().add(itemOverlay);  
               
            //如今全部准备工作已准备好,使用下面方法管理overlay.  
            //加入overlay, 当批量加入Overlay时使用addItem(List<OverlayItem>)效率更高  
            itemOverlay.addItem(item1);  
            mMapView.refresh(); 
            
             mMapController.setCenter(p1);						//设置p地方为中心点
            mMapView.regMapViewListener(mBMapManager, new MKMapViewListener() {
    			
            	// * 地图移动完毕时会回调此接口 方法
    			@Override
    			public void onMapMoveFinish() {
    				showToast("地图移动完毕!");
    			}
    			
    			 //* 地图载入完毕回调此接口方法
    			@Override
    			public void onMapLoadFinish() {
    				showToast("地图载入完毕!");
    			}
    			
    			 //*  地图完毕带动画的操作(如: animationTo())后,此回调被触发
    			@Override
    			public void onMapAnimationFinish() {
    				
    			}
    			
    			 //当调用过 mMapView.getCurrentMap()后,此回调会被触发  可在此保存截图至存储设备
    			@Override
    			public void onGetCurrentMap(Bitmap arg0) {
    				
    			}
    			
    			 //* 点击地图上被标记的点回调此方法
    			@Override
    			public void onClickMapPoi(MapPoi arg0) {
    				if (arg0 != null){
    					showToast(arg0.strText);
    				}
    			}
    		});
    	}
    
    
    	
    	@Override
    	protected void onResume() {
        	//MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
    		mMapView.onResume();
    		super.onResume();
    	}
    
    
    
    	@Override
    	protected void onPause() {
    		//MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
    		mMapView.onPause();
    		super.onPause();
    	}
    
    	@Override
    	protected void onDestroy() {
    		//MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
    		mMapView.destroy();
    		
    		//退出应用调用BMapManager的destroy()方法
    		if(mBMapManager != null){
    			mBMapManager.destroy();
    			mBMapManager = null;
    		}
    		
    		super.onDestroy();
    	}
    
    	
    	
         //* 显示Toast消息 
        private void showToast(String msg){  
            if(mToast == null){  
                mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);  
            }else{  
                mToast.setText(msg);  
                mToast.setDuration(Toast.LENGTH_SHORT);
            }  
            mToast.show();  
        } 
    	
    	
    }
    

    6)在AndroidManifest.xml中配置  加入权限

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    
      <uses-permission android:name="android.permission.INTERNET" />    
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    
      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    
      <uses-permission android:name="android.permission.READ_PHONE_STATE" />  

    7)另一个文件是自己定义的,继承自:ItemizedOverlay(百度地图中的,不是Android自己的)

    Overlay简单介绍
          Overlay通常被译为“图层”或“覆盖物”。那么对于地图而言,什么称之为覆盖物?“全部叠加或覆盖到地图之上的内容,都被称之为地图覆盖物,如标注、矢量图形元素(包含:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会对应的移动。
          为了让大家可以对Overlay有更进一步的认识,我们再通过以下的图形来直观的认识它。 图中标记的那些红色的图标A,B,...,J正是Overlay的当中一种形式。假设你了解PhotoShop中图层的概念,这里应该不难理解。我们可以这样来理解地图、图层与图层上标记物三者的关系: 下图中的那些红色标记并不属于地图的一部分,这些全部的标记是附着在图层上的,然后将图层蒙在地图之上。

    百度地图API提供的几种Overlay
          百度地图API提供了下面几种Overlay(覆盖物): 
          1)Overlay:它是全部覆盖物的抽象基类,全部的覆盖物均继承此类的方法,实现用户自己定义图层显示;
          2)MyLocationOverlay:一个负责显示用户当前位置的Overlay; 
          3)ItemizedOverlay:它包括了一个OverlayItem列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上;
          4)PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比方在北京市搜索“公园”,通过此图层将公园显示在地图上; 
          5)RouteOverlay:步行、驾车导航线路图层,将步行、驾车出行方案的路线及关键点显示在地图上;
          6)TransitOverlay:公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上。


    以下的文件是:CustomItemizedOverlay.java    网上有些内容是比較早的,百度地图API已经放弃使用了,这里是最新的,具体:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3

    package com.majianjie.baidumap;
    
    import android.graphics.drawable.Drawable;
    import com.baidu.mapapi.map.ItemizedOverlay;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.map.OverlayItem;
    import com.baidu.platform.comapi.basestruct.GeoPoint;
    
    public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {  
        //用MapView构造ItemizedOverlay  
        public CustomItemizedOverlay(Drawable mark,MapView mapView){  
                super(mark,mapView);  
        }  
        protected boolean onTap(int index) {  
            //在此处理item点击事件  
            System.out.println("item onTap: "+index);  
            return true;  
        }  
            public boolean onTap(GeoPoint pt, MapView mapView){  
                    //在此处理MapView的点击事件,当返回 true时  
                    super.onTap(pt,mapView);  
                    return false;  
            }  
    }          


    执行图:


    基本就这些,百度地图API中的内容非常丰富,之后会陆续加入,请继续关注!谢谢!假设哪里不正确,请吐槽。。。


  • 相关阅读:
    Swift3 重写一个带占位符的textView
    Swift3 使用系统UIAlertView方法做吐司效果
    Swift3 页面顶部实现拉伸效果代码
    Swift3 倒计时按钮扩展
    iOS 获取当前对象所在的VC
    SpringBoot在IDEA下使用JPA
    hibernate 异常a different object with the same identifier value was already associated with the session
    SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心
    SpringCloud IDEA 教学 (五) 断路器控制台(HystrixDashboard)
    SpringCloud IDEA 教学 (四) 断路器(Hystrix)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4199836.html
Copyright © 2011-2022 走看看