码迷,mamicode.com
首页 > 移动开发 > 详细

android百度地图

时间:2015-11-06 11:22:28      阅读:506      评论:0      收藏:0      [点我收藏+]

标签:

package com.autobobo.keep.car.activity;

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

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

import com.autobobo.keep.car.R;
import com.autobobo.keep.car.common.KeepCarApplication;
import com.autobobo.keep.car.uitl.ScreenUtil;
import com.autobobo.keep.car.uitl.ToastUtil;
import com.autobobo.keep.car.view.MorePopWindow;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.overlayutil.OverlayManager;
import com.baidu.mapapi.search.core.CityInfo;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;

public class MapQueryActivity extends Activity implements
        OnGetPoiSearchResultListener, OnClickListener {

    private ImageButton back, setApp;
    private TextView head_title;
    private MapView mMapView;
    private BaiduMap mBaiduMap;
    private int type;
    private PoiSearch mPoiSearch = null;
    // 定位相关
    LocationClient mLocClient;
    public MyLocationListenner myListener = new MyLocationListenner();
    public boolean isFirstLoc = true;// 是否首次定位
    private BitmapDescriptor mCurrentMarker;
    private BitmapDescriptor poiMarker;
    private LocationMode mCurrentMode;
    private LatLng ll;
    private LatLng target;
    
    
    private MorePopWindow mPop;
    private MyPoiOverlay overlay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(1);
        setContentView(R.layout.activity_map_query);

        type = (Integer) getIntent().getExtras().get("position");

        initView();
    }

    private void setTopTitle(int type) {
        switch (type) {
        case 0:
            head_title.setText("加油站");
            break;
        case 1:
            head_title.setText("加气站");
            break;
        case 2:
            head_title.setText("停车场");
            break;
        default:
            break;
        }
    }

    private void initView() {
        mMapView = (MapView) findViewById(R.id.bd_service_gas);
        mBaiduMap = mMapView.getMap();
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(15).build()));
        //MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(14.0f);
        //mBaiduMap.setMapStatus(msu);
        mBaiduMap.setOnMarkerClickListener(overlay);
        
        head_title = (TextView) findViewById(R.id.head_title);
        back = (ImageButton) findViewById(R.id.head_button_01);
        setApp = (ImageButton) findViewById(R.id.head_button_02);
        //setApp.setVisibility(View.GONE);
        setApp.setImageResource(R.drawable.more);
        back.setImageResource(R.drawable.back);

        setTopTitle(type);
        
        back.setOnClickListener(this);
        setApp.setOnClickListener(this);
        baiduLocation();

        // 搜索
        mPoiSearch = PoiSearch.newInstance();

        mPoiSearch.setOnGetPoiSearchResultListener(this);
        
        OnMapStatusChangeListener statusListener = new OnMapStatusChangeListener() {  
            /**
            * 手势操作地图,设置地图状态等操作导致地图状态开始改变。
            * @param status 地图状态改变开始时的地图状态
            */  
            public void onMapStatusChangeStart(MapStatus status){  
                mBaiduMap.removeMarkerClickListener(overlay);
            }  
            /**
            * 地图状态变化中
            * @param status 当前地图状态
            */  
            public void onMapStatusChange(MapStatus status){  
                mBaiduMap.removeMarkerClickListener(overlay);
            }  
            /**
            * 地图状态改变结束
            * @param status 地图状态改变结束后的地图状态
            */  
            public void onMapStatusChangeFinish(MapStatus status){  
                if(overlay != null){
                    overlay.removeFromMap();
                }
                target = status.target;
                //MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(target);
                //mBaiduMap.animateMapStatus(update);
                searchPoiFromMap(type,target);
            }  
        };
        mBaiduMap.setOnMapStatusChangeListener(statusListener);
    }

    /**
     * 地图定位
     */
    public void baiduLocation() {

        // 隐藏缩放控件
        mMapView.showZoomControls(false);
        // 隐藏右下角的百度图标
        mMapView.removeViewAt(1);
        // 影藏比例尺
        mMapView.removeViewAt(2);
        // 开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        // 定位初始化
        mLocClient = new LocationClient(KeepCarApplication.getContext());
        mLocClient.registerLocationListener(myListener);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);// 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        // option.setScanSpan(1000);//不设置只定位一次,如果多次定位的情况下,在popwindow点击取消的时候需要点击两次
        option.setIsNeedAddress(true);

        mLocClient.setLocOption(option);
        mLocClient.start();

        poiMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);

        mCurrentMarker = BitmapDescriptorFactory
                .fromResource(R.drawable.icon_focus_marka);
        mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
                mCurrentMode, true, mCurrentMarker));

    }

    /**
     * 定位SDK监听函数
     */
    public class MyLocationListenner implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mMapView == null)
                return;
            MyLocationData locData = new MyLocationData.Builder()
                    // .accuracy(location.getRadius())//去掉精度圈
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();

            mBaiduMap.setMyLocationData(locData);
            ll = new LatLng(location.getLatitude(), location.getLongitude());
            if (isFirstLoc) {
                isFirstLoc = false;
                ll = new LatLng(location.getLatitude(), location.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                mBaiduMap.animateMapStatus(u);

            }
            mLocClient.stop();
            // 百度地图定位完成之后再调用显示兴趣点
            searchPoiFromMap(type,ll);
        }

        public void onReceivePoi(BDLocation poiLocation) {

        }
    }

    // 地图 搜索
    private void searchPoiFromMap(int type, LatLng llParams) {
        switch (type) {
        // 加油站
        case 0:
            
            mPoiSearch
                    .searchNearby(new PoiNearbySearchOption().pageCapacity(20)
                            .location(llParams).radius(10000).keyword("加油站"));
            break;
        // 加气站
        case 1:
            
            mPoiSearch
                    .searchNearby(new PoiNearbySearchOption().pageCapacity(20)
                            .location(llParams).radius(10000).keyword("加气站"));

            break;
        // 停车场
        case 2:
            
            mPoiSearch.searchNearby(new PoiNearbySearchOption()
                    .pageCapacity(20).location(llParams).radius(10000)
                    .keyword("?停车场"));

            break;
        }
    }

    public void onGetPoiResult(PoiResult result) {

        if (result == null
                || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
            Toast.makeText(getApplicationContext(), "未找到结果", Toast.LENGTH_LONG)
                    .show();
            return;
        }
        if (result.error == SearchResult.ERRORNO.NO_ERROR) {
            if(overlay != null){
                overlay.removeFromMap();
                overlay = null;
            }
            mBaiduMap.clear();
            overlay = new MyPoiOverlay(mBaiduMap);
            mBaiduMap.setOnMarkerClickListener(overlay);
            overlay.setData(result);
            overlay.addToMap();
            //overlay.zoomToSpan();

            return;
        }
        if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {

            // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
            String strInfo = "在";
            for (CityInfo cityInfo : result.getSuggestCityList()) {
                strInfo += cityInfo.city;
                strInfo += ",";
            }
            strInfo += "找到结果";
            ToastUtil.showToast(strInfo);
        }
    }

    public void onGetPoiDetailResult(PoiDetailResult result) {

        if (result.error != SearchResult.ERRORNO.NO_ERROR) {
            Toast.makeText(getApplicationContext(), "抱歉,未找到结果",
                    Toast.LENGTH_SHORT).show();
        } else {
            // 需要长显示,让用户看清楚文字的内容
            Toast.makeText(getApplicationContext(),
                    result.getName() + ": " + result.getAddress(),
                    Toast.LENGTH_SHORT).show();
        }

    }

    /**
     *
     * @author quincy
     *
     */
    private class MyPoiOverlay extends OverlayManager {
        private PoiResult poiResult = null;

        public MyPoiOverlay(BaiduMap baiduMap) {
            super(baiduMap);
        }

        public void setData(PoiResult poiResult) {
            this.poiResult = poiResult;
        }

        @Override
        public boolean onMarkerClick(Marker marker) {
            if (marker.getExtraInfo() != null) {
                int index = marker.getExtraInfo().getInt("index");
                final PoiInfo poi = poiResult.getAllPoi().get(index);
                View view = View.inflate(getApplicationContext(),
                        R.layout.navigation_location, null);
                TextView name = (TextView) view.findViewById(R.id.name);
                TextView address = (TextView) view.findViewById(R.id.address);
                LinearLayout Route = (LinearLayout) view
                        .findViewById(R.id.Route);
                LinearLayout close = (LinearLayout) view
                        .findViewById(R.id.ll_close);
                name.setText(poi.name);
                address.setText(poi.address);
                final PopupWindow pop = new PopupWindow(view,
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
                        false);
                pop.setBackgroundDrawable(new ColorDrawable());
                pop.setOutsideTouchable(true);
                // 设置此参数获得焦点,否则无法点击
                pop.setFocusable(false);

                pop.showAtLocation(findViewById(R.id.bd_service_gas),
                        Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, -5);
                // 点击关闭pop
                close.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (pop.isShowing()) {
                            pop.setFocusable(false);
                            pop.dismiss();
                        }
                    }
                });

                // 点击路线
                Route.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(getApplicationContext(),
                                RouteActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                        // 目的地的位置
                        intent.putExtra("latitude", poi.location.latitude+"");
                        intent.putExtra("longitude", poi.location.longitude+"");
                        KeepCarApplication.getContext().startActivity(intent);
                    }
                });

                // 详情搜索
                /*
                 * mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
                 * .poiUid(poi.uid));
                 */
            }
            
            return true;
        }

        
        
        @Override
        public List<OverlayOptions> getOverlayOptions() {
            if ((this.poiResult == null)
                    || (this.poiResult.getAllPoi() == null))
                return null;
            ArrayList<OverlayOptions> arrayList = new ArrayList<OverlayOptions>();
        
            for (int i = 0; i < this.poiResult.getAllPoi().size(); i++) {
                if (this.poiResult.getAllPoi().get(i).location == null)
                    continue;
                // 给marker加上标签
                Bundle bundle = new Bundle();
                bundle.putInt("index", i);
                arrayList.add(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(setNumToIcon(i + 1)))
                        .extraInfo(bundle)
                        .position(this.poiResult.getAllPoi().get(i).location));
            }
            return arrayList;
        }

        @Override
        public boolean onPolylineClick(Polyline arg0) {
            return false;
        }
    }

    /**
     * 往图片添加数字
     */
    private Bitmap setNumToIcon(int num) {
        BitmapDrawable bd = (BitmapDrawable) getResources().getDrawable(
                R.drawable.icon_marka);
        Bitmap bitmap = bd.getBitmap().copy(Bitmap.Config.ARGB_8888, true);
        Canvas canvas = new Canvas(bitmap);

        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setAntiAlias(true);
        int widthX;
        int heightY = 0;
        if (num < 10) {
            paint.setTextSize(30);
            widthX = 8;
            heightY = 6;
        } else {
            paint.setTextSize(20);
            widthX = 11;
        }

        canvas.drawText(String.valueOf(num),
                ((bitmap.getWidth() / 2) - widthX),
                ((bitmap.getHeight() / 2) + heightY), paint);
        return bitmap;
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.head_button_01:
            finish();
            break;
        
        case R.id.head_button_02:
            //弹出一个popwindow
            mPop = new MorePopWindow(MapQueryActivity.this, this,true);  // ScreenUtil.dip2px(MyRepairOrderActivity.this, 100)
            mPop.showAsDropDown((ImageButton)findViewById(R.id.head_button_02), -ScreenUtil.dip2px(getApplicationContext(), 30), 0);
            break;
        case R.id.myposition:
            //移动到当前定位的位置
            myPosition();
            mPop.dismiss();
            break;
        /*case R.id.delete:
            ToastUtil.showToast("点击了删除");
            break;*/
        }
    }
    
    /**
     * 移动到我当前的位置
     */
    private void myPosition(){
        if(ll != null){
            //searchPoiFromMap(type,ll);
            MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
            mBaiduMap.animateMapStatus(u);
            
        }
    }
    
}

android百度地图

标签:

原文地址:http://my.oschina.net/u/1458246/blog/526828

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!