本人也是新手,这篇就当是笔记。以后忘记了也方便查找。可能有错误的地方,希望大家指出。
这篇文章介绍的是百度地图中两个简单的功能,百度地图API文档写的不详细,按照自己的想法写的。
这是百度地图api的文档地址 http://developer.baidu.com/map/index.php?title=androidsdk
如果是新手,首先申请开发者帐号,需要包名和数字签名。
包名就不解释了,数字签名就是SHA1
然后把jar包复制到libs里。根据DEMO 写就没问题了。如果地图不出现,但是有网格出现,可能是KEY错了,或者是权限没加。
DEMO的包中,权限可能不完整。这边可能还要加上流量的权限,不然在没WIFI,有3G4G情况下,地图不显示。
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
好了,该开始正题了。
首先开始说线路规划。主要讲驾车路线规划。百度文档上说的不是很清楚,我来贴详细代码。
因为兼职做的物流APP,需要两个点的驾车距离。我就只取了距离值。
有些地址的路径搜索不到,我根据经纬度,用自己的公式进行计算。这个方法输入起点名和终点名。
public void distance(String start,String end){
//设置起终点信息,对于tranist search 来说,城市名无意义
PlanNode stNode = PlanNode.withCityNameAndPlaceName("上海", start);
PlanNode enNode = PlanNode.withCityNameAndPlaceName("上海", end);
RoutemSearch.drivingSearch((new DrivingRoutePlanOption())
.from(stNode)
.to(enNode));
}
然后在onGetDrivingRouteResult 这个方法里,可以获取到从百度地图API传回的参数。
我这边是转换了下类型。和截取了一下小数点。因为返回的参数是米。要除以1000。
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
distance= result.getRouteLines().get(0).getDistance();
Double distance_1= Double.valueOf(distance);
Double distance_new=distance_1/1000;
BigDecimal b = new BigDecimal(distance_new);
double f1 = b.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
distance_textview.setText(f1+"公里");
distance1 = String.valueOf(f1);
}
result.getRouteLines().get(0) 0指的是获取的第一条建议路线,getDistance();意思就是距离,也可以调用其他信息。
然后我还判断了如果获取不到距离,用自己的公式,根据起点终点的经纬度来获取驾车的大概距离。
继续在onGetDrivingRouteResult 方法里进行判断如果百度地图没有数据
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
// Toast.makeText(MessageSendActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
if (!geox1.equals("")&&!geoy1.equals("")&&!geox10.equals("")&&!geoy10.equals("")) {
Double geox1double=Double.parseDouble(geoy1);
Double geoy1double=Double.parseDouble(geox1);
Double geox10double=Double.parseDouble(geoy10);
Double geoy10double=Double.parseDouble(geox10);
float distancefloat=getDistance(geox1double, geox10double, geoy1double, geoy10double);
distance_textview.setText(distancefloat+"公里");
}else {
distance_textview.setText("无");
}
}
getDistance 方法的公式是
private float getDistance(Double geox1,Double geox2,Double geoy1,Double geoy2){
float distance = (float) 0.1;
double radLat1 = rad(geox1);
double radLat2 = rad(geox2);
double a = radLat1 - radLat2;
double b = rad(geoy1) - rad(geoy2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = (double) Math.round(s * 1000000) / 1000;// 单位为米
s = s / 1000;// 单位为公里
distance = ( (float)((int) (s * 13))) / 10;// 保留一位小数, 直线距离×1.3为行车路线距离
if(distance <0.1){
distance = (float) 0.1;
}
return distance;
}