Android百度地图API使用教程

课1

百度地图应用

  • 百度地图.ppt
  • 百度地图API:API文档

    http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_2_0/

  • 67个类:其中6大核心类

    六大核心类

    >

    1.MapView

    com.baidu.mapapi.map 
    类 MapView
    java.lang.Object
      继承者 ViewGroup
          继承者 com.baidu.mapapi.map.MapView
    
    public class MapView extends ViewGroup
    
    显示地图的View。 
    
    一个显示地图的视图,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图。 
    

    2.MapController

    com.baidu.mapapi.map 
    类 MapController
    java.lang.Object
      继承者 com.baidu.mapapi.map.MapController
    
    public class MapController extends Object
    
    地图控制器 
    

    3.BMapManager

      java.lang.Object
      继承者 com.baidu.mapapi.BMapManager
    
    public class BMapManagerextends Object
    
    地图引擎管理类 
    

    4.Overlay

    com.baidu.mapapi.map 
    类 Overlay
    java.lang.Object
      继承者 com.baidu.platform.comapi.map.Overlay
          继承者 com.baidu.mapapi.map.Overlay
    
    直接已知子类: GraphicsOverlay, ItemizedOverlay, MyLocationOverlay, PoiOverlay, PopupOverlay, TextOverlay
    public abstract class Overlayextends Overlay
    
    Overlay是一个基类,它表示可以显示在地图上方的覆盖物。 
    
    从2.0.0开始,SDK不支持直接继承Overlay , 用户可通过继承ItemizedOverlay来添加覆盖物。 
    

    5.MKSearch

    java.lang.Object
      继承者 com.baidu.mapapi.search.MKSearch
    
    public class MKSearch extends Object
    
    搜索服务. 
    
    用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索 
    

    6.MKSearchListener

     接口 MKSearchListener

    public interface MKSearchListener

    搜索结果通知接口。

    该接口返回poi搜索,公交搜索,驾乘路线,步行路线结果

    百度地图入门步骤

    >

  • 获取APIKey

  • 建立工程
  • 图案家地图引擎到Android工程中
  • 添加权限
  • 初始化地图引擎
  • 引入布局(地图控件)

    案例:HelloWorld工程

    >

    1、申请百度地图key:

     http://developer.baidu.com/map/android-mobile-apply-key.htm
     (首先百度开放者账号)
    

    Values.java

    package com.itheima.constait;
    
    public interface Values {
        String key= "BFE6DAE8B029E5A2B2082D6B08D1C7220952CD8C";
    }
    

    2、新建工程HelloWorld

    把百度地图key放在Values接口里的key里
    

    3、把地图引擎添加到工程下:即把百度地图的jar包和armeabi里的so文件拷贝到工程目录下 4、把权限加载到清单文件里

    <!-- gps -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- wifi -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 存储数据 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 获取手机信息 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    

    以下两步顺序不能错

    5、初始化地图引擎:在MainActivity.java里初始化
    MapView:地图展示类
    MapController:控制地图:旋转 缩放 平移
    BMapManager:地图引擎管理类key校验
    
    在MainActivity里的initManager方法里初始化
    

    6、引入布局

    activity_main.xml里引入全路径的布局
    com.baidu.mapapi.map.mapView控件
    MainActivity里给mapView控件初始化
    initView()方法:布局控制的显示:加载布局
    

    百度地图项目:BDMaphm47

    >

    AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.itheima.helloworld"
        android:versionCode="1"
        android:versionName="1.0" >
    <!-- gps -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- wifi -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 存储数据 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 获取手机信息 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="18" />
        <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
    
    
    &lt;application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" &gt;
        &lt;activity
            android:name="com.itheima.helloworld.MainActivity"
            android:label="@string/app_name" &gt;
            &lt;intent-filter&gt;
                &lt;action android:name="android.intent.action.MAIN" /&gt;
    
                &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.GpsActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.WalkingSearch"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.DrivingSearchActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.TransitSearchActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.CitySearchActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.SearchNearByActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.ItemizedOverlayActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.GraphicsOverlayActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.TextOverlayActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.MapControlerActitivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.MyLocationActivity"&gt;&lt;/activity&gt;
        &lt;activity android:name="com.itheima.helloworld.LayerActivity"&gt;&lt;/activity&gt;
    
    <service android:name=”com.baidu.location.f” android:enabled=”true” android:process=”:remote”> </service>
        &lt;/application&gt;
    
    </manifest>

    MainActivity.java

    public class MainActivity extends ListActivity {
        private ListView lv_items;
        private String[] items = new String[]{"地图控制","地图图层","文字覆盖","图形覆盖","多条目覆盖","半径检索","全城搜索","公交换乘","驾驶检索","步行检索","gps定位"};
        private Class[] actions = new Class[]{MapControlerActitivity.class,LayerActivity.class,TextOverlayActivity.class,GraphicsOverlayActivity.class,ItemizedOverlayActivity.class,SearchNearByActivity.class,CitySearchActivity.class,TransitSearchActivity.class,DrivingSearchActivity.class,WalkingSearch.class,MyLocationActivity.class};
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
    
        lv_items = getListView();
        //setData();
        //给listview设置数据
        setData();
        //设置点击事件
        setEvent();
    }
    private void setEvent() {
        // TODO Auto-generated method stub
        lv_items.setOnItemClickListener(new OnItemClickListener() {
    
            @Override
            public void onItemClick(AdapterView&lt;?&gt; arg0, View arg1, int position,
                    long arg3) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(MainActivity.this,actions[position]);
                startActivity(intent);
            }
        });
    }
    private void setData() {
        // TODO Auto-generated method stub
        ArrayAdapter&lt;String&gt; datas = new ArrayAdapter&lt;String&gt;(this, android.R.layout.simple_list_item_1, items);
        lv_items.setAdapter(datas);
    }
    
    }

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    
    
    tools:context=".MainActivity" &gt;
    
    &lt;com.baidu.mapapi.map.MapView
        android:id="@+id/mv_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        /&gt;
    
    </RelativeLayout>

    BaseActivity.java

    public class BaseActivity extends Activity {
        //搜索服务类
        protected MKSearch mksearch;
        //地图展示类
        protected MapView mapView;
        //地图引擎管理类 key校验
        protected BMapManager mapManager;
        //控制地图    旋转 缩放 平移
        protected MapController mapController;
        //113.927322,22.582866
        int latitude = (int)22.582866E6;
        int longitudeE6 =  (int)113.927322E6;
        protected GeoPoint centerszhm = new GeoPoint(latitude, longitudeE6);
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_main);
            //以下两步顺序不能乱
            //5,初始化引擎
            initManager();
            //6,布局显示
            initView();
    
    
    }
    private void initView() {
    
        setContentView(R.layout.activity_main);
        mapView = (MapView) findViewById(R.id.mv_view);
        //设置是否启用内置的缩放控件。
        mapView.setBuiltInZoomControls(true);
        mapController = mapView.getController();
        //在给定的中心点GeoPoint上设置地图视图。
        mapController.setCenter(centerszhm);
        //设置地图的缩放级别。
        mapController.setZoom(15);
    
        //搜索到的兴趣点 点击
        mapController.enableClick(true);
        //初始化搜索服务
        mksearch = new MKSearch();
    }
    /** 
     * 初始化地图引擎
     */
    private void initManager() {
        // TODO Auto-generated method stub
        mapManager = new BMapManager(this);
        mapManager.init(Values.key, new MKGeneralListener() {//该接口返回网络状态,授权验证等结果,用户需要实现该接口以处理相应事件
    
            /**
             *  权限的返回结果
             */
            @Override
            public void onGetPermissionState(int state) {
                if (state == MKEvent.ERROR_PERMISSION_DENIED){//失败
                    Toast.makeText(getApplicationContext(), "key校验失败", 0).show();
                }
    
            }
    
            /**
             * 网络连接返回结果
             */
            @Override
            public void onGetNetworkState(int state) {
                if (state == MKEvent.ERROR_NETWORK_CONNECT){
                    Toast.makeText(getApplicationContext(), "没有网络", 0).show();
    
                }
    
            }
        });
    
    }
    
    /**
     * 把百度地图的生命周期和Activity生命周期绑定
     */
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        mapView.destroy();
        super.onDestroy();
    }
    
    /**
     * 把百度地图的生命周期和Activity生命周期绑定
     */
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        mapView.onPause();
        super.onPause();
    }
    
    /**
     * 把百度地图的生命周期和Activity生命周期绑定
     */
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        mapView.onResume();
        super.onResume();
    }
    
    protected abstract class MKSearchAdapter implements MKSearchListener{
    
        @Override
        public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onGetPoiDetailSearchResult(int arg0, int arg1) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
            // TODO Auto-generated method stub
    
        }
    
    }
    
    }

    百度地图:控制地图的平移、缩放和旋转

    >
    在initView()方法里增加setBuiltInZoomControls

    ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/wCgo4xKNsbYMhRWjN09JIg==/6608558563655556255.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
      运行工程:效果如下:默认是北京
    ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/NOklc5q1ZlJNRg51gCyG6Q==/6619080889933250575.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
      怎么查看我们现在所在的火星坐标呢? 去网站里查我们所需的火星坐标。 ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/-eBS7ZoMWJg2t6Db9owOGQ==/6619430534630880570.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)   在mapController里去设置坐标setCenter(坐标参数)方法 在使用mapController前首先获取该类的对象。该类时单例模式,所以使用api来获取对象 GeoPoint类的对象加载坐标,然后赋给mapController.setCenter(GeoPoint类的对象) 测试:![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/iTigwoX3C1LKL9VKoHP9Ig==/6608570658283460551.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)  

    缩放级别

    v1.x  3 – 18

    v2.x 3 – 19/

    MapControlerActivity.java

    /**
    
       
       
    • 控制地图 平移 缩放 旋转

      • @author Administrator
    • */
      public class MapControlerActitivity extends BaseActivity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);

      }

      @Override
      public boolean onKeyDown(int keyCode, KeyEvent event) {
      switch (keyCode) {
      case KeyEvent.KEYCODE_1:// 1 放大地图
      mapController.zoomIn();
      break;
      case KeyEvent.KEYCODE_2:// 2 缩小地图
      mapController.zoomOut();
      break;

      case KeyEvent.KEYCODE_3:// 3 平面旋转(0到360)
          int mapRotation = mapView.getMapRotation();//获取当前mapview的平面角度
          System.out.println("mapRotation:" + mapRotation);
          mapController.setRotation(mapRotation + 30); 
          break;
      case KeyEvent.KEYCODE_4:// 4俯视旋转(-45到0) 
          int mapOverlooking = mapView.getMapOverlooking(); //获取当前mapview的俯视角度
          System.out.println("mapOverlooking:" + mapOverlooking);
          mapController.setOverlooking(mapOverlooking - 5);
          break;
      case KeyEvent.KEYCODE_5:// 5 平移
          //113.980861,22.540062
          int latitude = (int)22.540062E6;
          int longitudeE6 =  (int)113.980861E6;
          GeoPoint sjzc = new GeoPoint(latitude, longitudeE6);
          mapController.animateTo(sjzc);
          break;
      default:
          break;
      }
      return super.onKeyDown(keyCode, event);
      

      }

    }

    地图的图层:交通图、卫星图

    >
    交通图、卫星图

    LayerActivity.java

    public class LayerActivity extends BaseActivity {
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        switch (keyCode) {
        case KeyEvent.KEYCODE_7:// 地图
            mapView.setTraffic(false);
            mapView.setSatellite(false);
            break;
        case KeyEvent.KEYCODE_8:// 卫星地图
            mapView.setTraffic(false);
            mapView.setSatellite(true);
            break;
        case KeyEvent.KEYCODE_9:// 交通地图
            mapView.setTraffic(true);
            mapView.setSatellite(false);
            break;
    
        default:
            break;
        }
        return super.onKeyDown(keyCode, event);
    }
    
    }
    ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/iTigwoX3C1LKL9VKoHP9Ig==/6608570658283460551.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)地图
     
    ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img2.ph.126.net/X2NOkIQKf2e2utv0VG49OA==/6608470602725333042.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)交通图
     
    ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img2.ph.126.net/spd8_EtexZlJRVwAGyidUg==/3362500071886556450.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)卫星图

    百度地图:覆盖物

    > Overlay类来给百度地图增强显示效果
    com.baidu.mapapi.map

    类 Overlay java.lang.Object 继承者 com.baidu.platform.comapi.map.Overlay 继承者 com.baidu.mapapi.map.Overlay 直接已知子类: GraphicsOverlay, ItemizedOverlay, MyLocationOverlay, PoiOverlay, PopupOverlay, TextOverlay public abstract class Overlayextends Overlay Overlay是一个基类,它表示可以显示在地图上方的覆盖物。 > 文字覆盖功能展示:TextOverLay类
    TextOverlayActivity.java使用TextOverLay类
    

    TextOverlayActivity.java

    /**
    
       
       
    • 文字覆盖

      • @author Administrator
    • */
      public class TextOverlayActivity extends BaseActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      // 文字覆盖
      textOverlay();
      }

      private void textOverlay() {
      /*
      * 添加文字标注的一般流程:
      * 1. 用TextItem准备文字数据
      * 2. 创建TextOverlay,调用 addText(TextItem)接口添加文字.
      * 3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
      * 4. 调用MapView.refresh() 使Overlay生效。
      */

      // 1. 用TextItem准备文字数据
      TextItem textItem = new TextItem();
      /*
      字段摘要
       int    align 
                文字对齐方式 ,为 ALIGN_TOP,ALIGN_CENTER, ALIGN_BOTTOM中的一个值
      static int  ALIGN_BOTTOM 
                文字对齐参数,下边中点对齐
      static int  ALIGN_CENTER 
                文字对齐参数,中心对齐
      static int  ALIGN_TOP 
                文字对齐参数,上边中点对齐
       Symbol.Color   bgColor 
                文字背景色, 默认为透明
       Symbol.Color   fontColor 
                文字颜色
       int    fontSize 
                字号大小
       GeoPoint   pt 
                文字显示的位置,用经纬度坐标表示
       String text 
                要显示的文字内容
       Typeface   typeface 
                文字字体, android 字体表示,为空则用系统默认字体.
       */
      textItem.align = TextItem.ALIGN_CENTER;
      Symbol.Color color = new Symbol().new Color();
      color.red = 255;
      color.alpha = 255;
      color.blue = 0;
      color.green = 0;
      textItem.fontColor = color;
      textItem.fontSize = 20;
      textItem.pt = centerszhm;//文字显示的坐标位置
      textItem.text = "黑马深圳中心";
      
      //2. 创建TextOverlay,调用 addText(TextItem)接口添加文字.
      
      TextOverlay textOverlay = new TextOverlay(mapView);
      textOverlay.addText(textItem);
      
      //3 调用MapView.getOverlays().add()方法添加overlay到mapview中
      mapView.getOverlays().add(textOverlay);
      
      //4 调用MapView.refresh() 使Overlay生效
      mapView.refresh();
      

      }
      }

    ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/tiQFR3GgelMAdvu_PI6XZw==/980377343900660521.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
     
    > 图形覆盖功能展示:GraphicsOverlay类
    GraphicsOverlayActivity.java使用GraphicsOverlay类
    

    GraphicsOverlayActivity.java

    /**
    
       
       
    • 图形覆盖
    • @author Administrator
      *
      */
      public class GraphicsOverlayActivity extends BaseActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      //初始化图形覆盖
      wuStar();
      //initGraphics();
      }

      private void initGraphics() {
      //1,数据 Graphic
      Geometry g = new Geometry() ;
      /*
      * public void setCircle(GeoPoint geoPoint,
      int radius)
      设置图形为圆

          参数:geoPoint - 地理坐标radius - 圆的半径,单位:米
       */
      g.setCircle(centerszhm, 1000);
      
      Symbol s = new Symbol();
      /*
       * public void setSurface(Symbol.Color color,
                     int status,
                     int linewidth)
          设置面样式 
      
          参数:color - 颜色status - 填充状态,0表示不填充,1表示填充linewidth - 线宽,当填充状态为填充时线宽无意义
       */
      Symbol.Color color = new Symbol().new Color();
      color.red = 255;
      color.alpha = 100;
      color.blue = 0;
      color.green = 0;
      s.setSurface(color, 1, 1);
      Graphic graphics = new Graphic(g, s) ;
      
      //2 给overlay设置数据
      GraphicsOverlay overlay = new GraphicsOverlay(mapView);
      overlay.setData(graphics);
      
      //3 把overlay加到mapView中
      mapView.getOverlays().add(overlay);
      
      //4,刷新
      mapView.refresh();
      

      }

      /**

      • 绘制图形为填充多边形 五角星
        */
        private void wuStar() {
        //1 创建Overlay
        GraphicsOverlay overlay = new GraphicsOverlay(mapView);
        Geometry geo = new Geometry();
        int la = this.latitude;
        int lg = this.longitudeE6;
        GeoPoint[] points = new GeoPoint[10];
        int R = 5000;//外圆半径
        double r = (R*Math.sin(18*Math.PI/180)/Math.cos(36*Math.PI/180));//内圆半径
        //确定五角星十个坐标点
        points[9] = new GeoPoint(la + R, lg);
        points[0] = new GeoPoint((int) (la + r*Math.cos(36*Math.PI/180)), (int) (lg + r*Math.sin(36*Math.PI/180)));
        points[1] = new GeoPoint((int) (la + R*Math.sin(18*Math.PI/180)), (int) (lg + R*Math.cos(18*Math.PI/180)));
        points[2] = new GeoPoint((int) (la - r*Math.sin(18*Math.PI/180)), (int) (lg + r*Math.cos(18*Math.PI/180)));
        points[3] = new GeoPoint((int) (la - R*Math.sin(54*Math.PI/180)), (int) (lg + R*Math.cos(54*Math.PI/180)));
        points[4] = new GeoPoint((int) (la - r), lg);
        points[5] = new GeoPoint((int) (la - R*Math.sin(54*Math.PI/180)), (int) (lg - R*Math.cos(54*Math.PI/180)));
        points[6] = new GeoPoint((int) (la - r*Math.sin(18*Math.PI/180)), (int) (lg - r*Math.cos(18*Math.PI/180)));
        points[7] = new GeoPoint((int) (la + R*Math.sin(18*Math.PI/180)), (int) (lg - R*Math.cos(18*Math.PI/180)));
        points[8] = new GeoPoint((int) (la + r*Math.cos(36*Math.PI/180)), (int) (lg - r*Math.sin(36*Math.PI/180)));
        geo.setPolygon(points);

        Symbol symbol = new Symbol();
        Symbol.Color color = new Symbol().new Color();
        color.red = 255;
        color.green = 0;
        color.blue = 0;
        color.alpha = 100;
        symbol.setSurface(color, 1, 1);
        Graphic g = new Graphic(geo, symbol) ;
        overlay.setData(g);
        //2,加覆盖物
        mapView.getOverlays().add(overlay);
        //3,刷新
        mapView.refresh();
        }

    }
    ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/mFvm9rAd7DggP-Cs7frdDA==/6608449712004404133.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
     

    多条目覆盖功能展示:ItemizedOverlay类 ItemizedOverlayActivity.java
    /**
    
       
       
    • 多条目覆盖
    • @author Administrator
      *
      */
      public class ItemizedOverlayActivity extends BaseActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      //初始化数据
      itemizedData();

      //显示泡泡
      addPop();
      
      } private TextView tv_title; private View view; private void addPop() { // TODO Auto-generated method stub view = View.inflate(this, R.layout.items, null); tv_title = (TextView) view.findViewById(R.id.title); //MapView.LayoutParams(int width, int height, GeoPoint point, int alignment) MapView.LayoutParams params = new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, com.baidu.mapapi.map.MapView.LayoutParams.WRAP_CONTENT,centerszhm,com.baidu.mapapi.map.MapView.LayoutParams.BOTTOM_CENTER); mapView.addView(view, params); view.setVisibility(View.INVISIBLE); } private void itemizedData() { /*添加覆盖物的一般流程: 1. 用OverlayItem 准备overlay数据。 2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem) 接口添加overlay. 3. 若一次性添加的overlay数据较多,可以使用 addItem(List) 接口. 3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。 4. 调用MapView.refresh() 使Overlay生效。*/ //1. 用OverlayItem 准备overlay数据。 final List<OverlayItem> items = new ArrayList<OverlayItem>();
      {
          GeoPoint center = new GeoPoint(latitude, longitudeE6);
          OverlayItem item = new OverlayItem(center,
                  "深圳黑马",
                  "高薪就业,满足愿望,找个好对象");
          items.add(item);
      }
      
      {
          GeoPoint center = new GeoPoint(latitude + 3000, longitudeE6 + 3000);
          OverlayItem item = new OverlayItem(center,
                  "深圳黑马东北",
                  "高薪就业,满足愿望,找个好对象");
          items.add(item);
      }
      
      {
          GeoPoint center = new GeoPoint(latitude + 3000, longitudeE6 - 3000);
          OverlayItem item = new OverlayItem(center,
                  "深圳黑马西北",
                  "高薪就业,满足愿望,找个好对象");
          items.add(item);
      }
      {
          GeoPoint center = new GeoPoint(latitude - 3000, longitudeE6 + 3000);
          OverlayItem item = new OverlayItem(center,
                  "深圳黑马东南",
                  "高薪就业,满足愿望,找个好对象");
          items.add(item);
      }
      {
          GeoPoint center = new GeoPoint(latitude - 3000, longitudeE6 - 3000);;
          OverlayItem item = new OverlayItem(center,
                  "深圳黑马西南",
                  "高薪就业,满足愿望,找个好对象");
          items.add(item);
      }
      
      // 2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem) 接口添加overlay. 
      ItemizedOverlay overlay = new ItemizedOverlay(getResources().getDrawable(R.drawable.eat_icon),
              mapView){
          @Override
          public boolean onTap(int index) {
              System.out.println("index:" + index);
              OverlayItem item = items.get(index);
              tv_title.setText(item.getTitle());
              GeoPoint point = item.getPoint();
              MapView.LayoutParams params = new MapView.LayoutParams(LayoutParams.WRAP_CONTENT,
                      com.baidu.mapapi.map.MapView.LayoutParams.WRAP_CONTENT,point,com.baidu.mapapi.map.MapView.LayoutParams.BOTTOM_CENTER);
              mapView.updateViewLayout(view, params);
              view.setVisibility(View.VISIBLE);
              return super.onTap(index);
          }
      };
      overlay.addItem(items);
      
      //3. 调用MapView.getOverlays().add()方法添加overlay到mapview中
      mapView.getOverlays().add(overlay);
      
      //4.
      mapView.refresh();
      
      } }
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingBottom="0dip" >

