zoukankan      html  css  js  c++  java
  • 开发百度地图之实现

     在地图上标记用户当前所处位置其实是一个GPS定位应用。首先通过GPS定位获取到用户当前所在位置的经纬度,再将该经纬度所代表的点在地图上标出来。其实除了在地图上标注自己所处的位置外,我们通常还有这样的需求:“如果我的位置发生改变,要能够实时在地图上体现出来”。

    新建项目baidumaplocation.设计main.xml文件这里注意的是MapView控件必须使用来自百度库封装好的com.baidu.mapapi.MapView 。设计代码如下:

    Xml代码  [url=]  [/url]

    <?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" > 

        <FrameLayout 

            android:id="@+id/map_layout" 

            android:layout_width="fill_parent"

           android:layout_height="fill_parent"

           android:orientation="vertical" >

         <!-- 百度MapView控件 -->  

           <com.baidu.mapapi.MapView  

                    android:id="@+id/map_view"  

                    android:layout_width="fill_parent"  

                    android:layout_height="fill_parent"

                    android:apiKey="0Mg_koWoyZUiYLfZxmPfp4LKInB5LqTnagYueaw"  

                   android:clickable="true"  

                   android:enabled="true" />

            <LinearLayout  

                    android:layout_width="wrap_content"

                   android:layout_height="wrap_content"

                   android:layout_gravity="center"

                   android:orientation="vertical"  

                  android:paddingBottom="105dip" >

               <!-- 地址信息显示TextView -->  

                <TextView  

                         android:id="@+id/map_bubbleText"  

                         android:layout_width="wrap_content"

                         android:layout_height="wrap_content"

                        android:background="@drawable/location_tips"  

                        android:gravity="left|center"

                        android:maxEms="12"  

                        android:paddingLeft="12dip"

                        android:paddingRight="10dip"

                        android:text="@string/load_tips"

                        android:textColor="#cfcfcf"

                       android:textSize="14sp" />

          </LinearLayout>

           <LinearLayout

                        android:layout_width="wrap_content"  

                        android:layout_height="wrap_content"  

                        android:layout_gravity="center"

                        android:orientation="vertical" >  

                <!-- 位置指标显示ImageView -->  

             <ImageView  

                           android:id="@+id/point_image"  

                           android:layout_width="wrap_content"        

                          android:layout_height="wrap_content"

                          android:layout_gravity="center"  

                         android:layout_marginBottom="30dip"  

                        android:src="@drawable/point_start" />

             </LinearLayout>

     </FrameLayout>  

    </LinearLayout> 

    三:创建覆盖整个地图捕捉触控事件的MyMapOverlay继承Overlay

    Java代码  [url=] [/url]

    import android.view.MotionEvent;  

    import com.baidu.mapapi.GeoPoint;

    import com.baidu.mapapi.MapView;  

    import com.baidu.mapapi.Overlay;

    //覆盖整个地图捕捉触控事件的OverLay  

            public abstract class MyMapOverlay extends Overlay{  

                              private int point_X;  

                              private int point_Y;  

                              private GeoPoint newPoint;  

            public MyMapOverlay(int x,int y){  

                             point_X = x;  

                            point_Y = y;  

             }  

             boolean flagMove=false;

            //这里实现根据地图移动时重新获取屏幕中心点的经纬度坐标

             @Override  

       public boolean onTouchEvent(MotionEvent event, MapView mapView) {

                       System.out.println("X->"+event.getX()+":"+point_X);  

                       System.out.println("Y->"+event.getY()+":"+point_Y);

          if(event.getAction() == MotionEvent.ACTION_DOWN){

                      changePoint(newPoint,1);  

          }else if(event.getAction() == MotionEvent.ACTION_UP){

                     newPoint = mapView.getProjection().fromPixels(point_X,point_Y);  

                      changePoint(newPoint,2);  

           }        

                      return false;

          }  

          public abstract void changePoint(GeoPoint newPoint,int type); 

    四:LocationActivity类继承百度库的MapActivity以及实现LocationListener接口,代码如下:  

    package com.location.activity;Java代码  [url=]  [/url]

    import java.io.IOException;

    import java.util.List;import java.util.Locale;

    import android.content.Intent;  

    import android.location.Address;

    import android.location.Geocoder;  

    import android.location.Location;  

    import android.os.Bundle;  

    import android.os.Handler;  

    import android.os.Message;  

    import android.view.View;  

    import android.view.Window;  

    import android.widget.TextView;  

    import com.android.map.MyMapOverlay;

    import com.baidu.mapapi.BMapManager;  

    import com.baidu.mapapi.GeoPoint;

    import com.baidu.mapapi.LocationListener;  

    import com.baidu.mapapi.MKAddrInfo;  

    import com.baidu.mapapi.MKBusLineResult;  

    import com.baidu.mapapi.MKDrivingRouteResult;

    import com.baidu.mapapi.MKLocationManager;  

    import com.baidu.mapapi.MKPoiResult;  

    import com.baidu.mapapi.MKSearch;

    import com.baidu.mapapi.MKSearchListener;

    import com.baidu.mapapi.MKSuggestionResult;

    import com.baidu.mapapi.MKTransitRouteResult;

    import com.baidu.mapapi.MKWalkingRouteResult;  

    import com.baidu.mapapi.MapActivity;  

    import com.baidu.mapapi.MapController;

    import com.baidu.mapapi.MapView;

    import com.baidu.mapapi.Overlay;  

    public class LocationActivity extends MapActivity implements LocationListener {

                  private MapView mapView;  

                  private MapController mMapCtrl;

                  private List<Overlay> mapOverlays;

                  public GeoPoint locPoint;  

                  private MyMapOverlay mOverlay;

                  private TextView desText;  

                  private String lost_tips;

                  private int point_X;  

                  private int point_Y;  

                  public final int MSG_VIEW_LONGPRESS = 10001;

                  public final int MSG_VIEW_ADDRESSNAME = 10002;

                  public final int MSG_GONE_ADDRESSNAME = 10003;  

                  private Intent mIntent;

                  private int mLatitude;  

                  private int mLongitude;

                  private String name;

                  private BMapManager mapManager;

                  private MKLocationManager mLocationManager = null;

                  private boolean isLoadAdrr = true;

                  private MKSearch mMKSearch;

              @Override

               public void onCreate(Bundle savedInstanceState) {  

                        super.onCreate(savedInstanceState);

                        requestWindowFeature(Window.FEATURE_NO_TITLE);

                        setContentView(R.layout.main);  

                        initMap();

                        mIntent = getIntent();

                        mLatitude = mIntent.getIntExtra("latitude", 0);

                        mLongitude = mIntent.getIntExtra("longitude", 0);  

                        name = mIntent.getStringExtra("name");  

                        mapView = (MapView) findViewById(R.id.map_view);

                        desText = (TextView) this.findViewById(R.id.map_bubbleText);

                        lost_tips = getResources().getString(R.string.load_tips);

                        if (mLatitude != 0 && mLongitude != 0) {  

                                locPoint = new GeoPoint((int) (mLatitude * 1E6),  

                               (int) (mLongitude * 1E6));  

                               desText.setText(name);  

                          }  

                         mapView.setBuiltInZoomControls(true);  

                         mapView.setClickable(true);

                         MapCtrl = mapView.getController();

                         point_X = this.getWindowManager().getDefaultDisplay().getWidth() / 2;  

                        point_Y = this.getWindowManager().getDefaultDisplay().getHeight() / 2;

          mOverlay = new MyMapOverlay(point_X, point_Y) {

                      @Override  

          public void changePoint(GeoPoint newPoint, int type) {

                     if (type == 1) {  

                                   mHandler.sendEmptyMessage(MSG_GONE_ADDRESSNAME);  

                  } else {  

                                    locPoint = newPoint;  

                                    mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);  

                 }      

         }    

    };

                       mapOverlays = mapView.getOverlays();  

                       if (mapOverlays.size() > 0) {  

                                 mapOverlays.clear();    

                       }

                                mapOverlays.add(mOverlay);

                                mMapCtrl.setZoom(20);

                      }  

                      private void initMap() {

                              // 初始化MapActivity  

                                mapManager = new BMapManager(getApplication());

                             // init方法的第一个参数需填入申请的API Key

                               mapManager.init("C66C0501D0280744759A6957C42543AE38F5D540", null);

                               super.initMapActivity(mapManager);  

                           // 实例化搜索地址类

                               mMKSearch = new MKSearch();

                           // 初始化搜索地址实例  

                               mMKSearch.init(mapManager, new MySearchListener());

                              mLocationManager = mapManager.getLocationManager();

                           // 注册位置更新事件  

                              mLocationManager.requestLocationUpdates(this);  

                           // 使用GPS定位  

                              mLocationManager .enableProvider((int) MKLocationManager.MK_GPS_PROVIDER);  

                  }  

                       @Override

                       protected void onResume() {

                                if (mapManager != null) {  

                                         mapManager.start();  

                      }  

                                super.onResume();  

                      }

                      @Override  

                      protected void onPause() {

                                 isLoadAdrr = false;  

                                if (mapManager != null) {  

                                               mapManager.stop();  

                      }.super.onPause();  

                      }  

                      @Override  

                        protected boolean isRouteDisplayed() {  

                        // TODO Auto-generated method stub

                                   return false;  

                       }  

                          /** * 通过经纬度获取地址   ** @param point 151.    * @return 152.     */  

                     private String getLocationAddress(GeoPoint point) {

                                     String add = "";  

                                     Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());

                         try {  

                                      List<Address> addresses = geoCoder.getFromLocation(  

                                      point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6,  1);  

                                      Address address = addresses.get(0);

                                      int maxLine = address.getMaxAddressLineIndex();  

                      if (maxLine >= 2) {

                                   add = address.getAddressLine(1) + address.getAddressLine(2);  

                       } else {  

                                   add = address.getAddressLine(1);

                       }  

                       } catch (IOException e) {

                                    add = "";  

                                    e.printStackTrace();  

                        }  

                                       return add;

                       }

                       private Handler mHandler = new Handler() {

                         @Override

                                        public void handleMessage(Message msg) {

                                               switch (msg.what) {

                                                         case MSG_VIEW_LONGPRESS:// 处理长按时间返回位置信息

                                                {

                                                         if (null == locPoint)

                                                         return;  

                                                         mMKSearch.reverseGeocode(locPoint);  

                                                         desText.setVisibility(View.VISIBLE);  

                                                         desText.setText(lost_tips);  

                                                         mMapCtrl.animateTo(locPoint);

                                                         mapView.invalidate();  

                                                 }  

                                                  break;  

                                                            case MSG_VIEW_ADDRESSNAME:  

                                                           desText.setText((String) msg.obj);  

                                                           desText.setVisibility(View.VISIBLE);  

                                                 break;

                                                           case MSG_GONE_ADDRESSNAME:  

                                                           desText.setVisibility(View.GONE);

                                                           break;

                                                  }  

                                           }  

                                       };

                                                // 关闭程序也关闭定位

                                        @Override  203.   

                                        protected void onDestroy() {

                                                if (mapManager != null) {

                                                mapManager.destroy();

                                                mapManager = null;  

                                        }

                                               super.onDestroy();  

                                        }  

                                        /*** 根据MyLocationOverlay配置的属性确定是否在地图上显示当前位置  */

                                     @Override

                                     protected boolean isLocationDisplayed() {

                                              return false;

                                     }

                                       /*** 当位置发生变化时触发此方法 ** @param locatio* 当前位置 */ 

                                   public void onLocationChanged(Location location) {

                                                   if (location != null) {

                                                   locPoint = new GeoPoint((int) (location.getLatitude()* 1E6),  

                                                  (int) (location.getLongitude()* 1E6));  

                                                  mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);

                                               }  

                                         }

                                      /*** 内部类实现MKSearchListener接口,用于实现异步搜索服务 ** @author qiaoxu*/  

                                            public class MySearchListener implements MKSearchListener {  

                                                          /*** 根据经纬度搜索地址信息结果

                                                               * @param result

                                                               *搜索结果

                                                               * @param iError

                                                               * 错误号(0表示正确返回)

                                      */  

                                        public void onGetAddrResult(MKAddrInfo result, int iError) {

                                                      if (result == null) {

                                                                return;  .

                                                      }

                                                      Message msg = new Message();

                                                      msg.what = MSG_VIEW_ADDRESSNAME;  

                                                      msg.obj = result.strAddr;

                                                      mHandler.sendMessage(msg);

                                                     }  

                       /** * 驾车路线搜索结果

                             * @param result 2

                             *   搜索结果

                             * @param iError

                             *  错误号(0表示正确返回)

                        */

                        public void onGetDrivingRouteResult(MKDrivingRouteResult result,   int iError) {

                         }  

                         /*** POI搜索结果(范围检索、城市POI检索、周边检索*

                              * @param result

                              * 搜索结果 275

                              * @param type

                              *  返回结果类型(11,12,21:poi列表 7:城市列表)

                              * @param iError

                              * 错误号(0表示正确返回)

                         */

                            public void onGetPoiResult(MKPoiResult result, int type, int iError) {

                            }

                            /*** 公交换乘路线搜索结果

                                 * @param result

                                 * 搜索结果

                                 * @param iError

                                 *  错误号(0表示正确返回)

                                 */    

                   public void onGetTransitRouteResult(MKTransitRouteResult result,int iError) {  

                   }

                   /*** 步行路线搜索结果

                        * @param result

                        * 搜索结果

                        * @param iError

                        *  错误号(0表示正确返回)

                        */

                     public void onGetWalkingRouteResult(MKWalkingRouteResult result,  int iError) {

                    }  

                    public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {

                                // TODO Auto-generated method stub

                    }  

                    public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {

                          // TODO Auto-generated method stub  

                      }  

                   }  

                 } 

    五:在AndroidManifest.xml住添加相关的访问权限

    <!-- 访问网络的权限 --> Xml代码  [url=] 

     [/url]

    1.    <uses-permission android:name="android.permission.INTERNET" />

    2.    <!-- 访问精确位置的权限 --> 

    3.    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

    4.    <!-- 访问网络状态的权限 --> 

    5.    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    6.    <!-- 访问WIFI网络状态的权限 --> 

    7.    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

    8.    <!-- 改变WIFI网络状态的权限 --> 

    9.    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 

    10.    <!-- 读写存储卡的权限 --> 

    11.    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    12.    <!-- 读取电话状态的权限 --> 

    13.<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

    作者:-xu 邮箱:860072925@qq.com QQ群:IOS/Android 25961346
  • 相关阅读:
    MySQL数据库索引相关
    springMVC架构说明
    @responseBody注解的使用
    springMVC配置
    17_10_31 ./ ../ / ~/
    Nginx的简单操作
    MySQL中sql语句的优化
    Mac下Redis的简单操作
    github下载与安装(windows版)
    结合工程实践选题调研分析3个同类软件产品
  • 原文地址:https://www.cnblogs.com/qiaoxu/p/3861841.html
Copyright © 2011-2022 走看看