天天看點

高德api 實作定位 marker 路線規劃

package com.example.gdmap;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

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.OnMapClickListener;
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.CircleOptions;
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.maps.overlay.BusRouteOverlay;
import com.amap.api.maps.overlay.DrivingRouteOverlay;
import com.amap.api.maps.overlay.WalkRouteOverlay;
import com.amap.api.navi.AMapNavi;
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.route.BusPath;
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.RouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.RouteSearch.BusRouteQuery;
import com.amap.api.services.route.RouteSearch.DriveRouteQuery;
import com.amap.api.services.route.RouteSearch.FromAndTo;
import com.amap.api.services.route.RouteSearch.OnRouteSearchListener;
import com.amap.api.services.route.RouteSearch.WalkRouteQuery;
import com.amap.api.services.route.WalkPath;
import com.amap.api.services.route.WalkRouteResult;


import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity implements OnMapClickListener,
        AMap.OnInfoWindowClickListener,AMap.InfoWindowAdapter,AMap.OnMarkerClickListener,PoiSearch.OnPoiSearchListener, LocationSource, AMapLocationListener, OnRouteSearchListener {
    private MapView mapView;
    private AMap mAMap;
    private PoiResult poiResult;//the result of the poi
    private int currentPage = ;//the page start with 0
    private PoiSearch.Query query;//poi query
    private Marker detailMarker;
    private Marker mlastMarker;
    private PoiSearch poiSearch;
    private myPoiOverlay poiOverlay;//poi圖層
    private List<PoiItem> poiItems;//poi資料
    private String city;
    private RelativeLayout mPoiDetail;
    private TextView mPoiName,mPoiAddress;
    private Button walkBtn;
    private Button busBtn;
    private Button driveBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.poi_around_search);
//        基本操作
        mapView = (MapView)findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        //
        init();

    }
//AMap對象的初始化
    private void init(){
        if(mAMap == null){
            mAMap = mapView.getMap();
//            AMap對象的監事件
            mAMap.setLocationSource( MainActivity.this);//設定定位監聽
            mAMap.setMyLocationEnabled(true);//設定顯示定位層,并可以出發定位
            mAMap.getUiSettings().setMyLocationButtonEnabled(true);//設定顯示定位按  鈕
            mAMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);//設定定位類型

            mAMap.setOnMapClickListener(this);
            mAMap.setOnMarkerClickListener(this);
            mAMap.setOnInfoWindowClickListener(this);
            mAMap.setInfoWindowAdapter(this);

            routeSearch = new RouteSearch(this);//初始化routeSearch 對象
            routeSearch.setRouteSearchListener(this);//設定資料回調監聽器    
        }
        setup();

       doSearchQuery();
