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
- Android Studio 百度地图定位、轨迹及所在位置与标注marker的距离
- 百度地图 Android SDK - 标注(Marker)的基本使用
- 百度地图 Android SDK - 标注(Marker)的基本使用
- 百度地图Marker的定位和方向
- Android studio 百度地图开发(6)Marker绑定事件、计算两点距离
- android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索
- android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索
- 百度地图定位-android studio
- 关于百度地图标注marker,三个以上标注只成功跳转三个的问题的解决方案
- android集成百度地图定位、poi检索、marker标记功能,以及marker点击事件
- 百度地图API-地图标注(Marker)用法说明
- Android 百度地图sdk 标注图marker中可以切换显示不同内容
- 百度地图植入android应用系列教程三实现百度地图上的覆盖物Marker与InfoWindow的使用
- Android 4.0版百度地图marker动画设置与取消
- php的百度地图应用marker及点击事件,searchInfoWindow
- 百度地图3.0以上版本标注marker及其点击事件
- 百度地图 标注 显示信息 Marker单击事件 代码参考
- 百度地图marker标注上如何加上数字
- 初学linux ---linux文件结构及管理
- Linux 学习总结 (四)
- 微信公众号开发-自定义菜单中链接用MUI前端框架写的网页以及发布到SAE服务器
- 关于SearchView的使用理解
- Linux操作系统十个注意事项
- Android Studio 百度地图定位、轨迹及所在位置与标注marker的距离
- LeetCode Nim Game
- label标签的二次点击事件
- LeetCode | Two Sum
- Delphi容器类之---TList、TObjectList、TComponentList、TClassList的使用
- 【闲聊】HUAWEI_Code_Craft sdk目录结构
- Oracle 11.2.0.4 expdp 含CLOB字段(basicfile)超级慢
- JVM笔记(二) 垃圾收集器(1)
- 【题解】 [HAOI2006]受欢迎的牛(强连通分量 tarjan)