一、原理
在高德地圖使用的時候,我們在給定起點和終點的時候就可以規劃出線路,但是有時候我們需要車按指定的站點進行運行和線路規劃,那麼,此時的話就必須自己去重新來規
劃這個線路,原理也很簡單,就是獲取到你要經過的那些地方的經緯度(經緯度一定要是準確的經緯度,這裏在獲取的時候可以通過地理編碼去獲取),在獲取到經緯度之後把數
據傳遞到線路規劃的方法裏面,這樣就可以完成線路的自定義規劃!
二、獲取要經過的站點經緯度
1:佈局文件
- <?xml version=“1.0” encoding=“utf-8”?>
- <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
- android:layout_width=“fill_parent”
- android:layout_height=“fill_parent”
- android:background=“#FFF”
- android:orientation=“vertical” >
- <LinearLayout
- android:layout_width=“match_parent”
- android:layout_height=“50dp” >
- <Button
- android:id=“@+id/button1”
- android:layout_width=“0dp”
- android:layout_height=“fill_parent”
- android:layout_weight=“1”
- android:text=“中興產業園” />
- <Button
- android:id=“@+id/button2”
- android:layout_width=“0dp”
- android:layout_height=“fill_parent”
- android:layout_weight=“1”
- android:text=“大雁塔” />
- <Button
- android:id=“@+id/button3”
- android:layout_width=“0dp”
- android:layout_height=“fill_parent”
- android:layout_weight=“1”
- android:text=“旺座現代城” />
- </LinearLayout>
- <LinearLayout
- android:layout_width=“match_parent”
- android:layout_height=“50dp” >
- <Button
- android:id=“@+id/button4”
- android:layout_width=“0dp”
- android:layout_height=“fill_parent”
- android:layout_weight=“1”
- android:text=“亞美大廈” />
- <Button
- android:id=“@+id/button5”
- android:layout_width=“0dp”
- android:layout_height=“fill_parent”
- android:layout_weight=“1”
- android:text=“吉祥村” />
- <Button
- android:id=“@+id/button6”
- android:layout_width=“0dp”
- android:layout_height=“fill_parent”
- android:layout_weight=“1”
- android:text=“陝西歷史博物館” />
- </LinearLayout>
- <com.amap.api.maps.MapView
- android:id=“@+id/map”
- android:layout_width=“match_parent”
- android:layout_height=“match_parent” />
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp" >
<Button
android:id="@+id/button1"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="中興產業園" />
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="大雁塔" />
<Button
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="旺座現代城" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp" >
<Button
android:id="@+id/button4"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="亞美大廈" />
<Button
android:id="@+id/button5"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="吉祥村" />
<Button
android:id="@+id/button6"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:text="陝西歷史博物館" />
</LinearLayout>
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2:Java文件
- package com.amap.map3d.demo.geocoder;
- import android.app.Activity;
- import android.app.ProgressDialog;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import com.amap.api.maps.AMap;
- import com.amap.api.maps.CameraUpdateFactory;
- import com.amap.api.maps.MapView;
- import com.amap.api.maps.model.BitmapDescriptorFactory;
- import com.amap.api.maps.model.Marker;
- import com.amap.api.maps.model.MarkerOptions;
- import com.amap.api.services.core.LatLonPoint;
- import com.amap.api.services.geocoder.GeocodeAddress;
- import com.amap.api.services.geocoder.GeocodeQuery;
- import com.amap.api.services.geocoder.GeocodeResult;
- import com.amap.api.services.geocoder.GeocodeSearch;
- import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
- import com.amap.api.services.geocoder.RegeocodeQuery;
- import com.amap.api.services.geocoder.RegeocodeResult;
- import com.amap.map3d.demo.util.AMapUtil;
- import com.amap.map3d.demo.util.ToastUtil;
- import com.amap.map3d.demo.R;
- /**
- * 地理編碼與逆地理編碼功能介紹
- */
- public class GeocoderActivity extends Activity implements OnGeocodeSearchListener, OnClickListener {
- private ProgressDialog progDialog = null;
- private GeocodeSearch geocoderSearch;
- private String addressName;
- private AMap aMap;
- private MapView mapView;
- private LatLonPoint latLonPoint = new LatLonPoint(39.90865, 116.39751);
- private Marker geoMarker;
- private Marker regeoMarker;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.geocoder_activity);
- /*
- * 設置離線地圖存儲目錄,在下載離線地圖或初始化地圖設置; 使用過程中可自行設置, 若自行設置了離線地圖存儲的路徑,
- * 則需要在離線地圖下載和使用地圖頁面都進行路徑設置
- */
- // Demo中爲了其他界面可以使用下載的離線地圖,使用默認位置存儲,屏蔽了自定義設置
- // MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this);
- mapView = (MapView) findViewById(R.id.map);
- mapView.onCreate(savedInstanceState);// 此方法必須重寫
- }
- /**
- * 方法必須重寫
- */
- @Override
- protected void onResume() {
- super.onResume();
- mapView.onResume();
- }
- /**
- * 方法必須重寫
- */
- @Override
- protected void onPause() {
- super.onPause();
- mapView.onPause();
- }
- /**
- * 方法必須重寫
- */
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- mapView.onSaveInstanceState(outState);
- }
- /**
- * 方法必須重寫
- */
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mapView.onDestroy();
- }
- /**
- * 顯示進度條對話框
- */
- public void showDialog() {
- progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
- progDialog.setIndeterminate(false);
- progDialog.setCancelable(true);
- progDialog.setMessage(“正在獲取地址”);
- progDialog.show();
- }
- /**
- * 隱藏進度條對話框
- */
- public void dismissDialog() {
- if (progDialog != null) {
- progDialog.dismiss();
- }
- }
- /**
- * 響應地理編碼
- */
- public void getLatlon(final String name) {
- showDialog();
- GeocodeQuery query = new GeocodeQuery(name, “010”);// 第一個參數表示地址,第二個參數表示查詢城市,中文或者中文全拼,citycode、adcode,
- geocoderSearch.getFromLocationNameAsyn(query);// 設置同步地理編碼請求
- }
- /**
- * 響應逆地理編碼
- */
- public void getAddress(final LatLonPoint latLonPoint) {
- showDialog();
- RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一個參數表示一個Latlng,第二參數表示範圍多少米,第三個參數表示是火系座標系還是GPS原生座標系
- geocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求
- }
- /**
- * 地理編碼查詢回調
- */
- @Override
- public void onGeocodeSearched(GeocodeResult result, int rCode) {
- dismissDialog();
- if (rCode == 0) {
- if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) {
- GeocodeAddress address = result.getGeocodeAddressList().get(0);
- aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(address.getLatLonPoint()), 15));
- geoMarker.setPosition(AMapUtil.convertToLatLng(address.getLatLonPoint()));
- addressName = “經緯度值:” + address.getLatLonPoint() + ”\n位置描述:” + address.getFormatAddress();
- ToastUtil.show(GeocoderActivity.this, addressName);
- } else {
- ToastUtil.show(GeocoderActivity.this, R.string.no_result);
- }
- } else if (rCode == 27) {
- ToastUtil.show(GeocoderActivity.this, R.string.error_network);
- } else if (rCode == 32) {
- ToastUtil.show(GeocoderActivity.this, R.string.error_key);
- } else {
- ToastUtil.show(GeocoderActivity.this, getString(R.string.error_other) + rCode);
- }
- }
- /**
- * 逆地理編碼回調
- */
- @Override
- public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
- dismissDialog();
- if (rCode == 0) {
- if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {
- addressName = result.getRegeocodeAddress().getFormatAddress() + ”附近”;
- aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(latLonPoint), 15));
- regeoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint));
- ToastUtil.show(GeocoderActivity.this, addressName);
- } else {
- ToastUtil.show(GeocoderActivity.this, R.string.no_result);
- }
- } else if (rCode == 27) {
- ToastUtil.show(GeocoderActivity.this, R.string.error_network);
- } else if (rCode == 32) {
- ToastUtil.show(GeocoderActivity.this, R.string.error_key);
- } else {
- ToastUtil.show(GeocoderActivity.this, getString(R.string.error_other) + rCode);
- }
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- /**
- * 響應地理編碼按鈕
- */
- case R.id.geoButton:
- getLatlon(“方恆國際中心”);
- break;
- /**
- * 響應逆地理編碼按鈕
- */
- case R.id.regeoButton:
- getAddress(latLonPoint);
- break;
- default:
- break;
- }
- }
- }
package com.amap.map3d.demo.geocoder;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.map3d.demo.util.AMapUtil;
import com.amap.map3d.demo.util.ToastUtil;
import com.amap.map3d.demo.R;
/**
* 地理編碼與逆地理編碼功能介紹
*/
public class GeocoderActivity extends Activity implements OnGeocodeSearchListener, OnClickListener {
private ProgressDialog progDialog = null;
private GeocodeSearch geocoderSearch;
private String addressName;
private AMap aMap;
private MapView mapView;
private LatLonPoint latLonPoint = new LatLonPoint(39.90865, 116.39751);
private Marker geoMarker;
private Marker regeoMarker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.geocoder_activity);
/*
* 設置離線地圖存儲目錄,在下載離線地圖或初始化地圖設置; 使用過程中可自行設置, 若自行設置了離線地圖存儲的路徑,
* 則需要在離線地圖下載和使用地圖頁面都進行路徑設置
*/
// Demo中爲了其他界面可以使用下載的離線地圖,使用默認位置存儲,屏蔽了自定義設置
// MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this);
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState);// 此方法必須重寫
}
/**
* 方法必須重寫
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
/**
* 方法必須重寫
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
/**
* 方法必須重寫
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必須重寫
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
/**
* 顯示進度條對話框
*/
public void showDialog() {
progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progDialog.setIndeterminate(false);
progDialog.setCancelable(true);
progDialog.setMessage("正在獲取地址");
progDialog.show();
}
/**
* 隱藏進度條對話框
*/
public void dismissDialog() {
if (progDialog != null) {
progDialog.dismiss();
}
}
/**
* 響應地理編碼
*/
public void getLatlon(final String name) {
showDialog();
GeocodeQuery query = new GeocodeQuery(name, "010");// 第一個參數表示地址,第二個參數表示查詢城市,中文或者中文全拼,citycode、adcode,
geocoderSearch.getFromLocationNameAsyn(query);// 設置同步地理編碼請求
}
/**
* 響應逆地理編碼
*/
public void getAddress(final LatLonPoint latLonPoint) {
showDialog();
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一個參數表示一個Latlng,第二參數表示範圍多少米,第三個參數表示是火系座標系還是GPS原生座標系
geocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求
}
/**
* 地理編碼查詢回調
*/
@Override
public void onGeocodeSearched(GeocodeResult result, int rCode) {
dismissDialog();
if (rCode == 0) {
if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) {
GeocodeAddress address = result.getGeocodeAddressList().get(0);
aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(address.getLatLonPoint()), 15));
geoMarker.setPosition(AMapUtil.convertToLatLng(address.getLatLonPoint()));
addressName = "經緯度值:" + address.getLatLonPoint() + "\n位置描述:" + address.getFormatAddress();
ToastUtil.show(GeocoderActivity.this, addressName);
} else {
ToastUtil.show(GeocoderActivity.this, R.string.no_result);
}
} else if (rCode == 27) {
ToastUtil.show(GeocoderActivity.this, R.string.error_network);
} else if (rCode == 32) {
ToastUtil.show(GeocoderActivity.this, R.string.error_key);
} else {
ToastUtil.show(GeocoderActivity.this, getString(R.string.error_other) + rCode);
}
}
/**
* 逆地理編碼回調
*/
@Override
public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
dismissDialog();
if (rCode == 0) {
if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {
addressName = result.getRegeocodeAddress().getFormatAddress() + "附近";
aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(AMapUtil.convertToLatLng(latLonPoint), 15));
regeoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint));
ToastUtil.show(GeocoderActivity.this, addressName);
} else {
ToastUtil.show(GeocoderActivity.this, R.string.no_result);
}
} else if (rCode == 27) {
ToastUtil.show(GeocoderActivity.this, R.string.error_network);
} else if (rCode == 32) {
ToastUtil.show(GeocoderActivity.this, R.string.error_key);
} else {
ToastUtil.show(GeocoderActivity.this, getString(R.string.error_other) + rCode);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
/**
* 響應地理編碼按鈕
*/
case R.id.geoButton:
getLatlon("方恆國際中心");
break;
/**
* 響應逆地理編碼按鈕
*/
case R.id.regeoButton:
getAddress(latLonPoint);
break;
default:
break;
}
}
}
通過以上的方法可以以此獲取到各自的經緯度的值:
- private LatLonPoint lat_one = new LatLonPoint(34.215748, 108.891869);
- private LatLonPoint lat_two = new LatLonPoint(34.233685, 108.900635);
- private LatLonPoint lat_three = new LatLonPoint(34.225311, 108.930992);
- private LatLonPoint lat_four = new LatLonPoint(34.224136, 108.955284);
- // 旺座現代城:34.215748,108.891869
- // 亞美大廈:34.233685,108.900635
- // 吉祥村:34.225311,108.930992
- // 陝西歷史博物館:34.224136,108.955284
private LatLonPoint lat_one = new LatLonPoint(34.215748, 108.891869);
private LatLonPoint lat_two = new LatLonPoint(34.233685, 108.900635);
private LatLonPoint lat_three = new LatLonPoint(34.225311, 108.930992);
private LatLonPoint lat_four = new LatLonPoint(34.224136, 108.955284);
// 旺座現代城:34.215748,108.891869
// 亞美大廈:34.233685,108.900635
// 吉祥村:34.225311,108.930992
// 陝西歷史博物館:34.224136,108.955284
同時還要拿到起點和終點的經緯度:
- private LatLonPoint startPoint = new LatLonPoint(34.185642, 108.881905);
- private LatLonPoint endPoint = new LatLonPoint(34.214397, 108.963448);
private LatLonPoint startPoint = new LatLonPoint(34.185642, 108.881905);
private LatLonPoint endPoint = new LatLonPoint(34.214397, 108.963448);
三、線路規劃
- package com.bm.futuretechcity;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.os.Bundle;
- import android.os.Environment;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.ArrayAdapter;
- import android.widget.TextView;
- import com.amap.api.maps.AMap;
- import com.amap.api.maps.AMap.InfoWindowAdapter;
- import com.amap.api.maps.AMap.OnInfoWindowClickListener;
- import com.amap.api.maps.AMap.OnMapClickListener;
- import com.amap.api.maps.AMap.OnMarkerClickListener;
- import com.amap.api.maps.MapView;
- import com.amap.api.maps.MapsInitializer;
- import com.amap.api.maps.model.LatLng;
- import com.amap.api.maps.model.Marker;
- import com.amap.api.maps.overlay.DrivingRouteOverlay;
- import com.amap.api.services.core.LatLonPoint;
- import com.amap.api.services.geocoder.GeocodeAddress;
- import com.amap.api.services.geocoder.GeocodeQuery;
- import com.amap.api.services.geocoder.GeocodeResult;
- import com.amap.api.services.geocoder.GeocodeSearch;
- import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
- import com.amap.api.services.geocoder.RegeocodeQuery;
- import com.amap.api.services.geocoder.RegeocodeResult;
- import com.amap.api.services.poisearch.PoiItemDetail;
- import com.amap.api.services.poisearch.PoiResult;
- import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;
- import com.amap.api.services.route.BusRouteResult;
- import com.amap.api.services.route.DrivePath;
- import com.amap.api.services.route.DriveRouteResult;
- import com.amap.api.services.route.RouteSearch;
- import com.amap.api.services.route.RouteSearch.DriveRouteQuery;
- import com.amap.api.services.route.RouteSearch.OnRouteSearchListener;
- import com.amap.api.services.route.WalkRouteResult;
- import com.bm.futuretechcity.adapter.ShowBanCheLineAdapter;
- import com.bm.futuretechcity.base.BaseActivity;
- import com.bm.futuretechcity.bean.ShowBanCheMessage;
- import com.bm.futuretechcity.utils.ToastUtil;
- import com.bm.futuretechcity.view.HorizontalListView;
- /**
- * 班車線路
- *
- * @author wangxuan
- *
- */
- public class TraBanCheLineActivity extends BaseActivity implements OnGeocodeSearchListener, OnClickListener, OnMarkerClickListener,
- OnMapClickListener, OnInfoWindowClickListener, InfoWindowAdapter, OnPoiSearchListener, OnRouteSearchListener {
- private ProgressDialog progDialog = null;
- private GeocodeSearch geocoderSearch;
- private String addressName;
- private AMap aMap;
- private MapView mapView;
- private int drivingMode = RouteSearch.DrivingDefault;// 駕車默認模式
- private DriveRouteResult driveRouteResult;// 駕車模式查詢結果
- private int routeType = 1;// 1代表公交模式,2代表駕車模式,3代表步行模式
- private LatLonPoint startPoint = new LatLonPoint(34.185642, 108.881905);
- private LatLonPoint endPoint = new LatLonPoint(34.214397, 108.963448);
- private LatLonPoint lat_one = new LatLonPoint(34.215748, 108.891869);
- private LatLonPoint lat_two = new LatLonPoint(34.233685, 108.900635);
- private LatLonPoint lat_three = new LatLonPoint(34.225311, 108.930992);
- private LatLonPoint lat_four = new LatLonPoint(34.224136, 108.955284);
- // 旺座現代城:34.215748,108.891869
- // 亞美大廈:34.233685,108.900635
- // 吉祥村:34.225311,108.930992
- // 陝西歷史博物館:34.224136,108.955284
- private String[] station_name = new String[] { ”中興產業園”, ”旺座現代城”, ”亞美大廈”, ”吉祥村”, ”陝西歷史博物館”, ”大雁塔” };
- private List<LatLonPoint> list_latLatLonPoints = new ArrayList<LatLonPoint>();
- private RouteSearch routeSearch;
- public ArrayAdapter<String> aAdapter;
- private LatLonPoint start_msg;
- private LatLonPoint end_msg;
- private HorizontalListView show_station_name;
- private List<ShowBanCheMessage> list_showBanCheMessages = new ArrayList<ShowBanCheMessage>();
- /**
- * 頁面標題
- */
- private TextView titleTv;
- @Override
- protected void onCreate(Bundle bundle) {
- super.onCreate(bundle);
- setContentView(R.layout.activity_tra_ban_che_line);
- initWidget();
- show_station_name = (HorizontalListView) this.findViewById(R.id.show_station_name);
- ShowBanCheMessage showBanCheMessage;
- for(int i=0;i<station_name.length;i++){
- showBanCheMessage = new ShowBanCheMessage();
- showBanCheMessage.setStation_name(station_name[i]);
- list_showBanCheMessages.add(showBanCheMessage);
- }
- ShowBanCheLineAdapter showStationNameAdapter = new ShowBanCheLineAdapter(TraBanCheLineActivity.this, list_showBanCheMessages);
- show_station_name.setAdapter(showStationNameAdapter);
- geocoderSearch = new GeocodeSearch(this);
- geocoderSearch.setOnGeocodeSearchListener(this);
- list_latLatLonPoints.add(lat_one);
- list_latLatLonPoints.add(lat_two);
- list_latLatLonPoints.add(lat_three);
- list_latLatLonPoints.add(lat_four);
- /*
- * 設置離線地圖存儲目錄,在下載離線地圖或初始化地圖設置; 使用過程中可自行設置, 若自行設置了離線地圖存儲的路徑,
- * 則需要在離線地圖下載和使用地圖頁面都進行路徑設置
- */
- // Demo中爲了其他界面可以使用下載的離線地圖,使用默認位置存儲,屏蔽了自定義設置
- MapsInitializer.sdcardDir = getSdCacheDir(this);
- mapView = (MapView) findViewById(R.id.map);
- mapView.onCreate(bundle);// 此方法必須重寫
- init();
- searchRouteResult(startPoint, endPoint);
- }
- /**
- * 初始化AMap對象
- */
- private void init() {
- if (aMap == null) {
- aMap = mapView.getMap();
- registerListener();
- }
- routeSearch = new RouteSearch(this);
- routeSearch.setRouteSearchListener(this);
- }
- /**
- * 響應地理編碼
- */
- public void getLatlon(final String name) {
- GeocodeQuery query = new GeocodeQuery(name, “029”);// 第一個參數表示地址,第二個參數表示查詢城市,中文或者中文全拼,citycode、adcode,
- geocoderSearch.getFromLocationNameAsyn(query);// 設置同步地理編碼請求
- }
- /**
- * 響應逆地理編碼
- */
- public void getAddress(final LatLonPoint latLonPoint) {
- RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一個參數表示一個Latlng,第二參數表示範圍多少米,第三個參數表示是火系座標系還是GPS原生座標系
- geocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求
- }
- /**
- * 地理編碼查詢回調
- */
- @Override
- public void onGeocodeSearched(GeocodeResult result, int rCode) {
- if (rCode == 0) {
- if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) {
- GeocodeAddress address = result.getGeocodeAddressList().get(0);
- address.getLatLonPoint();
- // if (flag == 0) {
- // start_msg = address.getLatLonPoint();
- // System.out.println(“========start_msg======:”+start_msg);
- // } else {
- // end_msg = address.getLatLonPoint();
- // System.out.println(“=======end_msg=======:”+end_msg);
- // }
- //
- // if (start_msg != null && end_msg != null) {
- // searchRouteResult(start_msg, end_msg);
- // }
- addressName = “經緯度值:” + address.getLatLonPoint() + ”\n位置描述:” + address.getFormatAddress();
- ToastUtil.show(TraBanCheLineActivity.this, start_msg + ”,” + end_msg);
- } else {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
- }
- } else if (rCode == 27) {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
- } else if (rCode == 32) {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
- } else {
- ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
- }
- }
- /**
- * 逆地理編碼回調
- */
- @Override
- public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
- if (rCode == 0) {
- if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {
- addressName = result.getRegeocodeAddress().getFormatAddress() + ”附近”;
- ToastUtil.show(TraBanCheLineActivity.this, addressName);
- } else {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
- }
- } else if (rCode == 27) {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
- } else if (rCode == 32) {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
- } else {
- ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
- }
- }
- @Override
- public void onInfoWindowClick(Marker marker) {
- }
- @Override
- public boolean onMarkerClick(Marker marker) {
- if (marker.isInfoWindowShown()) {
- marker.hideInfoWindow();
- } else {
- marker.showInfoWindow();
- }
- return false;
- }
- @Override
- public void onMapClick(LatLng latng) {
- }
- @Override
- public View getInfoContents(Marker marker) {
- return null;
- }
- @Override
- public View getInfoWindow(Marker marker) {
- return null;
- }
- /**
- * 註冊監聽
- */
- private void registerListener() {
- aMap.setOnMapClickListener(TraBanCheLineActivity.this);
- aMap.setOnMarkerClickListener(TraBanCheLineActivity.this);
- aMap.setOnInfoWindowClickListener(TraBanCheLineActivity.this);
- aMap.setInfoWindowAdapter(TraBanCheLineActivity.this);
- }
- /**
- * 顯示進度框
- */
- private void showProgressDialog() {
- if (progDialog == null)
- progDialog = new ProgressDialog(this);
- progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
- progDialog.setIndeterminate(false);
- progDialog.setCancelable(true);
- progDialog.setMessage(“正在搜索”);
- progDialog.show();
- }
- /**
- * 隱藏進度框
- */
- private void dissmissProgressDialog() {
- if (progDialog != null) {
- progDialog.dismiss();
- }
- }
- /**
- * 開始搜索路徑規劃方案
- */
- public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {
- showProgressDialog();
- final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(startPoint, endPoint);
- // 駕車路徑規劃
- // 第一個參數表示路徑規劃的起點和終點,第二個參數表示駕車模式,第三個參數表示途經點,第四個參數表示避讓區域,第五個參數表示避讓道路
- DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, list_latLatLonPoints, null, ”“);
- routeSearch.calculateDriveRouteAsyn(query);// 異步路徑規劃駕車模式查詢
- }
- @Override
- public void onPoiItemDetailSearched(PoiItemDetail arg0, int arg1) {
- }
- /**
- * POI搜索結果回調
- */
- @Override
- public void onPoiSearched(PoiResult result, int rCode) {
- }
- /**
- * 駕車結果回調
- */
- @Override
- public void onDriveRouteSearched(DriveRouteResult result, int rCode) {
- dissmissProgressDialog();
- if (rCode == 0) {
- if (result != null && result.getPaths() != null && result.getPaths().size() > 0) {
- driveRouteResult = result;
- DrivePath drivePath = driveRouteResult.getPaths().get(0);
- aMap.clear();// 清理地圖上的所有覆蓋物
- DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(this, aMap, drivePath, driveRouteResult.getStartPos(),
- driveRouteResult.getTargetPos());
- drivingRouteOverlay.removeFromMap();
- drivingRouteOverlay.addToMap();
- drivingRouteOverlay.zoomToSpan();
- } else {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
- }
- } else if (rCode == 27) {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
- } else if (rCode == 32) {
- ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
- } else {
- ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
- }
- }
- /**
- * 公交路線查詢回調
- */
- @Override
- public void onBusRouteSearched(BusRouteResult result, int rCode) {
- }
- /**
- * 步行路線結果回調
- */
- @Override
- public void onWalkRouteSearched(WalkRouteResult result, int rCode) {
- }
- public String getSdCacheDir(Context context) {
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
- java.io.File fExternalStorageDirectory = Environment.getExternalStorageDirectory();
- java.io.File autonaviDir = new java.io.File(fExternalStorageDirectory, “amapsdk”);
- boolean result = false;
- if (!autonaviDir.exists()) {
- result = autonaviDir.mkdir();
- }
- java.io.File minimapDir = new java.io.File(autonaviDir, “offlineMap”);
- if (!minimapDir.exists()) {
- result = minimapDir.mkdir();
- }
- return minimapDir.toString() + ”/”;
- } else {
- return ”“;
- }
- }
- @Override
- public void initWidget() {
- titleTv = (TextView) findViewById(R.id.titleText);
- titleTv.setText(“班車線路”);
- }
- @Override
- public void widgetClick(View v) {
- // TODO Auto-generated method stub
- }
- }
package com.bm.futuretechcity;
import java.util.ArrayList;
import java.util.List;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.amap.api.maps.AMap;
import com.amap.api.maps.AMap.InfoWindowAdapter;
import com.amap.api.maps.AMap.OnInfoWindowClickListener;
import com.amap.api.maps.AMap.OnMapClickListener;
import com.amap.api.maps.AMap.OnMarkerClickListener;
import com.amap.api.maps.MapView;
import com.amap.api.maps.MapsInitializer;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.overlay.DrivingRouteOverlay;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeAddress;
import com.amap.api.services.geocoder.GeocodeQuery;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.GeocodeSearch.OnGeocodeSearchListener;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;
import com.amap.api.services.poisearch.PoiItemDetail;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.RouteSearch.DriveRouteQuery;
import com.amap.api.services.route.RouteSearch.OnRouteSearchListener;
import com.amap.api.services.route.WalkRouteResult;
import com.bm.futuretechcity.adapter.ShowBanCheLineAdapter;
import com.bm.futuretechcity.base.BaseActivity;
import com.bm.futuretechcity.bean.ShowBanCheMessage;
import com.bm.futuretechcity.utils.ToastUtil;
import com.bm.futuretechcity.view.HorizontalListView;
/**
* 班車線路
*
* @author wangxuan
*
*/
public class TraBanCheLineActivity extends BaseActivity implements OnGeocodeSearchListener, OnClickListener, OnMarkerClickListener,
OnMapClickListener, OnInfoWindowClickListener, InfoWindowAdapter, OnPoiSearchListener, OnRouteSearchListener {
private ProgressDialog progDialog = null;
private GeocodeSearch geocoderSearch;
private String addressName;
private AMap aMap;
private MapView mapView;
private int drivingMode = RouteSearch.DrivingDefault;// 駕車默認模式
private DriveRouteResult driveRouteResult;// 駕車模式查詢結果
private int routeType = 1;// 1代表公交模式,2代表駕車模式,3代表步行模式
private LatLonPoint startPoint = new LatLonPoint(34.185642, 108.881905);
private LatLonPoint endPoint = new LatLonPoint(34.214397, 108.963448);
private LatLonPoint lat_one = new LatLonPoint(34.215748, 108.891869);
private LatLonPoint lat_two = new LatLonPoint(34.233685, 108.900635);
private LatLonPoint lat_three = new LatLonPoint(34.225311, 108.930992);
private LatLonPoint lat_four = new LatLonPoint(34.224136, 108.955284);
// 旺座現代城:34.215748,108.891869
// 亞美大廈:34.233685,108.900635
// 吉祥村:34.225311,108.930992
// 陝西歷史博物館:34.224136,108.955284
private String[] station_name = new String[] { "中興產業園", "旺座現代城", "亞美大廈", "吉祥村", "陝西歷史博物館", "大雁塔" };
private List<LatLonPoint> list_latLatLonPoints = new ArrayList<LatLonPoint>();
private RouteSearch routeSearch;
public ArrayAdapter<String> aAdapter;
private LatLonPoint start_msg;
private LatLonPoint end_msg;
private HorizontalListView show_station_name;
private List<ShowBanCheMessage> list_showBanCheMessages = new ArrayList<ShowBanCheMessage>();
/**
* 頁面標題
*/
private TextView titleTv;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_tra_ban_che_line);
initWidget();
show_station_name = (HorizontalListView) this.findViewById(R.id.show_station_name);
ShowBanCheMessage showBanCheMessage;
for(int i=0;i<station_name.length;i++){
showBanCheMessage = new ShowBanCheMessage();
showBanCheMessage.setStation_name(station_name[i]);
list_showBanCheMessages.add(showBanCheMessage);
}
ShowBanCheLineAdapter showStationNameAdapter = new ShowBanCheLineAdapter(TraBanCheLineActivity.this, list_showBanCheMessages);
show_station_name.setAdapter(showStationNameAdapter);
geocoderSearch = new GeocodeSearch(this);
geocoderSearch.setOnGeocodeSearchListener(this);
list_latLatLonPoints.add(lat_one);
list_latLatLonPoints.add(lat_two);
list_latLatLonPoints.add(lat_three);
list_latLatLonPoints.add(lat_four);
/*
* 設置離線地圖存儲目錄,在下載離線地圖或初始化地圖設置; 使用過程中可自行設置, 若自行設置了離線地圖存儲的路徑,
* 則需要在離線地圖下載和使用地圖頁面都進行路徑設置
*/
// Demo中爲了其他界面可以使用下載的離線地圖,使用默認位置存儲,屏蔽了自定義設置
MapsInitializer.sdcardDir = getSdCacheDir(this);
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(bundle);// 此方法必須重寫
init();
searchRouteResult(startPoint, endPoint);
}
/**
* 初始化AMap對象
*/
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
registerListener();
}
routeSearch = new RouteSearch(this);
routeSearch.setRouteSearchListener(this);
}
/**
* 響應地理編碼
*/
public void getLatlon(final String name) {
GeocodeQuery query = new GeocodeQuery(name, "029");// 第一個參數表示地址,第二個參數表示查詢城市,中文或者中文全拼,citycode、adcode,
geocoderSearch.getFromLocationNameAsyn(query);// 設置同步地理編碼請求
}
/**
* 響應逆地理編碼
*/
public void getAddress(final LatLonPoint latLonPoint) {
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);// 第一個參數表示一個Latlng,第二參數表示範圍多少米,第三個參數表示是火系座標系還是GPS原生座標系
geocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求
}
/**
* 地理編碼查詢回調
*/
@Override
public void onGeocodeSearched(GeocodeResult result, int rCode) {
if (rCode == 0) {
if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) {
GeocodeAddress address = result.getGeocodeAddressList().get(0);
address.getLatLonPoint();
// if (flag == 0) {
// start_msg = address.getLatLonPoint();
// System.out.println("========start_msg======:"+start_msg);
// } else {
// end_msg = address.getLatLonPoint();
// System.out.println("=======end_msg=======:"+end_msg);
// }
//
// if (start_msg != null && end_msg != null) {
// searchRouteResult(start_msg, end_msg);
// }
addressName = "經緯度值:" + address.getLatLonPoint() + "\n位置描述:" + address.getFormatAddress();
ToastUtil.show(TraBanCheLineActivity.this, start_msg + "," + end_msg);
} else {
ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
}
} else if (rCode == 27) {
ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
} else if (rCode == 32) {
ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
} else {
ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
}
}
/**
* 逆地理編碼回調
*/
@Override
public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
if (rCode == 0) {
if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {
addressName = result.getRegeocodeAddress().getFormatAddress() + "附近";
ToastUtil.show(TraBanCheLineActivity.this, addressName);
} else {
ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
}
} else if (rCode == 27) {
ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
} else if (rCode == 32) {
ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
} else {
ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
}
}
@Override
public void onInfoWindowClick(Marker marker) {
}
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.isInfoWindowShown()) {
marker.hideInfoWindow();
} else {
marker.showInfoWindow();
}
return false;
}
@Override
public void onMapClick(LatLng latng) {
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
@Override
public View getInfoWindow(Marker marker) {
return null;
}
/**
* 註冊監聽
*/
private void registerListener() {
aMap.setOnMapClickListener(TraBanCheLineActivity.this);
aMap.setOnMarkerClickListener(TraBanCheLineActivity.this);
aMap.setOnInfoWindowClickListener(TraBanCheLineActivity.this);
aMap.setInfoWindowAdapter(TraBanCheLineActivity.this);
}
/**
* 顯示進度框
*/
private void showProgressDialog() {
if (progDialog == null)
progDialog = new ProgressDialog(this);
progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progDialog.setIndeterminate(false);
progDialog.setCancelable(true);
progDialog.setMessage("正在搜索");
progDialog.show();
}
/**
* 隱藏進度框
*/
private void dissmissProgressDialog() {
if (progDialog != null) {
progDialog.dismiss();
}
}
/**
* 開始搜索路徑規劃方案
*/
public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {
showProgressDialog();
final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(startPoint, endPoint);
// 駕車路徑規劃
// 第一個參數表示路徑規劃的起點和終點,第二個參數表示駕車模式,第三個參數表示途經點,第四個參數表示避讓區域,第五個參數表示避讓道路
DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, list_latLatLonPoints, null, "");
routeSearch.calculateDriveRouteAsyn(query);// 異步路徑規劃駕車模式查詢
}
@Override
public void onPoiItemDetailSearched(PoiItemDetail arg0, int arg1) {
}
/**
* POI搜索結果回調
*/
@Override
public void onPoiSearched(PoiResult result, int rCode) {
}
/**
* 駕車結果回調
*/
@Override
public void onDriveRouteSearched(DriveRouteResult result, int rCode) {
dissmissProgressDialog();
if (rCode == 0) {
if (result != null && result.getPaths() != null && result.getPaths().size() > 0) {
driveRouteResult = result;
DrivePath drivePath = driveRouteResult.getPaths().get(0);
aMap.clear();// 清理地圖上的所有覆蓋物
DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(this, aMap, drivePath, driveRouteResult.getStartPos(),
driveRouteResult.getTargetPos());
drivingRouteOverlay.removeFromMap();
drivingRouteOverlay.addToMap();
drivingRouteOverlay.zoomToSpan();
} else {
ToastUtil.show(TraBanCheLineActivity.this, R.string.no_result);
}
} else if (rCode == 27) {
ToastUtil.show(TraBanCheLineActivity.this, R.string.error_network);
} else if (rCode == 32) {
ToastUtil.show(TraBanCheLineActivity.this, R.string.error_key);
} else {
ToastUtil.show(TraBanCheLineActivity.this, getString(R.string.error_other) + rCode);
}
}
/**
* 公交路線查詢回調
*/
@Override
public void onBusRouteSearched(BusRouteResult result, int rCode) {
}
/**
* 步行路線結果回調
*/
@Override
public void onWalkRouteSearched(WalkRouteResult result, int rCode) {
}
public String getSdCacheDir(Context context) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
java.io.File fExternalStorageDirectory = Environment.getExternalStorageDirectory();
java.io.File autonaviDir = new java.io.File(fExternalStorageDirectory, "amapsdk");
boolean result = false;
if (!autonaviDir.exists()) {
result = autonaviDir.mkdir();
}
java.io.File minimapDir = new java.io.File(autonaviDir, "offlineMap");
if (!minimapDir.exists()) {
result = minimapDir.mkdir();
}
return minimapDir.toString() + "/";
} else {
return "";
}
}
@Override
public void initWidget() {
titleTv = (TextView) findViewById(R.id.titleText);
titleTv.setText("班車線路");
}
@Override
public void widgetClick(View v) {
// TODO Auto-generated method stub
}
}
說明:
// 第一個參數表示路徑規劃的起點和終點,第二個參數表示駕車模式,第三個參數表示途經點,第四個參數表示避讓區域,第五個參數表示避讓道路
- DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, list_latLatLonPoints, null, ”“);
DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, list_latLatLonPoints, null, "");
這裏的list_latLatLonPoints就是第三個經過的站點的經緯度數據集合,只要把這個傳遞進去就可以按指定的路線進行規劃了!
四、運行效果
五、有什麼問題可以加
QQ羣:261742462