使用第三方百度地圖根據城市名稱計算兩地之間的實際駕車距離


  大概思路是這樣的,我們需要首先根據兩地之間的城市名稱獲取到兩地的經緯度,在網上查到的很多方法都是根據經緯度計算兩地之間的球面距離或者是直線距離,而不是實際的駕車距離,百度地圖第三方API實際上有提供計算駕車距離的方法,除此之外,還有騎行距離,步行距離等,並且規划了幾條不同的路線,下面具體詳解功能實現的核心代碼。

  1.使用第三方平台首要的是導入相應第三方的SDK。這個自行去百度開發平台下載。

  2.申請appKey,這里需要提到的一點是我在使用eclipse開發過程中遇到的坑。申請appKey需要SHA1和packegName,其中packegName肯定是沒有問題的,在清單文件就可以找到,但是項目打包完成以后的SHA1值卻和eclipse自帶的SHA1值不一樣,測試時,我們的SHA1值可以在Window-preferences-Android-build目錄下找到,使用這個SHA1值申請的appKey也僅僅是測試的時候可以使用,如果需要上線使用,也就是使用keyStoer進行打包,就不能使用這個SHA1申請的appKey,有一個最簡單的辦法可以找到與keyStor對應的SHA1。在用keyStor進行打包的時候到了最后一步finish的時候就會看到一個SHA1值,那就是這個了。用這個SHA1申請的appKey就可以上線使用了。在清單文件中配置appKey。


<!-- meta-data需要寫在application中 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="VEDGD3GLpdvRgKkYTb2yBvQg385kdRoC" />
<!-- 線上:VEDGD3GLpdvRgKkYTb2yBvQg385kdRoC -->
<!-- 測試:qYBH9YBopFAY3CsBaG3B4mftkKvhg0xI -->

   3.在application中進行初始化

SDKInitializer.initialize(this);
mLocationClient = new LocationClient(this.getApplicationContext());
mGeofenceClient = new GeofenceClient(getApplicationContext());

  4.下面是針對這一需求寫的工具類

public class GetInstence implements OnGetRoutePlanResultListener {
// private double d1;
// private double d2;
// private double d3;
// private double d4;
TextView textView;
RoutePlanSearch mSearch = null; // 路徑規划,可獨立使用該模塊
private static final double EARTH_RADIUS = 6378137.0;
private GeoCoder mySearch;
private String str=null;
Context context;
boolean flag;
static LatLng latLng1=null;
static LatLng latlng2=null;
public GetInstence(String str, Context context, boolean flag,TextView textView) {
this.str = str;
this.context = context;
this.flag = flag;
this.textView=textView;
}
public static LatLng Getlat1(){

return latLng1;
}
public static LatLng Getlat2(){

return latlng2;
}

public void cal(){
// 初始化搜索模塊,注冊事件監聽
mSearch = RoutePlanSearch.newInstance();
mSearch.setOnGetRoutePlanResultListener(this);

mySearch = GeoCoder.newInstance();
mySearch.geocode(new GeoCodeOption().city("").address(str));
mySearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult arg0) {
}
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
double latitude;
double longitude;
LatLng l1;
LatLng l2;
// //拿到經緯度
// String strInfo = String.format("緯度:%f 經度:%f",
// result.getLocation().latitude, result.getLocation().longitude);

latitude=result.getLocation().latitude;
longitude= result.getLocation().longitude;
if(flag){
PrefUtils.putString(context, "a1", String.valueOf(latitude));
PrefUtils.putString(context, "a2", String.valueOf(longitude));
}else{
PrefUtils.putString(context, "b1", String.valueOf(latitude));
PrefUtils.putString(context, "b2", String.valueOf(longitude));
}
if(!flag){
double d1=Double.parseDouble(PrefUtils.getString(context, "a1", null));
double d2=Double.parseDouble(PrefUtils.getString(context, "a2", null));
double d3=Double.parseDouble(PrefUtils.getString(context, "b1", null));
double d4=Double.parseDouble(PrefUtils.getString(context, "b2", null));
latLng1=new LatLng(d1, d2);
latlng2=new LatLng(d3, d4);
PlanNode stNode = PlanNode.withLocation(latLng1);
PlanNode enNode = PlanNode.withLocation(latlng2);
mSearch.drivingSearch((new DrivingRoutePlanOption())
.from(stNode).to(enNode));
textView.setText("計算中...");

double s=getDistance(d2,d1,d4,d3);

double a=s/1000;
DecimalFormat df = new DecimalFormat("0.00");
String num = df.format(a);

}
}
});
}

public double getDistance(double longitude1, double latitude1,
double longitude2, double latitude2) {
double Lat1 = rad(latitude1);
double Lat2 = rad(latitude2);
double a = Lat1 - Lat2;
double b = rad(longitude1) - rad(longitude2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+ Math.cos(Lat1) * Math.cos(Lat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000) / 10000;
return s;
}
private double rad(double d) {
return d * Math.PI / 180.0;
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult result) {
// TODO Auto-generated method stub
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//Toast.makeText(, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();
textView.setText("");
}
if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
// 起終點或途經點地址有岐義,通過以下接口獲取建議查詢信息
// result.getSuggestAddrInfo()
return;
}
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
result.getRouteLines();
result.getRouteLines();
//instence.setText("計算中。。。");
double object=result.getRouteLines().get(0).getDistance();
DecimalFormat df = new DecimalFormat("0.00");
String num = df.format(object/1000);
textView.setText(num+"km");
//mSearch = null;
}
}
@Override
public void onGetTransitRouteResult(TransitRouteResult arg0) {
// TODO Auto-generated method stub

}
@Override
public void onGetWalkingRouteResult(WalkingRouteResult arg0) {
// TODO Auto-generated method stub

}
}

上面代碼很多都是和我們工程相關的,因此我做一下代碼提取

  首先需要去實現OnGetRoutePlanResultListener這個接口,重寫方法onGetDrivingRouteResult,onGetTransitRouteResult,onGetWalkingRouteResult。需要的駕車距離會在onGetDrivingRouteResult這個方法中回調。拿到這個回調有兩種方法,一種是直接用地點名稱計算,另外一種是用經緯度來計算,所以我是先通過地點名稱拿到經緯度,再利用經緯度進行計算。cal()  這個方法就是計算經緯度的。拿到經緯度的同時會接收到onGetDrivingRouteResult方法的回調值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM