百度地图API 安卓项目 实时获取地图中心点经纬度

来源:互联网 发布:电气autocad软件下载 编辑:程序博客网 时间:2024/06/08 05:44
附DEmo记录百度地图API哪些坑
项目可以实时获取当前位置并且计算和某固定位置的距离,并显示在屏幕上方。
做项目时遇到的难点:
  1. 如何把覆盖物固定在屏幕中间,不随着地图的移动而移动
  2. 如何获取地图中间位置的坐标/经纬度
  3. 如何把两点之间的距离在textView中显示出来

首先第一点折腾了比较久,思维太僵硬了,只想着把覆盖物固定在地图中间,其实换个角度想,只要把覆盖物固定在屏幕中心点,不就可以让覆盖物不随着地图一起移动了吗?想通之后就好解决了,把覆盖物当做一个控件,放在layout文件中设置layout属性为center,这样覆盖物就可以固定在屏幕中间了,可以随意移动地图,并且覆盖物不会随着地图一起移动。

覆盖物是固定好了,但是怎么获取屏幕中心点的位置呢?当时想到了两点,把屏幕坐标转换为地图经纬度,但是这样比较麻烦,最后失败了,查阅百度API后发现有提供方法给我们。

OnMapStatusChangeListener listener = new OnMapStatusChangeListener() {      /**     * 手势操作地图,设置地图状态等操作导致地图状态开始改变。     * @param status 地图状态改变开始时的地图状态     */      public void onMapStatusChangeStart(MapStatus status){      }      /** 因某种操作导致地图状态开始改变。    * @param status 地图状态改变开始时的地图状态     * @param reason表示地图状态改变的原因,取值有:         * 1:用户手势触发导致的地图状态改变,比如双击、拖拽、滑动底图         * 2:SDK导致的地图状态改变, 比如点击缩放控件、指南针图标         * 3:开发者调用,导致的地图状态改变    */     public void onMapStatusChangeStart(MapStatus status, int reason);    }    /**     * 地图状态变化中     * @param status 当前地图状态     */      public void onMapStatusChange(MapStatus status){      }      /**     * 地图状态改变结束     * @param status 地图状态改变结束后的地图状态     */      public void onMapStatusChangeFinish(MapStatus status){      }};












这是官方的介绍,找到这个方法后就能操作了,在onMapStatusChangFinish这个方法中用mapStatus.target方法可以获取到地图中心点位置,此时的地图中心点就是屏幕中心点的位置,也就是说此时的屏幕中心点的跟地图中心点的位置重合了,拿到地图中心点位置就相当于拿到了此时覆盖物的位置,这样第二问题也就解决了。
第三个问题是关于怎么把算出来的两点间的距离传到textView中显示,直接传入distance程序一直崩溃,慢慢查询调试发现一个问题不能直接把distance传入.setTextz中,原因就是:

主要原因是TextView的setText方法把传入的int类型的percent当做资源Id到项目中查询资源,而资源中却找不到相应的数值,就会报NotFoundException的错误。
在Android中利用id来索引资源的地方很多(如:Toast.makeText()等),所以如果不小心往方法中传入int类型的参数,虽然编译时IDE不会报错,但是运行时,很容易因找不到对应的资源而报错。


这样第三个问题也解决了。

还是得心细啊