&lt;LinearLayout
    android:id="@+id/user_info"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:background="@drawable/popupmap"
    android:orientation="horizontal" 
    android:gravity="center_vertical"
    android:layout_marginBottom="20dip"
    &gt;

    &lt;ImageView
        android:id="@+id/round"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="2dip"
        android:src="@drawable/round" /&gt;

    &lt;TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:text="标题"
        android:textSize="20sp" /&gt;

    &lt;ImageView
        android:id="@+id/roads"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/roads" /&gt;
&lt;/LinearLayout&gt;
</LinearLayout>
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/vi0x3fVHLTkedw4F74AevQ==/6619360165886710572.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
 

百度地图:搜索

>

MKSearch类来给百度地图实现搜索服务,配合第六大核心类MKSearchListener类(监听回调),还有在搜索的返回结果里结合覆盖物类overLay的子类集去展示搜索结果,并加上分页(分页显示搜索结果) 搜索服务的使用攻略,在搜索服务类MKSearch 类里,其搜索服务涉及:
搜索服务.

用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索

每种服务所使用的方法都不一样:但是每种服务使用的流程都差不多:

1、使用具体服务的方法:

poiSearchNearBy(String key, GeoPoint pt, int radius) 
  根据中心点、半径与检索词发起周边检索.
2、然后为MKSearch 类的对象进行初始化,并给初始化init方法里的参数接口进行实现操作 (MKSearchListener),该接口的实现方法作用是:
搜索结果通知接口。

