Android Studio 百度地图定位、轨迹及所在位置与标注marker的距离

来源:互联网 发布:mac baren烟丝购买 编辑:程序博客网 时间:2024/05/21 19:26
1. 在百度地图开放平台注册应用  获得应用AK   如果获取SHA1不对,可以下载MCodeCheck.apk 安装在测试手机上查看SHA1
2. 在百度地图开放平台下载所需的SDK
3. 将BaiduLBS_Android.jar 放在libs下,将armeabi armeabi-v7a arm64 x86 x86_64 文件夹copy至 jniLibs文件夹下
4.  在AndroidManifest中 
4.1添加权限:参考百度定位配置环境链接 
4.2 在Application标签中添加:(根据类型添加的不同,如鹰眼轨迹就添加一些其他的,这里是定位,就添加的如下两个)
<meta-data    android:name="com.baidu.lbsapi.API_KEY"    android:value="zDRAZmh5buuLFwVyX1xzhTbE4tORP17W" /><service    android:name="com.baidu.location.f"    android:enabled="true"    android:process=":remote" ></service>
  4.3 自定义Application 添加代码:  
SDKInitializer.initialize(MyApplication.this);// 初始化百度地图
并在AndroidManifest这里  
<application    android:name=".Application.MyApplication"
改成自定义的
5. 写Activity
5.1 布局
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_baidumap"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.BaiduMap.BaiduMapActivity">     <com.baidu.mapapi.map.MapView       android:id="@+id/bmapView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:clickable="true"        >    </com.baidu.mapapi.map.MapView></FrameLayout>

5.2 android activity 代码
public class BaiduMapActivity extends Activity implements View.OnClickListener{    private ArrayList<LatLng> mapList;// 路线点的集合    private MapView mMapView;//百度地图控件    private BaiduMap mBaiduMap;//百度地图对象    List<LatLng> points = new ArrayList<LatLng>();    private LocationClient locationClient;//定位核心类    private MyLocationListenner myListener = new MyLocationListenner();//定位监听    boolean isFirstLoc = true;//是否首次定位
    private LatLng baiduPoint_now;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext());//dw setContentView(R.layout.activity_baidumap); //透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); mMapView = (MapView) findViewById(R.id.bmapView);//获取百度地图控件 mBaiduMap = mMapView.getMap();//获取百度地图对象 mBaiduMap.setMyLocationEnabled(true);//开启定位图层
