注意事项:
一、①当打开百度demo不能定位时,考虑是否更换了key。
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="Mbg6oV5kPFG2CcYU3q1zFV7jePZlcGOz" />
②自定义一个MyApplication继承自Application,在onCreate()方法中初始化全局SDKInitializer.initialize(getApplicationContext());
③尤其需要在mainfest中添加权限
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!-- 允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"></service>
1、计算两点间的距离
public boolean isLocation(LatLng latLng, LatLng latLng2, Integer r) {
double R = 6371;// 地球半径
double distance = 0.0;
double dLat = Double.valueOf(new BigDecimal(String
.valueOf((latLng.latitude - latLng2.latitude)))
.multiply(new BigDecimal(String.valueOf(Math.PI)))
.divide(new BigDecimal(String.valueOf(180)), 10,
BigDecimal.ROUND_HALF_EVEN).toString());
double dLon = Double.valueOf(new BigDecimal(String
.valueOf((latLng.longitude - latLng2.longitude)))
.multiply(new BigDecimal(String.valueOf(Math.PI)))
.divide(new BigDecimal(String.valueOf(180)), 10,
BigDecimal.ROUND_HALF_EVEN).toString());
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+ Math.cos(latLng.latitude * Math.PI / 180)
* Math.cos(latLng2.latitude * Math.PI / 180)
* Math.sin(dLon / 2) * Math.sin(dLon / 2);
distance = (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))) * R * 1000;
System.out.println(distance);// distance两个坐标点之间的直线距离
if (distance > Double.valueOf(String.valueOf(r))) {//r为设置的半径
return true;
}
return false;
}
2、调用外部百度地图导航
public void startNavi(LatLng pt1, LatLng pt2) {
// 构建导航参数
/**
* endName(java.lang.String endName):导航终点名称 endPoint(LatLng
* endPoint):导航终点, 百度经纬度坐标 startName(java.lang.String startName):导航起点名称
* startPoint(LatLng startPoint):导航起点, 百度经纬度坐标
* */
NaviParaOption para = new NaviParaOption().startPoint(pt1)
.endPoint(pt2).startName("天安门").endName("百度大厦");
try {
/**
* openBaiduMapNavi(NaviParaOption para, Context context) 调起百度地图导航页面
* */
BaiduMapNavigation.openBaiduMapNavi(para, getActivity());
} catch (BaiduMapAppNotSupportNaviException e) {
e.printStackTrace();
showConfirmTip("您尚未安装百度地图app或app版本过低,点击确认安装?",
new OnCustomDialogConfirmListener() {
@Override
public void onClick() {
// TODO Auto-generated method stub
OpenClientUtil.getLatestBaiduMapApp(getActivity());
}
}, new OnCustomDialogConfirmListener() {
@Override
public void onClick() {
// TODO Auto-generated method stub
}
});
}
}
3、打开实时路况 / 打开热力地图
case R.id.traffic_map_btn:
if (!mBaiduMap.isTrafficEnabled()) {
mBaiduMap.setTrafficEnabled(true);
trafficMapBtn.setText("关闭实时路况");
} else {
mBaiduMap.setTrafficEnabled(false);
trafficMapBtn.setText("打开实时路况");
}
break;
case R.id.heat_map_btn:
if (!mBaiduMap.isBaiduHeatMapEnabled()) {
mBaiduMap.setBaiduHeatMapEnabled(true);
headMapBtn.setText("关闭热力图");
} else {
mBaiduMap.setBaiduHeatMapEnabled(false);
headMapBtn.setText("打开热力图");
}
break;
4、反地理编码得到地址信息,需要定义一个全局变量,在该方法里赋值即可。
/**
* 反地理编码得到地址信息
*
* @return
*/
private void reverseGeoCode(LatLng latLng) {
// 创建地理编码检索实例
GeoCoder geoCoder = GeoCoder.newInstance();
geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
// TODO Auto-generated method stub
if (result == null
|| result.error != SearchResult.ERRORNO.NO_ERROR) {
// 没有检测到结果
Toast.makeText(getActivity(), "抱歉,未能找到结果",
Toast.LENGTH_LONG).show();
}
Toast.makeText(getActivity(), "位置:" + result.getAddress(),
Toast.LENGTH_LONG).show();
cenpt1Addr = result.getAddress();
location.setText(cenpt1Addr);
Log.e("ShiftFragment", cenpt1Addr);
}
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
// TODO Auto-generated method stub
if (result == null
|| result.error != SearchResult.ERRORNO.NO_ERROR) {
// 没有检测到结果
}
}
});
//geoCoder.destroy();// 释放地理编码检索实例 ,不知道为什么有这句话地址就解析不出来
}
5、 根据经纬度获得车辆位置信息,给期设置定位图标
/**
* 根据经纬度获得车辆位置信息
*
* @param cenpt1 点1
* @param
*/
private Marker mMarkerB;
private Marker mMarkerC;
BitmapDescriptor bdA = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
BitmapDescriptor bdB = BitmapDescriptorFactory
.fromResource(R.drawable.gzcbus);
BitmapDescriptor bdC = BitmapDescriptorFactory
.fromResource(R.drawable.trailerbusy);
public void initOverlay() {
if(cenpt1!=null && cenpt2!=null){
MarkerOptions ooB = new MarkerOptions().position(cenpt1).icon(bdB);
mMarkerB = (Marker) (mBaiduMap.addOverlay(ooB));
MarkerOptions ooC = new MarkerOptions().position(cenpt2).icon(bdC);
mMarkerC = (Marker) (mBaiduMap.addOverlay(ooC));
}else{
linear1.setVisibility(View.GONE);
linear2.setVisibility(View.GONE);
return;
}
}