该接口返回poi搜索,公交搜索,驾乘路线,步行路线结果
3、实现接口里对应的方法去监听具体服务的方法的结果值,例如:
onGetPoiResult(MKPoiResult result, int type, int iError) 
  返回poi搜索结果

该实现方法用于处理poiSearchNearBy(String key, GeoPoint pt, int radius)返回的结果值
> 半径搜索(兴趣点检索) BaseActivity.java里初始化MKSearch类,并在里面给mapController增加兴趣点覆盖物的点击事件 //该半径搜索类里的兴趣点检索实现了分页的查询! SearchNearByActivity.java
/**

 
 
  • 半径检索
  • @author Administrator
    *
    */
    public class SearchNearByActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    nearbySearch();
    }

    private void nearbySearch() {
    // 处理搜索结果
    mksearch.init(mapManager, new MKSearchAdapter(){
    @Override
    public void onGetPoiResult(MKPoiResult result, int type,
    int iError) {

            if (iError == 0 &amp;&amp; result != null){//有搜索信息
                // 1,result.数据
                totalPage = result.getNumPages();//获取总页数 每页显示10条数据 
                System.out.println("totalPage:" + totalPage);
                currentPage = result.getPageIndex();//获取当前页
                System.out.println("currentPage:" + currentPage);
                ArrayList&lt;MKPoiInfo&gt; allPoi = result.getAllPoi();// 10条
                // 2. overlay
                PoiOverlay overlay = new PoiOverlay(SearchNearByActivity.this, mapView);
                overlay.setData(allPoi);
                // 3. mapview add overlay
                //把之前的分页结果清空
                mapView.getOverlays().clear();
                mapView.getOverlays().add(overlay);
                // 4. flash
                mapView.refresh();
            } else {
    
            }
    
        }
    });
    
    //发起搜索
    mksearch.poiSearchNearBy("电影院", centerszhm, 20000);
    

    }
    int totalPage;
    int currentPage;
    //分页的操作

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    switch (keyCode) {
    case KeyEvent.KEYCODE_5: // 下一页
    currentPage = ++currentPage % totalPage;
    //跳转到下一页
    mksearch.goToPoiPage(currentPage);
    break;
    case KeyEvent.KEYCODE_6: // 上一页
    currentPage – ;
    if (currentPage < 0){
    currentPage = 0;
    Toast.makeText(getApplicationContext(), “已经第一页”, 0).show();
    }
    mksearch.goToPoiPage(currentPage);
    break;

    default:
        break;
    }
    return super.onKeyDown(keyCode, event);
    

    }

}
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/M8-q1WcWWwczPnKQVO2vcw==/3838192782526900123.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
 