代码:
package com.mymapdemo;import android.content.Context;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.map.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.MyLocationConfiguration;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.map.Polyline;import com.baidu.mapapi.map.PolylineOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.utils.DistanceUtil;import java.util.ArrayList;import java.util.List;public class MapDemo extends AppCompatActivity {    private MapView mMapView;    private BaiduMap mBaiduMap;    private Context context;    private TextView textView;    private double distance;    private LocationClient mLocationClient;    private MyLocationListener mLocationListener;    private boolean isFirstIn = true;    private Polyline mPolyline;    private LatLng latLng;    private double meter;    private Button dw_bt;    private double mLat;    private double mLon;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        SDKInitializer.initialize(getApplicationContext());        setContentView(R.layout.activity_map_demo);        textView = (TextView) findViewById(R.id.textView);        dw_bt = (Button) findViewById(R.id.dw_bt);        this.context = this;        //初始化定位        initView();        initLocation();        addMyOverlay();        dw_bt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                LatLng latLng = new LatLng(mLat,mLon);                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);                mBaiduMap.animateMapStatus(msu);            }        });    }        /*    * 定位到自己当前位置    *     * */    private void initLocation() {        mLocationClient = new LocationClient(this);        mLocationListener = new MyLocationListener();                /*        * 修改自带的定位图标        * */        MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;        BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory                .fromResource(R.drawable.icon_marka);        mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(                mCurrentMode, true, mCurrentMarker        ));                mLocationClient.registerLocationListener(mLocationListener);        final LocationClientOption option = new LocationClientOption();        option.setCoorType("bd09ll");//坐标类型        option.setIsNeedAddress(true);//返回当前位置        option.setOpenGps(true);        option.setScanSpan(1000);//过多少秒请求一次        mLocationClient.setLocOption(option);        mLocationClient.start();        /*        * setOnMapStatusChangeListener方法主要是记录当前地图中心点的坐标        *  mapStatus.target获取当前地图中心点的坐标        * */        mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {            @Override            public void onMapStatusChangeStart(MapStatus mapStatus) {            }            @Override            public void onMapStatusChangeStart(MapStatus mapStatus, int i) {            }            @Override            public void onMapStatusChange(MapStatus mapStatus) {            }            @Override            public void onMapStatusChangeFinish(MapStatus mapStatus) {                latLng = mapStatus.target;                mBaiduMap.clear();//                addMyOverlay(latLng.longitude,latLng.latitude);                LineDrawing(latLng.latitude, latLng.longitude);                textView.setText("距离天安门:" + String.valueOf(distance)+"米");            }        });    }        /*    * 地图初始化    *     * */    private void initView() {        mMapView = (MapView) findViewById(R.id.bmapView);        mBaiduMap = mMapView.getMap();        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);        mBaiduMap.setMapStatus(msu);    }    @Override    protected void onDestroy() {        super.onDestroy();        mMapView.onDestroy();    }    @Override    protected void onResume() {        super.onResume();        mMapView.onResume();    }    @Override    protected void onStart() {        super.onStart();        mBaiduMap.setMyLocationEnabled(true);        if (!mLocationClient.isStarted())            mLocationClient.start();    }    @Override    protected void onStop() {        super.onStop();        mBaiduMap.setMyLocationEnabled(false);        mLocationClient.stop();    }    @Override    protected void onPause() {        super.onPause();        mMapView.onPause();    }                  private class MyLocationListener implements BDLocationListener{          @Override          public void onReceiveLocation(BDLocation location) {              MyLocationData data = new MyLocationData.Builder()                      .accuracy(location.getRadius())                      .latitude(location.getLatitude())                      .longitude(location.getLongitude())                      .build();              mBaiduMap.setMyLocationData(data);              mLat = location.getLatitude();              mLon = location.getLongitude();                /*                * 判断地图当前的状态                * */            if (isFirstIn) {                LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);                mBaiduMap.animateMapStatus(msu);                isFirstIn = false;//                Toast.makeText(context, location.getAddrStr()//                        , Toast.LENGTH_SHORT).show();            }        }    }        /*    * 绘制固定点和自己当前位置的距离    *    * */    public void LineDrawing(double latitude,double longitude){        //构建折线点坐标        LatLng p1 = new LatLng(39.9152478931,116.4038206839);        LatLng p2 = new LatLng(latLng.latitude,latLng.longitude);        List points = new ArrayList();        points.add(p1);        points.add(p2);        //绘制折线        OverlayOptions ooPolyline = new PolylineOptions().width(10)                .color(0xAAFF0000).points(points);        mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);        distance =(int) (DistanceUtil.getDistance(p1,p2));    }        /*    * 添加覆盖物    * */    public void addMyOverlay(){        LatLng point = new LatLng(39.9152478931,116.4038206839);        //构建Marker图标        BitmapDescriptor bitmap = BitmapDescriptorFactory                .fromResource(R.drawable.icon_markb);        //构建MarkerOption,用于在地图上添加Marker        OverlayOptions option = new MarkerOptions()                .position(point)                .icon(bitmap);        //在地图上添加Marker,并显示        mBaiduMap.addOverlay(option);    }}                

效果图就不贴了。

免费demo看头像
后面会传到资源库中

附DEMO

阅读全文
0 0
原创粉丝点击