高德地圖之周邊搜尋及兩點間距離計算(Poi的使用)
最近比較閒,所以就順便研究高德地圖,原因是之前基本上都用的百度地圖,但是百度地圖的程式碼太多了,兩字,很煩。
先來個效果圖:
藍色的marker就是點選的,藍色的圓圈是我當前位置。
apk下載地址:http://download.csdn.net/detail/hedong_77/9731739
一些基本操作這裡就不多說了,自己去看官方文件,我們這裡說一下週邊搜尋和POI計算距離。
首先定位一下自己當前位置,因為我要拿到當前的位置的經緯度,後面有用:
/**
* 設定一些amap的屬性
*/
private void setUpLocation() {
mAMap.setLocationSource(this );// 設定定位監聽
mAMap.getUiSettings().setMyLocationButtonEnabled(true);// 設定預設定位按鈕是否顯示
mAMap.setMyLocationEnabled(true);// 設定為true表示顯示定位層並可觸發定位,false表示隱藏定位層並不可觸發定位,預設是false
// 設定定位的型別為定位模式 ,可以由定位、跟隨或地圖根據面向方向旋轉幾種
mAMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
}
/**
* 定位成功後回撥函式
*/
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null && amapLocation != null) {
if (amapLocation != null
&& amapLocation.getErrorCode() == 0) {
//定位成功回撥資訊,設定相關訊息
amapLocation.getLocationType();//獲取當前定位結果來源,如網路定位結果,詳見定位型別表
myLat = amapLocation.getLatitude();//獲取緯度
myLongt = amapLocation.getLongitude();//獲取經度
amapLocation.getAccuracy();//獲取精度資訊
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);//定位時間
amapLocation.getAddress();//地址,如果option中設定isNeedAddress為false,則沒有此結果,網路定位結果中會有地址資訊,GPS定位不返回地址資訊。
amapLocation.getCountry();//國家資訊
amapLocation.getProvince();//省資訊
amapLocation.getCity();//城市資訊
amapLocation.getDistrict();//城區資訊
amapLocation.getStreet();//街道資訊
amapLocation.getStreetNum();//街道門牌號資訊
amapLocation.getCityCode();//城市編碼
amapLocation.getAdCode();//地區編碼
TextView textView = (TextView) findViewById(R.id.city_detail);
textView.setText(amapLocation.getCity() + "=" + amapLocation.getDistrict() + "==" + amapLocation.getStreetNum());
mListener.onLocationChanged(amapLocation);// 顯示系統小藍點
} else {
String errText = "定位失敗," + amapLocation.getErrorCode() + ": " + amapLocation.getErrorInfo();
Log.e("AmapErr", errText);
}
}
}
/**
* 啟用定位
*/
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//設定定位監聽
mlocationClient.setLocationListener(this);
//設定為高精度定位模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//設定定位引數
mlocationClient.setLocationOption(mLocationOption);
// 此方法為每隔固定時間會發起一次定位請求,為了減少電量消耗或網路流量消耗,
// 注意設定合適的定位時間的間隔(最小間隔支援為2000ms),並且在合適時間呼叫stopLocation()方法來取消定位請求
// 在定位結束後,在合適的生命週期呼叫onDestroy()方法
// 在單次定位情況下,定位無論成功與否,都無需呼叫stopLocation()方法移除請求,定位sdk內部會移除
mlocationClient.startLocation();
}
}
/**
* 停止定位
*/
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
可以看到,定位成功之後我們可以拿到任何想要的資料。
一步步來,先初始化一下資料,
/**
* 初始化AMap物件
*/
private void init() {
if (mAMap == null) {
mAMap = mapview.getMap();
mAMap.setOnMapClickListener(this);
mAMap.setOnMarkerClickListener(this);
mAMap.setOnInfoWindowClickListener(this);
mAMap.setInfoWindowAdapter(this);
TextView searchButton = (TextView) findViewById(R.id.btn_search);
searchButton.setOnClickListener(this);
setUpLocation();
locationMarker = mAMap.addMarker(new MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.point4)))
.position(new LatLng(myLat, myLongt)));
locationMarker.showInfoWindow();
}
setup();
mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(myLat, myLongt), 14));
tvDistance = (TextView) findViewById(R.id.poi_info);
}
我們可以根據自己想要的去搜索
/**
* 開始進行poi搜尋
*/
protected void doSearchQuery() {
keyWord = mSearchText.getText().toString().trim();
currentPage = 0;
query = new PoiSearch.Query(keyWord, "", "");// 第一個引數表示搜尋字串,第二個引數表示poi搜尋型別,第三個引數表示poi搜尋區域(空字串代表全國)
query.setPageSize(20);// 設定每頁最多返回多少條poiitem
query.setPageNum(currentPage);// 設定查第一頁
LatLonPoint lp = new LatLonPoint(myLat, myLongt);
if (lp != null) {
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
poiSearch.setBound(new SearchBound(lp, 10000, true));//
// 設定搜尋區域為以lp點為圓心,其周圍10000米範圍
poiSearch.searchPOIAsyn();// 非同步搜尋
}
}```
搜尋的結果會在 public void onPoiSearched(PoiResult result, int rcode) 裡面來做,如果rcode==1000那就是搜尋成功了
@Override
public void onPoiSearched(PoiResult result, int rcode) {
if (rcode == AMapException.CODE_AMAP_SUCCESS) {
if (result != null && result.getQuery() != null) {// 搜尋poi的結果
if (result.getQuery().equals(query)) {// 是否是同一條
poiResult = result;
poiItems = poiResult.getPois();// 取得第一頁的poiitem資料,頁數從數字0開始
List<SuggestionCity> suggestionCities = poiResult
.getSearchSuggestionCitys();// 當搜尋不到poiitem資料時,會返回含有搜尋關鍵字的城市資訊
if (poiItems != null && poiItems.size() > 0) {
//清除POI資訊顯示
whetherToShowDetailInfo(false);
//並還原點選marker樣式
if (mlastMarker != null) {
resetlastmarker();
}
//清理之前搜尋結果的marker
if (poiOverlay != null) {
poiOverlay.removeFromMap();
}
mAMap.clear();
poiOverlay = new myPoiOverlay(mAMap, poiItems);
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
mAMap.addMarker(new MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(), R.mipmap.point4)))
.position(new LatLng(myLat, myLongt)));
// mAMap.addCircle(new CircleOptions()
// .center(new LatLng(myLat, myLongt)).radius(5000)
// .strokeColor(Color.BLUE)
// .fillColor(Color.argb(50, 1, 1, 1))
// .strokeWidth(2));
} else if (suggestionCities != null
&& suggestionCities.size() > 0) {
showSuggestCity(suggestionCities);
} else {
ToastUtil.show(PoiAroundSearchActivity.this,
R.string.no_result);
}
}
} else {
ToastUtil
.show(PoiAroundSearchActivity.this, R.string.no_result);
}
} else {
ToastUtil.showerror(this.getApplicationContext(), rcode);
}
}
接下來要做的就是根據搜尋到的marker,當用戶點選這個marker的時候,就計算出使用者當前點選的marker到使用者之間的距離。
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.getObject() != null) {
whetherToShowDetailInfo(true);
try {
PoiItem mCurrentPoi = (PoiItem) marker.getObject();
if (mlastMarker == null) {
mlastMarker = marker;
} else {
// 將之前被點選的marker置為原來的狀態
resetlastmarker();
mlastMarker = marker;
}
detailMarker = marker;
detailMarker.setIcon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(),
R.mipmap.poi_marker_pressed)));
setPoiItemDisplayContent(mCurrentPoi);
} catch (Exception e) {
// TODO: handle exception
}
} else {
whetherToShowDetailInfo(false);
resetlastmarker();
}
//我的當前位置與點選的marker的距離
LatLng latlngA = new LatLng(myLat, myLongt);
distance = AMapUtils.calculateLineDistance(latlngA, marker.getPosition());
tvDistance.setText("兩點間距離為:" + distance + "m");
return true;
}
這裡我只是顯示十個marker。
怎麼把marker新增到地圖裡面呢,我們自己定義一個類吧,
/**
* 自定義PoiOverlay
*/
private class myPoiOverlay {
private AMap mamap;
private List<PoiItem> mPois;
private ArrayList<Marker> mPoiMarks = new ArrayList<Marker>();
public myPoiOverlay(AMap amap, List<PoiItem> pois) {
mamap = amap;
mPois = pois;
}
/**
* 新增Marker到地圖中。
*
* @since V2.1.0
*/
public void addToMap() {
for (int i = 0; i < mPois.size(); i++) {
Marker marker = mamap.addMarker(getMarkerOptions(i));
PoiItem item = mPois.get(i);
marker.setObject(item);
mPoiMarks.add(marker);
}
}
/**
* 去掉PoiOverlay上所有的Marker。
*
* @since V2.1.0
*/
public void removeFromMap() {
for (Marker mark : mPoiMarks) {
mark.remove();
}
}
/**
* 移動鏡頭到當前的視角。
*
* @since V2.1.0
*/
public void zoomToSpan() {
if (mPois != null && mPois.size() > 0) {
if (mamap == null)
return;
LatLngBounds bounds = getLatLngBounds();
mamap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));
}
}
private LatLngBounds getLatLngBounds() {
LatLngBounds.Builder b = LatLngBounds.builder();
for (int i = 0; i < mPois.size(); i++) {
b.include(new LatLng(mPois.get(i).getLatLonPoint().getLatitude(),
mPois.get(i).getLatLonPoint().getLongitude()));
}
return b.build();
}
private MarkerOptions getMarkerOptions(int index) {
return new MarkerOptions()
.position(
new LatLng(mPois.get(index).getLatLonPoint()
.getLatitude(), mPois.get(index)
.getLatLonPoint().getLongitude()))
.title(getTitle(index)).snippet(getSnippet(index))
.icon(getBitmapDescriptor(index));
}
protected String getTitle(int index) {
return mPois.get(index).getTitle();
}
protected String getSnippet(int index) {
return mPois.get(index).getSnippet();
}
/**
* 從marker中得到poi在list的位置。
*
* @param marker 一個標記的物件。
* @return 返回該marker對應的poi在list的位置。
* @since V2.1.0
*/
public int getPoiIndex(Marker marker) {
for (int i = 0; i < mPoiMarks.size(); i++) {
if (mPoiMarks.get(i).equals(marker)) {
return i;
}
}
return -1;
}
/**
* 返回第index的poi的資訊。
*
* @param index 第幾個poi。
* @return poi的資訊。poi物件詳見搜尋服務模組的基礎核心包(com.amap.api.services.core)中的類 <strong><a href="../../../../../../Search/com/amap/api/services/core/PoiItem.html" title="com.amap.api.services.core中的類">PoiItem</a></strong>。
* @since V2.1.0
*/
public PoiItem getPoiItem(int index) {
if (index < 0 || index >= mPois.size()) {
return null;
}
return mPois.get(index);
}
protected BitmapDescriptor getBitmapDescriptor(int arg0) {
if (arg0 < 10) {
BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), markers[arg0]));
return icon;
} else {
BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.mipmap.marker_other_highlight));
return icon;
}
}
}
程式碼解釋很全面,應該看懂沒問題了。主要程式碼也就這麼多。
貼一個全面的類給大家參考:
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
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.AMapUtils;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;
import com.amap.api.services.poisearch.PoiSearch.SearchBound;
import com.example.donghe.maptest.utils.ToastUtil;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 周邊搜尋
*/
public class PoiAroundSearchActivity extends AppCompatActivity implements OnClickListener,
OnMapClickListener, OnInfoWindowClickListener, InfoWindowAdapter, OnMarkerClickListener,
OnPoiSearchListener, LocationSource,
AMapLocationListener {
private MapView mapview;
private AMap mAMap;
private PoiResult poiResult; // poi返回的結果
private int currentPage = 0;// 當前頁面,從0開始計數
private PoiSearch.Query query;// Poi查詢條件類
private Marker locationMarker; // 選擇的點
private Marker detailMarker;
private Marker mlastMarker;
private PoiSearch poiSearch;
private myPoiOverlay poiOverlay;// poi圖層
private List<PoiItem> poiItems;// poi資料
private RelativeLayout mPoiDetail;
private TextView mPoiName, mPoiAddress;
private String keyWord = "";
private EditText mSearchText;
private TextView tvDistance;
private float distance;
private Double myLat = 0.0, myLongt = 0.0;//我的當前位置的經緯度
//定位
private OnLocationChangedListener mListener;
private AMapLocationClient mlocationClient;
private AMapLocationClientOption mLocationOption;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.poiaroundsearch_activity);
mapview = (MapView) findViewById(R.id.mapView);
mapview.onCreate(savedInstanceState);
init();
}
/**
* 初始化AMap物件
*/
private void init() {
if (mAMap == null) {
mAMap = mapview.getMap();
mAMap.setOnMapClickListener(this);
mAMap.setOnMarkerClickListener(this);
mAMap.setOnInfoWindowClickListener(this);
mAMap.setInfoWindowAdapter(this);
TextView searchButton = (TextView) findViewById(R.id.btn_search);
searchButton.setOnClickListener(this);
setUpLocation();
locationMarker = mAMap.addMarker(new MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.point4)))
.position(new LatLng(myLat, myLongt)));
locationMarker.showInfoWindow();
}
setup();
mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(myLat, myLongt), 14));
tvDistance = (TextView) findViewById(R.id.poi_info);
}
private void setup() {
mPoiDetail = (RelativeLayout) findViewById(R.id.poi_detail);
mPoiDetail.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Intent intent = new Intent(PoiSearchActivity.this,
// SearchDetailActivity.class);
// intent.putExtra(“poiitem”, mPoi);
// startActivity(intent);
}
});
mPoiName = (TextView) findViewById(R.id.poi_name);
mPoiAddress = (TextView) findViewById(R.id.poi_address);
mSearchText = (EditText) findViewById(R.id.input_edittext);
}
/**
* 開始進行poi搜尋
*/
protected void doSearchQuery() {
keyWord = mSearchText.getText().toString().trim();
currentPage = 0;
query = new PoiSearch.Query(keyWord, "", "");// 第一個引數表示搜尋字串,第二個引數表示poi搜尋型別,第三個引數表示poi搜尋區域(空字串代表全國)
query.setPageSize(20);// 設定每頁最多返回多少條poiitem
query.setPageNum(currentPage);// 設定查第一頁
LatLonPoint lp = new LatLonPoint(myLat, myLongt);
if (lp != null) {
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
poiSearch.setBound(new SearchBound(lp, 10000, true));//
// 設定搜尋區域為以lp點為圓心,其周圍10000米範圍
poiSearch.searchPOIAsyn();// 非同步搜尋
}
}
/**
* 方法必須重寫
*/
@Override
protected void onResume() {
super.onResume();
mapview.onResume();
whetherToShowDetailInfo(false);
}
/**
* 方法必須重寫
*/
@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();
}
@Override
public void onPoiItemSearched(PoiItem arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPoiSearched(PoiResult result, int rcode) {
if (rcode == AMapException.CODE_AMAP_SUCCESS) {
if (result != null && result.getQuery() != null) {// 搜尋poi的結果
if (result.getQuery().equals(query)) {// 是否是同一條
poiResult = result;
poiItems = poiResult.getPois();// 取得第一頁的poiitem資料,頁數從數字0開始
List<SuggestionCity> suggestionCities = poiResult
.getSearchSuggestionCitys();// 當搜尋不到poiitem資料時,會返回含有搜尋關鍵字的城市資訊
if (poiItems != null && poiItems.size() > 0) {
//清除POI資訊顯示
whetherToShowDetailInfo(false);
//並還原點選marker樣式
if (mlastMarker != null) {
resetlastmarker();
}
//清理之前搜尋結果的marker
if (poiOverlay != null) {
poiOverlay.removeFromMap();
}
mAMap.clear();
poiOverlay = new myPoiOverlay(mAMap, poiItems);
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
mAMap.addMarker(new MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(), R.mipmap.point4)))
.position(new LatLng(myLat, myLongt)));
// mAMap.addCircle(new CircleOptions()
// .center(new LatLng(myLat, myLongt)).radius(5000)
// .strokeColor(Color.BLUE)
// .fillColor(Color.argb(50, 1, 1, 1))
// .strokeWidth(2));
} else if (suggestionCities != null
&& suggestionCities.size() > 0) {
showSuggestCity(suggestionCities);
} else {
ToastUtil.show(PoiAroundSearchActivity.this,
R.string.no_result);
}
}
} else {
ToastUtil
.show(PoiAroundSearchActivity.this, R.string.no_result);
}
} else {
ToastUtil.showerror(this.getApplicationContext(), rcode);
}
}
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.getObject() != null) {
whetherToShowDetailInfo(true);
try {
PoiItem mCurrentPoi = (PoiItem) marker.getObject();
if (mlastMarker == null) {
mlastMarker = marker;
} else {
// 將之前被點選的marker置為原來的狀態
resetlastmarker();
mlastMarker = marker;
}
detailMarker = marker;
detailMarker.setIcon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(),
R.mipmap.poi_marker_pressed)));
setPoiItemDisplayContent(mCurrentPoi);
} catch (Exception e) {
// TODO: handle exception
}
} else {
whetherToShowDetailInfo(false);
resetlastmarker();
}
//我的當前位置與點選的marker的距離
LatLng latlngA = new LatLng(myLat, myLongt);
distance = AMapUtils.calculateLineDistance(latlngA, marker.getPosition());
tvDistance.setText("兩點間距離為:" + distance + "m");
return true;
}
// 將之前被點選的marker置為原來的狀態
private void resetlastmarker() {
int index = poiOverlay.getPoiIndex(mlastMarker);
if (index < 10) {
mlastMarker.setIcon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(),
markers[index])));
} else {
mlastMarker.setIcon(BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.mipmap.marker_other_highlight)));
}
mlastMarker = null;
}
private void setPoiItemDisplayContent(final PoiItem mCurrentPoi) {
mPoiName.setText(mCurrentPoi.getTitle());
mPoiAddress.setText(mCurrentPoi.getSnippet() + mCurrentPoi.getDistance());
}
@Override
public View getInfoContents(Marker arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public View getInfoWindow(Marker arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onInfoWindowClick(Marker arg0) {
// TODO Auto-generated method stub
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_search:
doSearchQuery();
break;
default:
break;
}
}
private int[] markers = {R.mipmap.poi_marker_1,
R.mipmap.poi_marker_2,
R.mipmap.poi_marker_3,
R.mipmap.poi_marker_4,
R.mipmap.poi_marker_5,
R.mipmap.poi_marker_6,
R.mipmap.poi_marker_7,
R.mipmap.poi_marker_8,
R.mipmap.poi_marker_9,
R.mipmap.poi_marker_10
};
private void whetherToShowDetailInfo(boolean isToShow) {
if (isToShow) {
mPoiDetail.setVisibility(View.VISIBLE);
} else {
mPoiDetail.setVisibility(View.GONE);
}
}
@Override
public void onMapClick(LatLng arg0) {
whetherToShowDetailInfo(false);
if (mlastMarker != null) {
resetlastmarker();
}
}
/**
* poi沒有搜尋到資料,返回一些推薦城市的資訊
*/
private void showSuggestCity(List<SuggestionCity> cities) {
String infomation = "推薦城市\n";
for (int i = 0; i < cities.size(); i++) {
infomation += "城市名稱:" + cities.get(i).getCityName() + "城市區號:"
+ cities.get(i).getCityCode() + "城市編碼:"
+ cities.get(i).getAdCode() + "\n";
}
ToastUtil.show(this, infomation);
}
/**
* 自定義PoiOverlay
*/
private class myPoiOverlay {
private AMap mamap;
private List<PoiItem> mPois;
private ArrayList<Marker> mPoiMarks = new ArrayList<Marker>();
public myPoiOverlay(AMap amap, List<PoiItem> pois) {
mamap = amap;
mPois = pois;
}
/**
* 新增Marker到地圖中。
*
* @since V2.1.0
*/
public void addToMap() {
for (int i = 0; i < mPois.size(); i++) {
Marker marker = mamap.addMarker(getMarkerOptions(i));
PoiItem item = mPois.get(i);
marker.setObject(item);
mPoiMarks.add(marker);
}
}
/**
* 去掉PoiOverlay上所有的Marker。
*
* @since V2.1.0
*/
public void removeFromMap() {
for (Marker mark : mPoiMarks) {
mark.remove();
}
}
/**
* 移動鏡頭到當前的視角。
*
* @since V2.1.0
*/
public void zoomToSpan() {
if (mPois != null && mPois.size() > 0) {
if (mamap == null)
return;
LatLngBounds bounds = getLatLngBounds();
mamap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));
}
}
private LatLngBounds getLatLngBounds() {
LatLngBounds.Builder b = LatLngBounds.builder();
for (int i = 0; i < mPois.size(); i++) {
b.include(new LatLng(mPois.get(i).getLatLonPoint().getLatitude(),
mPois.get(i).getLatLonPoint().getLongitude()));
}
return b.build();
}
private MarkerOptions getMarkerOptions(int index) {
return new MarkerOptions()
.position(
new LatLng(mPois.get(index).getLatLonPoint()
.getLatitude(), mPois.get(index)
.getLatLonPoint().getLongitude()))
.title(getTitle(index)).snippet(getSnippet(index))
.icon(getBitmapDescriptor(index));
}
protected String getTitle(int index) {
return mPois.get(index).getTitle();
}
protected String getSnippet(int index) {
return mPois.get(index).getSnippet();
}
/**
* 從marker中得到poi在list的位置。
*
* @param marker 一個標記的物件。
* @return 返回該marker對應的poi在list的位置。
* @since V2.1.0
*/
public int getPoiIndex(Marker marker) {
for (int i = 0; i < mPoiMarks.size(); i++) {
if (mPoiMarks.get(i).equals(marker)) {
return i;
}
}
return -1;
}
/**
* 返回第index的poi的資訊。
*
* @param index 第幾個poi。
* @return poi的資訊。poi物件詳見搜尋服務模組的基礎核心包(com.amap.api.services.core)中的類 <strong><a href="../../../../../../Search/com/amap/api/services/core/PoiItem.html" title="com.amap.api.services.core中的類">PoiItem</a></strong>。
* @since V2.1.0
*/
public PoiItem getPoiItem(int index) {
if (index < 0 || index >= mPois.size()) {
return null;
}
return mPois.get(index);
}
protected BitmapDescriptor getBitmapDescriptor(int arg0) {
if (arg0 < 10) {
BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), markers[arg0]));
return icon;
} else {
BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.mipmap.marker_other_highlight));
return icon;
}
}
}
/**
* 設定一些amap的屬性
*/
private void setUpLocation() {
mAMap.setLocationSource(this);// 設定定位監聽
mAMap.getUiSettings().setMyLocationButtonEnabled(true);// 設定預設定位按鈕是否顯示
mAMap.setMyLocationEnabled(true);// 設定為true表示顯示定位層並可觸發定位,false表示隱藏定位層並不可觸發定位,預設是false
// 設定定位的型別為定位模式 ,可以由定位、跟隨或地圖根據面向方向旋轉幾種
mAMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
}
/**
* 定位成功後回撥函式
*/
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null && amapLocation != null) {
if (amapLocation != null
&& amapLocation.getErrorCode() == 0) {
//定位成功回撥資訊,設定相關訊息
amapLocation.getLocationType();//獲取當前定位結果來源,如網路定位結果,詳見定位型別表
myLat = amapLocation.getLatitude();//獲取緯度
myLongt = amapLocation.getLongitude();//獲取經度
amapLocation.getAccuracy();//獲取精度資訊
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);//定位時間
amapLocation.getAddress();//地址,如果option中設定isNeedAddress為false,則沒有此結果,網路定位結果中會有地址資訊,GPS定位不返回地址資訊。
amapLocation.getCountry();//國家資訊
amapLocation.getProvince();//省資訊
amapLocation.getCity();//城市資訊
amapLocation.getDistrict();//城區資訊
amapLocation.getStreet();//街道資訊
amapLocation.getStreetNum();//街道門牌號資訊
amapLocation.getCityCode();//城市編碼
amapLocation.getAdCode();//地區編碼
TextView textView = (TextView) findViewById(R.id.city_detail);
textView.setText(amapLocation.getCity() + "=" + amapLocation.getDistrict() + "==" + amapLocation.getStreetNum());
mListener.onLocationChanged(amapLocation);// 顯示系統小藍點
} else {
String errText = "定位失敗," + amapLocation.getErrorCode() + ": " + amapLocation.getErrorInfo();
Log.e("AmapErr", errText);
}
}
}
/**
* 啟用定位
*/
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//設定定位監聽
mlocationClient.setLocationListener(this);
//設定為高精度定位模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//設定定位引數
mlocationClient.setLocationOption(mLocationOption);
// 此方法為每隔固定時間會發起一次定位請求,為了減少電量消耗或網路流量消耗,
// 注意設定合適的定位時間的間隔(最小間隔支援為2000ms),並且在合適時間呼叫stopLocation()方法來取消定位請求
// 在定位結束後,在合適的生命週期呼叫onDestroy()方法
// 在單次定位情況下,定位無論成功與否,都無需呼叫stopLocation()方法移除請求,定位sdk內部會移除
mlocationClient.startLocation();
}
}
/**
* 停止定位
*/
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
}