全城搜索(兴趣点检索)

CitySearchActivity.java
/**

 
 
  • 半径检索
  • @author Administrator
    *
    */
    public class CitySearchActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    nearbySearch();
    }

    private void nearbySearch() {
    // 处理搜索结果
    mksearch.init(mapManager, new MKSearchAdapter(){
    @Override
    public void onGetPoiResult(MKPoiResult result, int type,
    int iError) {

            if (iError == 0 &amp;&amp; result != null){//有搜索信息
                // 1,result.数据
                totalPage = result.getNumPages();//获取总页数 每页显示10条数据 
                System.out.println("totalPage:" + totalPage);
                currentPage = result.getPageIndex();//获取当前页
                System.out.println("currentPage:" + currentPage);
                ArrayList&lt;MKPoiInfo&gt; allPoi = result.getAllPoi();// 10条
                // 2. overlay
                PoiOverlay overlay = new PoiOverlay(CitySearchActivity.this, mapView);
                overlay.setData(allPoi);
                // 3. mapview add overlay
                mapView.getOverlays().clear();
                mapView.getOverlays().add(overlay);
                // 4. flash
                mapView.refresh();
            } else {
    
            }
    
        }
    });
    
    //发起搜索
    mksearch.poiSearchInCity("深圳", "电影院");//("电影院", centerszhm, 20000);
    

    }
    int totalPage;
    int currentPage;
    //分页的操作

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub
    switch (keyCode) {
    case KeyEvent.KEYCODE_5: // 下一页
    currentPage = ++currentPage % totalPage;
    //跳转到下一页
    mksearch.goToPoiPage(currentPage);
    break;
    case KeyEvent.KEYCODE_6: // 上一页
    currentPage – ;
    if (currentPage < 0){
    currentPage = 0;
    Toast.makeText(getApplicationContext(), “已经第一页”, 0).show();
    }
    mksearch.goToPoiPage(currentPage);
    break;

    default:
        break;
    }
    return super.onKeyDown(keyCode, event);
    

    }

}
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/Uw0Y4VDM3IQVEE8HTZ53VQ==/6619348071258805089.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
 