mBaiduMap.setBaiduHeatMapEnabled(true);//热力图
//定位初始化 locationClient = new LocationClient(this);//声明定位SDK核心类 locationClient.registerLocationListener(myListener);//注册监听 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);//打开GPS option.setCoorType("bd09ll");//设置坐标类型 option.setScanSpan(10000);//定位请求时间间隔 locationClient.setLocOption(option); locationClient.start();//开启定位 } private Marker routeMarker; private int ROUTETIME = 300; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { if(msg.what == 100){ LatLng p_baidu = (LatLng)msg.obj; if(points.size() < 2){ points.add(p_baidu); points.add(p_baidu); }else{ points.add(p_baidu); } OverlayOptions overlayOptions = new PolylineOptions() .width(20) .color(0X7FFF0000) .points(points); mBaiduMap.addOverlay(overlayOptions);
//添加标记
LatLng p0 = new LatLng(39.917038, 116.392339);//这里坐标可以根据定位或者其他数据来源
// marker 的图片        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.photo);//marker option        MarkerOptions markerOptions = new MarkerOptions().icon(bitmap).position(p0);
mBaiduMap.addOverlay(markerOptions);
//marker 点击 这里是显示了距离 当然也可以自定义其他
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {        @Override        public boolean onMarkerClick(Marker marker) {        LatLng p = new LatLng(marker.getPosition().latitude, marker.getPosition().longitude);        String str = getDistance(baiduPoint_now,p);        Toast.makeText(BaiduMapActivity.this,"该地点与您现在的直线距离是"+str,Toast.LENGTH_SHORT).show();        return false;                }});
//marker 移除
Marker marker = (Marker) mBaiduMap.addOverlay(markerOptions);marker.remove();
            }        };    };    /**     * 添加路线     *     * @param routeList     */    private void addRouteLine(List<LatLng> routeList) {        mBaiduMap.clear();        // 百度最多支持10000个点连线        if (routeList.size() > 10000) {            routeList = routeList.subList(0, 10000);        }        moveToLocation(routeList.get(routeList.size() / 2), true);    }    @Override    public void onClick(View v) {    }    /**     * 定位SDK监听函数     */    public class MyLocationListenner implements BDLocationListener {        @Override        public void onReceiveLocation(BDLocation location) {            // map view 销毁后不在处理新接收的位置            if (location == null || mMapView == null) {                return;            }            MyLocationData locData = new MyLocationData.Builder()                    .accuracy(location.getRadius())                    // 此处设置开发者获取到的方向信息,顺时针0-360                    .direction(100).latitude(location.getLatitude())                    .longitude(location.getLongitude()).build();            mBaiduMap.setMyLocationData(locData);            if (isFirstLoc) {                isFirstLoc = false;                LatLng ll = new LatLng(location.getLatitude(),                        location.getLongitude());                MapStatus.Builder builder = new MapStatus.Builder();                builder.target(ll).zoom(18.0f);                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));            }            StringBuffer sb = new StringBuffer(256);            sb.append("time : ");            sb.append(location.getTime());            sb.append("\nerror code : ");            sb.append(location.getLocType());            sb.append("\nlatitude : ");            sb.append(location.getLatitude());            sb.append("\nlontitude : ");            sb.append(location.getLongitude());            sb.append("\nradius : ");            sb.append(location.getRadius());            sb.append("\ncity : ");            sb.append(location.getCity());            if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果                sb.append("\nspeed : ");                sb.append(location.getSpeed());// 单位:公里每小时                sb.append("\nsatellite : ");                sb.append(location.getSatelliteNumber());                sb.append("\nheight : ");                sb.append(location.getAltitude());// 单位:米                sb.append("\ndirection : ");                sb.append(location.getDirection());// 单位度                sb.append("\naddr : ");                sb.append(location.getAddrStr());                sb.append("\ndescribe : ");                sb.append("gps定位成功");            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果                sb.append("\naddr : ");                sb.append(location.getAddrStr());                //运营商信息                sb.append("\noperationers : ");                sb.append(location.getOperators());                sb.append("\ndescribe : ");                sb.append("网络定位成功");            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果                sb.append("\ndescribe : ");                sb.append("离线定位成功,离线定位结果也是有效的");            } else if (location.getLocType() == BDLocation.TypeServerError) {                sb.append("\ndescribe : ");                sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {                sb.append("\ndescribe : ");                sb.append("网络不同导致定位失败,请检查网络是否通畅");            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {                sb.append("\ndescribe : ");                sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");            }            sb.append("\nlocationdescribe : ");            sb.append(location.getLocationDescribe());// 位置语义化信息            List<Poi> list = location.getPoiList();// POI数据            if (list != null) {                sb.append("\npoilist size = : ");                sb.append(list.size());                for (Poi p : list) {                    sb.append("\npoi= : ");                    sb.append(p.getId() + " " + p.getName() + " " + p.getRank());                }            }            Log.i("BaiduLocationApiDem", sb.toString());            Toast.makeText(BaiduMapActivity.this,sb.toString(),Toast.LENGTH_LONG).show();                      double latitude_d = location.getLatitude();            double longitude_d = location.getLongitude();            //在这里把坐标传过去 绘制            baiduPoint_now = new LatLng(latitude_d, longitude_d);
   //这里加上判断 
if(LocType == 67){    Toast.makeText(BaiduMapActivity.this,"离线定位失败",Toast.LENGTH_SHORT).show();}else if(LocType == 62) {    Toast.makeText(BaiduMapActivity.this,"无法获取有效定位依据,请检查运营商或WiFi网络是否正常开启",Toast.LENGTH_SHORT).show();}else if(LocType == 167){    Toast.makeText(BaiduMapActivity.this,"服务端定位失败,请您检查是否禁用获取位置信息权限",Toast.LENGTH_SHORT).show();}else{    Message msg = new Message();    msg.what = 100;    msg.obj = baiduPoint_now;//可以是基本类型,可以是对象,可以是List、map等;    mHandler.sendMessage(msg);}
}  
    @Override        public void onConnectHotSpotMessage(String s, int i) {            Log.i("百度定位","在这里1");        }        public void onReceivePoi(BDLocation poiLocation) {        }    }    @Override    protected void onPause() {        mMapView.onPause();        super.onPause();    }    @Override    protected void onResume() {        mMapView.onResume();        super.onResume();    }    @Override    protected void onDestroy() {        // 退出时销毁定位        locationClient.stop();        // 关闭定位图层        mBaiduMap.setMyLocationEnabled(false);        mMapView.onDestroy();        mMapView = null;        super.onDestroy();    }
/** * 计算两点之间距离 * @param start * @param end * @return  */public String getDistance(LatLng start,LatLng end){    double lat1 = (Math.PI/180)*start.latitude;    double lat2 = (Math.PI/180)*end.latitude;    double lon1 = (Math.PI/180)*start.longitude;    double lon2 = (Math.PI/180)*end.longitude;    //地球半径    double R = 6371;    //两点间距离 km,如果想要米的话,结果*1000    double d =  Math.acos(Math.sin(lat1)*Math.sin(lat2)+Math.cos(lat1)*Math.cos(lat2)*Math.cos(lon2-lon1))*R;    if(d<1)        return (int)d*1000+"m";    else        return String.format("%.2f",d)+"km";}

}

附:定位SDK-错误码对照表 或 定位SDK错误对照表链接2
至此基本可以实现;
添加覆盖物 导航后续添加。
欢迎留言交流指正 共同促进!
1 0