//        顯示攝像頭的大小
       // mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lp.getLatitude(),lp.getLongitude()),14));
    }

    private void setup(){

        mPoiDetail = (RelativeLayout)findViewById(R.id.poi_detail);
        mPoiDetail.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

            }
        });
        mPoiName =(TextView)findViewById(R.id.poi_name);
        mPoiAddress = (TextView)findViewById(R.id.poi_address);
        walkBtn=(Button) findViewById(R.id.walk);
        driveBtn=(Button) findViewById(R.id.drive);
        busBtn=(Button) findViewById(R.id.bus);
        driveBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if(wro!=null){
                    wro.removeFromMap();
                }
                if(bro!=null){
                    bro.removeFromMap();
                }
                if(dro!=null){
                    dro.removeFromMap();
                }
                if(detailMarker!=null){
                    pi=(PoiItem) detailMarker.getObject();
                    ll=new LatLonPoint(mLocationClient.getLastKnownLocation().getLatitude(), mLocationClient.getLastKnownLocation().getLongitude());
                    FromAndTo ft=new FromAndTo(ll,pi.getLatLonPoint());

                    DriveRouteQuery query = new DriveRouteQuery(ft, RouteSearch.DrivingDefault,null,null,null);//初始化query對象,fromAndTo是包含起終點資訊,walkMode是不行路徑規劃的模式
                    routeSearch.calculateDriveRouteAsyn(query);//開始算路);
                    Toast.makeText(getApplicationContext(), "query route", Toast.LENGTH_LONG).show();
                }
            }
        });
        walkBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Toast.makeText(getApplicationContext(), "button listener", Toast.LENGTH_LONG).show();
                if(wro!=null){
                    wro.removeFromMap();
                }
                if(bro!=null){
                    bro.removeFromMap();
                }
                if(dro!=null){
                    dro.removeFromMap();
                }
                   QueryRoute();

            }
        });
        busBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "button listener", Toast.LENGTH_LONG).show();
                if(bro!=null){
                    bro.removeFromMap();
                }
                if(wro!=null){
                    wro.removeFromMap();
                }
                if(dro!=null){
                    dro.removeFromMap();
                }
                if(detailMarker!=null){
                    pi=(PoiItem) detailMarker.getObject();
                    ll=new LatLonPoint(mLocationClient.getLastKnownLocation().getLatitude(), mLocationClient.getLastKnownLocation().getLongitude());
                    FromAndTo ft=new FromAndTo(ll,pi.getLatLonPoint());

                    BusRouteQuery query = new BusRouteQuery(ft, RouteSearch.BusDefault,mLocationClient.getLastKnownLocation().getCity(),);//初始化query對象,fromAndTo是包含起終點資訊,walkMode是不行路徑規劃的模式
                    routeSearch.calculateBusRouteAsyn(query);//開始算路);
                    Toast.makeText(getApplicationContext(), "query route", Toast.LENGTH_LONG).show();
                    }
              }


        });

       // mSearchText = (EditText)findViewById(R.id.input_edittext);

    }
    PoiItem pi;
    LatLonPoint ll;
    RouteSearch routeSearch;
//    begin poi serch
       public void QueryRoute() {
        if(detailMarker!=null){
        pi=(PoiItem) detailMarker.getObject();
        ll=new LatLonPoint(mLocationClient.getLastKnownLocation().getLatitude(), mLocationClient.getLastKnownLocation().getLongitude());
        FromAndTo ft=new FromAndTo(ll,pi.getLatLonPoint());
        WalkRouteQuery query = new WalkRouteQuery(ft, RouteSearch.WalkDefault);//初始化query對象,fromAndTo是包含起終點資訊,walkMode是不行路徑規劃的模式
        routeSearch.calculateWalkRouteAsyn(query);//開始算路);
        Toast.makeText(getApplicationContext(), "query route", Toast.LENGTH_LONG).show();
        }
    }
    protected void doSearchQuery(){
        //Trim() 函數的功能是去掉首尾空格
       // keyWord = mSearchText.getText().toString().trim();
        Toast.makeText(getApplicationContext(),city, Toast.LENGTH_LONG).show();
        currentPage = ;
        // 第一個參數表示搜尋字元串,第二個參數表示poi搜尋類型,第三個參數表示poi搜尋區域(空字元串代表全國)
        query = new PoiSearch.Query("醫院","醫療保健服務",mLocationClient.getLastKnownLocation().getCity());

        query.setPageSize();//setting how mang itmes to return;
        query.setPageNum(currentPage);//setup query the first page;

        //if(lp!=null){
            poiSearch = new PoiSearch(this,query);
            poiSearch.setOnPoiSearchListener(this);
            // 設定搜尋區域為以lp點為圓心,其周圍5000米範圍
            //poiSearch.setBound(new PoiSearch.SearchBound(lp,5000,true));
            poiSearch.searchPOIAsyn();//asyn search
        //}
    }
    @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){

    }