公交路线的检索

配合TransitOverlay类来显示搜索的结果 TransitSearchActivity.java
/**

 
 
  • 公交换乘
  • @author Administrator
    *
    */
    public class TransitSearchActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    //公交换乘检索
    transitsearch();
    }

    private void transitsearch() {
    mksearch.init(mapManager, new MKSearchAdapter() {
    @Override
    public void onGetTransitRouteResult(MKTransitRouteResult result,
    int iError) {
    //获取数据 显示在mapview上
    if (iError == 0 && result != null) { //有搜索结果
    //1,数据
    MKTransitRoutePlan plan = result.getPlan(0);
    //2,overlay
    TransitOverlay overlay = new TransitOverlay(TransitSearchActivity.this ,mapView);
    overlay.setData(plan);
    //3 mapview add overlay
    mapView.getOverlays().add(overlay);
    //4 flush
    mapView.refresh();
    }

        }
    });
    /*
     * city - 城市名,用于在哪个城市内进行检索(必须填写)
     * start - 检索的起点,可通过关键字,坐标,两种方式指定
     * end - 检索的终点,可通过关键字,坐标,两种方式指定 
     */
    MKPlanNode  start = new MKPlanNode();
    start.name = "罗湖火车站";
    MKPlanNode  end = new MKPlanNode();
    end.name = "世界之窗";
    //设置搜索策略
    mksearch.setTransitPolicy(MKSearch.EBUS_NO_SUBWAY);
    mksearch.transitSearch("深圳", start, end);
    

    }

}
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/MqME1FvDg7JdMiHzvvnOfA==/6619581167723894788.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
 
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img2.ph.126.net/NKJXtI1thKjbmWIAmndQLw==/6619172149398359627.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
 

