1. 程式人生 > >高德地圖之周邊搜尋及兩點間距離計算(Poi的使用)

高德地圖之周邊搜尋及兩點間距離計算(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;
}

}