//    搜尋成功時的回調
    @Override
    public void onPoiSearched(PoiResult result, int rcode){
        if(rcode ==){
//            檢測搜尋結果
            if(result!=null && result.getQuery()!=null){
//                是否是同一條
                if(result.getQuery().equals(query)){
                    poiResult = result;
                    poiItems = poiResult.getPois();

//                   擷取poitem資料
                    List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();
                    if(poiItems !=null && poiItems.size()>) {
                        //清楚POI資訊
                        whetherToShowDetailInfo(false);
//                        并還原點選marker樣式
                        if (mlastMarker != null) {
                            resetlastmarker();
                        }
//                        清除之前的結果marker樣式
                        if (poiOverlay != null) {
                            poiOverlay.removeFromMap();
                        }
//                        新的marker
                        mAMap.clear();
                        poiOverlay = new myPoiOverlay(mAMap, poiItems);

                        poiOverlay.addToMap();
                        poiOverlay.zoomToSpan();

                       /** mAMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f)
                                .icon(BitmapDescriptorFactory
                                        .defaultMarker())
                                //.position(new LatLng(lp.getLatitude(), lp.getLongitude()))
                                );
//在地圖上顯示搜尋範圍圈
                       /** mAMap.addCircle(new CircleOptions().center(new LatLng(lp.getLatitude(), lp.getLongitude())).radius(5000)
                                .strokeColor(Color.BLUE)
                                .fillColor(Color.argb(50, 1, 1, 1))
                                .strokeWidth(2));**/

                    }else if (suggestionCities !=null && suggestionCities.size()>){
                        showSuggestCity(suggestionCities);
                    } else {

                    }
                }
            }else {

            }
        }
    }


    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.defaultMarker());
                setPoiItemDisplayContent(mCurrentPoi);
            } catch (Exception e) {

            }
        } else {
            whetherToShowDetailInfo(false);
            resetlastmarker();
        }
        return true;
    }
//    将之前點選的marker還原為原來的狀态
    private void resetlastmarker() {
        int index = poiOverlay.getPoiIndex(mlastMarker);
//        10個以内的marker顯示圖示
        if(index<){
            mlastMarker.setIcon(BitmapDescriptorFactory
                    .defaultMarker());
        }else{
//            大于10個後的marker顯示圖示資訊
            mlastMarker.setIcon(BitmapDescriptorFactory.defaultMarker());

        }
        mlastMarker = null;
    }

    private void setPoiItemDisplayContent(final PoiItem mCurrentPoi){
        mPoiName.setText(mCurrentPoi.getTitle());
        mPoiAddress.setText(mCurrentPoi.getSnippet());
    }
    @Override
    public View getInfoContents(Marker arg0){
        return null;
    }
    @Override
    public View getInfoWindow(Marker arg0){
        return null;
    }
    @Override
    public void onInfoWindowClick(Marker arg0){

    }

   // @Override
   /** public void onClick(View v){
        switch (v.getId()) {
            case R.id.btn_search:
            doSearchQuery("4");
            break;
            default:
                break;
        }
    }**/



    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();
        }
    }

    private void showSuggestCity(List<SuggestionCity> cities){
        String infomation = "推薦城市\n";
        for(int i = ;i<cities.size();i++){
            infomation += "城市名稱:" + cities.get(i).getCityName() + "城市區号:" + cities.get(i).getCityCode() + "城市編碼:" + cities.get(i).getAdCode() + "\n";
        }

    }
//myPoiOverlay類,該類下面有多個方法
    private class myPoiOverlay{
        private AMap mamap;
        private List<PoiItem> mPois;
        private ArrayList<Marker> mPoiMarks = new ArrayList<Marker>();
//    構造函數,傳進來的是amap對象和查詢到的結果itmes  mPois
        public myPoiOverlay(AMap amap,List<PoiItem>pois){
            mamap = amap;
            mPois = pois;
        }

//增加Maker到地圖中
    public void addToMap(){
        for(int i=;i<mPois.size();i++){
            Marker marker = mamap.addMarker(getMarkerOptions(i));
            PoiItem item = mPois.get(i);
            marker.setObject(item);
            mPoiMarks.add(marker);
        }
    }
//移除所有的marker
    public void removeFromMap(){
        for(Marker mark: mPoiMarks){
            mark.remove();
        }
    }
//移動鏡頭到目前的視角
    public void zoomToSpan(){
        if(mPois !=null && mPois.size()>){
            if(mamap ==null) return;
            LatLngBounds bounds = getLatLngBounds();
//            瞬間移動到目标位置
            mamap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,));
        }
    }

    private LatLngBounds getLatLngBounds(){
        LatLngBounds.Builder b = LatLngBounds.builder();
        for(int i=;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();
    }
//擷取位置,第幾個index就第幾個poi
    public int getPoiIndex(Marker marker){
        for(int i=;i<mPoiMarks.size();i++){
            if(mPoiMarks.get(i).equals(marker)){
                return i;
            }
        }
        return -;
    }

    public PoiItem getPoiItem(int index) {
        if (index <  || index >= mPois.size()) {
            return null;
        }
        return mPois.get(index);
    }

    protected BitmapDescriptor getBitmapDescriptor(int arg0){
        if(arg0<){
            BitmapDescriptor icon = BitmapDescriptorFactory.defaultMarker();
            return icon;
        }else {
            BitmapDescriptor icon = BitmapDescriptorFactory.defaultMarker();
            return icon;
        }
    }
    }