驾车路线的搜索

配合RouteOverlay类来显示搜索的结果 DrivingSearchActivity.java
/**

 
 
  • 驾驶检索
  • @author Administrator
    *
    */
    public class DrivingSearchActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //驾驶
    driver();
    }

    private void driver() {
    mksearch.init(mapManager, new MKSearchAdapter() {
    @Override
    public void onGetDrivingRouteResult(MKDrivingRouteResult result,
    int iError) {
    if (iError == 0 && result != null){

                //1 获取数据
                MKRoutePlan plan = result.getPlan(0);
                //2 创建overlay  设置数据
                RouteOverlay overlay = new RouteOverlay(DrivingSearchActivity.this,mapView);
    
                overlay.setData(plan.getRoute(0));
                //3 mapview add overlay
                mapView.getOverlays().add(overlay);
                //4 flush
                mapView.refresh();
            }
        }
    });
    /**
     * startCity - 起点所在城市,起点为坐标时可不填
     * start - 搜索的起点,可以为坐标,名称任一种
     * endCity - 终点所在城市,终点为坐标时可不填
     * end - 搜索的终点,可以为坐标,名称任一种 
     */
    MKPlanNode start = new MKPlanNode();
    start.pt = centerszhm;
    MKPlanNode end = new MKPlanNode();
    end.name = "罗湖火车站";
    ArrayList&lt;MKWpNode&gt; datas = new ArrayList&lt;MKWpNode&gt;();
    MKWpNode node = new MKWpNode();
    node.city = "深圳";
    node.name = "红树林";
    datas.add(node);
    mksearch.drivingSearch("深圳", start, "深圳", end,datas) ;
    

    }
    }

Android百度地图API使用教程 - faith_yee - faith_yee的博客
 
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/qRXJlWRuOSSso3F2wsYBcA==/6619470117049488366.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)
 

步行路线的检索

配合RouteOverlay类来显示搜索的结果 WalkingSearchActivity.java
/**

 
 
  • 步行路线检索
  • @author Administrator
    *
    */
    public class WalkingSearch extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    walk();
    }
    // 步行检索
    private void walk() {
    // TODO Auto-generated method stub
    mksearch.init(mapManager, new MKSearchAdapter() {
    @Override
    public void onGetWalkingRouteResult(MKWalkingRouteResult result,
    int iError) {
    //1 数据
    MKRoutePlan plan = result.getPlan(0);
    //2 创建overlay 设置数据
    RouteOverlay overlay = new RouteOverlay(WalkingSearch.this,mapView);

            overlay.setData(plan.getRoute(0));
            //3 mapview add overlay
            mapView.getOverlays().add(overlay);
            //4 flush
            mapView.refresh();
        }
    });
    

    /* startCity - 起点所在城市,起点为坐标时可不填

  • start - 搜索的起点,可以为坐标,名称任一种
  • endCity - 终点所在城市,终点为坐标时可不填
  • end - 搜索的终点,可以为坐标,名称任一种*/
    MKPlanNode start = new MKPlanNode();
    start.pt = centerszhm;
    MKPlanNode end = new MKPlanNode();
    end.name = “世界之窗”;
    mksearch.walkingSearch(“深圳”, start, “深圳”, end);
    }
    }