OnLocationChangedListener olcl;
AMapLocationClient mLocationClient;
AMapLocationClientOption mLocationClientOption;
@Override

public void activate(OnLocationChangedListener onLocationChangedListener) {
    olcl=onLocationChangedListener ;
    if(mLocationClient==null){
        Toast.makeText(getApplicationContext(), "activate", Toast.LENGTH_LONG).show();
        mLocationClient=new AMapLocationClient(MainActivity.this);
        mLocationClientOption=new AMapLocationClientOption();
        mLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//設定定位模式為 高精度
        mLocationClientOption.setInterval();
        mLocationClientOption.setWifiActiveScan(true);
        mLocationClient.setLocationOption(mLocationClientOption);//設定配置
        mLocationClient.setLocationListener(this);//設定位置變化監聽
        mLocationClient.startLocation();
    }

}
@Override
public void deactivate() {
    // TODO Auto-generated method stub

}
@Override
public void onLocationChanged(AMapLocation amapLocation) {
    // TODO Auto-generated method stub
    if(olcl==null) Toast.makeText(getApplicationContext(), "olcl==null", Toast.LENGTH_LONG).show();
    if(amapLocation != null
         && olcl!=null){
         olcl.onLocationChanged(amapLocation);
         city=amapLocation.getCity();
        // lp.setLatitude( amapLocation.getLatitude());  
        // lp.setLatitude(amapLocation.getLongitude());
        // if(mLocationClient.getLastKnownLocation().getCity()!=city) doSearchQuery(city);
        /** locationMarker = mAMap.addMarker(new MarkerOptions().anchor(0.5f,0.5f).icon(BitmapDescriptorFactory
                 .defaultMarker()).position(new LatLng(amapLocation.getLatitude(),amapLocation.getLongitude())));
         locationMarker.showInfoWindow();**/

        // Toast.makeText(getApplicationContext(), "警衛度 " +amapLocation.getLatitude()+" "+amapLocation.getLongitude(), Toast.LENGTH_LONG).show();


    }else {
        String errText = "定位失敗," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();

    }

}
BusRouteOverlay bro;
@Override
public void onBusRouteSearched(BusRouteResult brr, int arg1) {
    // TODO Auto-generated method stub
    List<BusPath> bp=brr.getPaths();
    BusPath buspath=bp.iterator().next();
    bro=new BusRouteOverlay(getApplicationContext(), mAMap, buspath, ll, pi.getLatLonPoint());
    bro.setNodeIconVisibility(true);
    bro.removeFromMap();
    bro.addToMap();
    bro.zoomToSpan();
}
DrivingRouteOverlay dro;
@Override
public void onDriveRouteSearched(DriveRouteResult drr, int arg1) {
    List<DrivePath> bp=drr.getPaths();
    DrivePath buspath=bp.iterator().next();
    dro=new DrivingRouteOverlay(getApplicationContext(), mAMap, buspath, ll, pi.getLatLonPoint());
    dro.setNodeIconVisibility(true);
    dro.removeFromMap();
    dro.addToMap();
    dro.zoomToSpan();

}
WalkRouteOverlay wro;
@Override
public void onWalkRouteSearched(WalkRouteResult walkRoute, int arg1) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(), "onWalkRouteSearched", Toast.LENGTH_LONG).show();
    List<WalkPath> wp=walkRoute.getPaths();
    WalkPath walkpath=wp.iterator().next();
    wro=new WalkRouteOverlay(getApplicationContext(), mAMap,walkpath ,ll , pi.getLatLonPoint());
    wro.setNodeIconVisibility(false);
    wro.removeFromMap();
    wro.addToMap();
    wro.zoomToSpan();

}

}