Android百度地图API使用教程 - faith_yee - faith_yee的博客
 

百度地图:定位

>

定位技术的说明
在百度地图移动版API中,提供一个重要的特色功能:定位,通过这个功能,能获取到用户当前所在位置。
在程序中,如果使用此功能,必须注册GPS和网络的使用权限。
    在获取用户位置时,优先使用GPS进行定位;如果GPS定位没有打开或者没有可用位置信息,则会通过判断网络是否连接(即确认手机是否能上网,不论是连接2G/3G或Wi-Fi网络),如果是,则通过请求百度网络定位服务,返回网络定位结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。
    目前系统自带的网络定位服务精度低,且服务不稳定、精度低,并且从未来的趋势看,基站定位是不可控的(移动公司随时可能更改基站编号以垄断定位服务),而Wi-Fi定位则不然,它是一种精度更高、不受管制的定位方法。国内其它使用Wi-Fi定位的地图软件,Wi-Fi定位基本不可用,百度的定位服务量化指标优秀,网络接口返回速度快(服务端每次定位响应时间50毫秒以内),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆盖率98%,在国内处于一枝独秀的地位。

注意
关于经纬度的说明:该经纬度信息是经过加密处理,所以在其它地图工具中测得的经纬度 信息不适合百度的坐标系统。
使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index.html查询地理坐标如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口

http://developer.baidu.com/map/geosdk-android-developv3.3.htm 

1、首先配置清单文件

2、MyLocationActivity.java

3、设置定位的图层MyLocationOverlay类

MyLocationActivity.java

public class MyLocationActivity extends BaseActivity {
    public LocationClient mLocationClient = null;

public BDLocationListener myListener = new MyLocationListener();

private class MyLocationListener implements BDLocationListener{

    //获取位置
    @Override
    public void onReceiveLocation(BDLocation location) {
        double latitude = location.getLatitude();//纬度
        double longitude = location.getLongitude();//经度
        System.out.println("latitude:" + latitude);
        System.out.println("longitude:" + longitude);
        MyLocationOverlay overlay = new MyLocationOverlay(mapView);
        LocationData data = new LocationData();
        data.latitude = latitude ;
        data.longitude = longitude;
        overlay.setData(data);

        mapView.getOverlays().add(overlay);
        mapView.refresh();
        mapController.animateTo(new GeoPoint((int)(latitude*1E6), (int)(longitude*1E6)));

    }

    @Override
    public void onReceivePoi(BDLocation location) {
        // TODO Auto-generated method stub

    }

}
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    startLocation();
}
private void startLocation() {
    // TODO Auto-generated method stub
    mLocationClient = new LocationClient(this); 
    mLocationClient.registerLocationListener( new BDLocationListener(){

        //获取位置
        @Override
        public void onReceiveLocation(BDLocation location) {
            double latitude = location.getLatitude();//纬度
            double longitude = location.getLongitude();//经度
            System.out.println("latitude:" + latitude);
            System.out.println("longitude:" + longitude);
            MyLocationOverlay overlay = new MyLocationOverlay(mapView);
            LocationData data = new LocationData();
            data.latitude = latitude ;
            data.longitude = longitude;
            overlay.setData(data);

            mapView.getOverlays().add(overlay);
            mapView.refresh();
            mapController.animateTo(new GeoPoint((int)(latitude*1E6), (int)(longitude*1E6)));

        }

        @Override
        public void onReceivePoi(BDLocation location) {
            // TODO Auto-generated method stub

        }

    } );    

    //设置参数
    LocationClientOption option = new LocationClientOption();

    option.setOpenGps(true);

    option.setAddrType("all");//返回的定位结果包含地址信息

    option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02

    option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms

    option.disableCache(true);//禁止启用缓存定位

    option.setPoiNumber(5); //最多返回POI个数 

    option.setPoiDistance(1000); //poi查询距离      

    option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息      

    mLocationClient.setLocOption(option);

    //发起定位请求
    mLocationClient.requestLocation();
    System.out.println("发起定位请求");

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    mLocationClient.stop();
    super.onPause();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    mLocationClient.start();
    super.onResume();
}

}

![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img2.ph.126.net/A2AxMbcZdj8s2lVwNIvEWA==/2452491472097397392.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值