百度地图索引和公交线路

主布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="test1"
        android:text="公交" />

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@id/b1"
        android:clickable="true" />

    <Button
        android:id="@+id/b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="84dp"
        android:onClick="test"
        android:text="检索" />

</RelativeLayout>

主函数:

package com.example.map;

import java.util.List;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.busline.BusLineResult;
import com.baidu.mapapi.search.busline.BusLineSearch;
import com.baidu.mapapi.search.busline.BusLineSearchOption;
import com.baidu.mapapi.search.busline.OnGetBusLineSearchResultListener;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.PoiInfo.POITYPE;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends ActionBarActivity {

    private MapView mMapView;
    private BaiduMap mBaiduMap;
    private String busuid;
    private int radiu = 50000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 在使用SDK各组件之前初始化context信息,传入ApplicationContext
        // 注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        // 获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();

        // 普通地图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

    }
//索引周边
    public void test(View v) {
        PoiSearch mPoiSearch = null;
        if (mPoiSearch != null) {
            mPoiSearch.destroy();
        } else {
            mPoiSearch = PoiSearch.newInstance();
            mPoiSearch
                    .setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
                        public void onGetPoiResult(PoiResult result) {
                            PoiOverlay poiOverlay = new PoiOverlay(mBaiduMap);
                            poiOverlay.setData(result);
                            poiOverlay.addToMap();
                            poiOverlay.zoomToSpan();
                            List<OverlayOptions> overlayOptions = poiOverlay
                                    .getOverlayOptions();

                            mBaiduMap.addOverlays(overlayOptions);
                        }

                        public void onGetPoiDetailResult(PoiDetailResult result) {
                            // 获取Place详情页检索结果
                        }

                        @Override
                        public void onGetPoiIndoorResult(PoiIndoorResult arg0) {
                            // TODO Auto-generated method stub

                        }
                    });

            PoiNearbySearchOption option = new PoiNearbySearchOption();
            final LatLng latLng = new LatLng(39.963175, 116.400244);

            option.keyword("银行").location(latLng).radius(radiu);
            mPoiSearch.searchNearby(option);
        }

    }
//查询公交
    public void test1(View v) {

        PoiSearch poiSearch = null;
        if (poiSearch != null) {
            poiSearch.destroy();
        } else {
            final BusLineSearch busLineSearch = BusLineSearch.newInstance();
            poiSearch = PoiSearch.newInstance();
            poiSearch
                    .setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {

                        @Override
                        public void onGetPoiResult(PoiResult arg0) {
                            // TODO Auto-generated method stub
                            List<PoiInfo> poi = arg0.getAllPoi();
                            for (PoiInfo poiInfo : poi) {
                                if (poiInfo.type == POITYPE.BUS_LINE
                                        || poiInfo.type == POITYPE.SUBWAY_LINE) {

                                    busuid = poiInfo.uid;

                                    busLineSearch
                                            .setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {

                                                @Override
                                                public void onGetBusLineResult(
                                                        BusLineResult arg0) {
                                                    // TODO Auto-generated
                                                    // method
                                                    // stub
                                                    BusLineOverlay busLineOverlay = new BusLineOverlay(
                                                            mBaiduMap);

                                                    busLineOverlay
                                                            .setData(arg0);
                                                    busLineOverlay.addToMap();
                                                    busLineOverlay.zoomToSpan();
                                                    List<OverlayOptions> overlayOptions = busLineOverlay
                                                            .getOverlayOptions();
                                                    mBaiduMap
                                                            .addOverlays(overlayOptions);

                                                }
                                            });

                                    busLineSearch
                                            .searchBusLine(new BusLineSearchOption()
                                                    .city("北京").uid(busuid));

                                    break;

                                }
                            }
                        }

                        @Override
                        public void onGetPoiIndoorResult(PoiIndoorResult arg0) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onGetPoiDetailResult(PoiDetailResult arg0) {
                            // TODO Auto-generated method stub

                        }
                    });

            poiSearch.searchInCity(new PoiCitySearchOption().city("北京")
                    .keyword("509"));
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }

}

辅助类1(BusLineOverlay):

package com.example.map;

import android.graphics.Color;
import android.util.Log;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.busline.BusLineResult;

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

/**
 * 鐢ㄤ簬鏄剧ず涓�潯鍏氦璇︽儏缁撴灉鐨凮verlay
 */
public class BusLineOverlay extends OverlayManager {

    private BusLineResult mBusLineResult = null;

    /**
     * 鏋勯�鍑芥暟
     * 
     * @param baiduMap
     *            璇usLineOverlay鎵�紩鐢ㄧ殑 BaiduMap 瀵硅薄
     */
    public BusLineOverlay(BaiduMap baiduMap) {
        super(baiduMap);
    }

    /**
     * 璁剧疆鍏氦绾挎暟鎹�     * 
     * @param result
     *            鍏氦绾胯矾缁撴灉鏁版嵁
     */
    public void setData(BusLineResult result) {
        this.mBusLineResult = result;
    }

    @Override
    public final List<OverlayOptions> getOverlayOptions() {

        if (mBusLineResult == null || mBusLineResult.getStations() == null) {
            return null;
        }
        List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
        for (BusLineResult.BusStation station : mBusLineResult.getStations()) {
            overlayOptionses.add(new MarkerOptions()
                    .position(station.getLocation())
                            .zIndex(10)
                                    .anchor(0.5f, 0.5f)
                                            .icon(BitmapDescriptorFactory
                                                    .fromAssetWithDpi("Icon_bus_station.png")));
        }

        List<LatLng> points = new ArrayList<LatLng>();
        for (BusLineResult.BusStep step : mBusLineResult.getSteps()) {
            if (step.getWayPoints() != null) {
                points.addAll(step.getWayPoints());
            }
        }
        if (points.size() > 0) {
            overlayOptionses
                    .add(new PolylineOptions().width(10)
                            .color(Color.argb(178, 0, 78, 255)).zIndex(0)
                                    .points(points));
        }
        return overlayOptionses;
    }

    /**
     * 瑕嗗啓姝ゆ柟娉曚互鏀瑰彉榛樿鐐瑰嚮琛屼负
     * 
     * @param index
     *            琚偣鍑荤殑绔欑偣鍦�     *            {@link com.baidu.mapapi.search.busline.BusLineResult#getStations()}
     *            涓殑绱㈠紩
     * @return 鏄惁澶勭悊浜嗚鐐瑰嚮浜嬩欢
     */
    public boolean onBusStationClick(int index) {
        if (mBusLineResult.getStations() != null
                && mBusLineResult.getStations().get(index) != null) {
            Log.i("baidumapsdk", "BusLineOverlay onBusStationClick");
        }
        return false;
    }

    public final boolean onMarkerClick(Marker marker) {
        if (mOverlayList != null && mOverlayList.contains(marker)) {
            return onBusStationClick(mOverlayList.indexOf(marker));
        } else {
            return false;
        }

    }

    @Override
    public boolean onPolylineClick(Polyline polyline) {
        // TODO Auto-generated method stub
        return false;
    }
}

辅助类2(OverlayManager):

package com.example.map;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnPolylineClickListener;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLngBounds;

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

import static com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;

/**
 * 璇ョ被鎻愪緵涓�釜鑳藉鏄剧ず鍜岀鐞嗗涓狾verlay鐨勫熀绫� * <p>
 * 澶嶅啓{@link #getOverlayOptions()} 璁剧疆娆叉樉绀哄拰绠$悊鐨凮verlay鍒楄〃
 * </p>
 * <p>
 * 閫氳繃
 * {@link com.baidu.mapapi.map.BaiduMap#setOnMarkerClickListener(com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener)}
 * 灏嗚鐩栫墿鐐瑰嚮浜嬩欢浼犻�缁橭verlayManager鍚庯紝OverlayManager鎵嶈兘鍝嶅簲鐐瑰嚮浜嬩欢銆� * <p>
 * 澶嶅啓{@link #onMarkerClick(com.baidu.mapapi.map.Marker)} 澶勭悊Marker鐐瑰嚮浜嬩欢
 * </p>
 */
public abstract class OverlayManager implements OnMarkerClickListener, OnPolylineClickListener {

    BaiduMap mBaiduMap = null;
    private List<OverlayOptions> mOverlayOptionList = null;

    List<Overlay> mOverlayList = null;

    /**
     * 閫氳繃涓�釜BaiduMap 瀵硅薄鏋勯�
     * 
     * @param baiduMap
     */
    public OverlayManager(BaiduMap baiduMap) {
        mBaiduMap = baiduMap;
        // mBaiduMap.setOnMarkerClickListener(this);
        if (mOverlayOptionList == null) {
            mOverlayOptionList = new ArrayList<OverlayOptions>();
        }
        if (mOverlayList == null) {
            mOverlayList = new ArrayList<Overlay>();
        }
    }

    /**
     * 瑕嗗啓姝ゆ柟娉曡缃绠$悊鐨凮verlay鍒楄〃
     * 
     * @return 绠$悊鐨凮verlay鍒楄〃
     */
    public abstract List<OverlayOptions> getOverlayOptions();

    /**
     * 灏嗘墍鏈塐verlay 娣诲姞鍒板湴鍥句笂
     */
    public final void addToMap() {
        if (mBaiduMap == null) {
            return;
        }

        removeFromMap();
        List<OverlayOptions> overlayOptions = getOverlayOptions();
        if (overlayOptions != null) {
            mOverlayOptionList.addAll(getOverlayOptions());
        }

        for (OverlayOptions option : mOverlayOptionList) {
            mOverlayList.add(mBaiduMap.addOverlay(option));
        }
    }

    /**
     * 灏嗘墍鏈塐verlay 浠�鍦板浘涓婃秷闄�     */
    public final void removeFromMap() {
        if (mBaiduMap == null) {
            return;
        }
        for (Overlay marker : mOverlayList) {
            marker.remove();
        }
        mOverlayOptionList.clear();
        mOverlayList.clear();

    }

    /**
     * 缂╂斁鍦板浘锛屼娇鎵�湁Overlay閮藉湪鍚堥�鐨勮閲庡唴
     * <p>
     * 娉細 璇ユ柟娉曞彧瀵筂arker绫诲瀷鐨刼verlay鏈夋晥
     * </p>
     * 
     */
    public void zoomToSpan() {
        if (mBaiduMap == null) {
            return;
        }
        if (mOverlayList.size() > 0) {
            LatLngBounds.Builder builder = new LatLngBounds.Builder();
            for (Overlay overlay : mOverlayList) {
                // polyline 涓殑鐐瑰彲鑳藉お澶氾紝鍙寜marker 缂╂斁
                if (overlay instanceof Marker) {
                    builder.include(((Marker) overlay).getPosition());
                }
            }
            mBaiduMap.setMapStatus(MapStatusUpdateFactory
                    .newLatLngBounds(builder.build()));
        }
    }

}

辅助类3(PoiOverlay):

package com.example.map;

import android.os.Bundle;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.search.poi.PoiResult;

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

/**
 * 鐢ㄤ簬鏄剧ずpoi鐨刼verly
 */
public class PoiOverlay extends OverlayManager {

    private static final int MAX_POI_SIZE = 10;

    private PoiResult mPoiResult = null;

    /**
     * 鏋勯�鍑芥暟
     * 
     * @param baiduMap
     *            璇�PoiOverlay 寮曠敤鐨�BaiduMap 瀵硅薄
     */
    public PoiOverlay(BaiduMap baiduMap) {
        super(baiduMap);
    }

    /**
     * 璁剧疆POI鏁版嵁
     * 
     * @param poiResult
     *            璁剧疆POI鏁版嵁
     */
    public void setData(PoiResult poiResult) {
        this.mPoiResult = poiResult;
    }

    @Override
    public final List<OverlayOptions> getOverlayOptions() {
        if (mPoiResult == null || mPoiResult.getAllPoi() == null) {
            return null;
        }
        List<OverlayOptions> markerList = new ArrayList<OverlayOptions>();
        int markerSize = 0;
        for (int i = 0; i < mPoiResult.getAllPoi().size()
                && markerSize < MAX_POI_SIZE; i++) {
            if (mPoiResult.getAllPoi().get(i).location == null) {
                continue;
            }
            markerSize++;
            Bundle bundle = new Bundle();
            bundle.putInt("index", i);
            markerList.add(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.fromAssetWithDpi("Icon_mark"
                            + markerSize + ".png")).extraInfo(bundle)
                    .position(mPoiResult.getAllPoi().get(i).location));

        }
        return markerList;
    }

    /**
     * 鑾峰彇璇�PoiOverlay 鐨�poi鏁版嵁
     * 
     * @return
     */
    public PoiResult getPoiResult() {
        return mPoiResult;
    }

    /**
     * 瑕嗗啓姝ゆ柟娉曚互鏀瑰彉榛樿鐐瑰嚮琛屼负
     * 
     * @param i
     *            琚偣鍑荤殑poi鍦�     *            {@link com.baidu.mapapi.search.poi.PoiResult#getAllPoi()} 涓殑绱㈠紩
     * @return
     */
    public boolean onPoiClick(int i) {
//        if (mPoiResult.getAllPoi() != null
//                && mPoiResult.getAllPoi().get(i) != null) {
//            Toast.makeText(BMapManager.getInstance().getContext(),
//                    mPoiResult.getAllPoi().get(i).name, Toast.LENGTH_LONG)
//                    .show();
//        }
        return false;
    }

    @Override
    public final boolean onMarkerClick(Marker marker) {
        if (!mOverlayList.contains(marker)) {
            return false;
        }
        if (marker.getExtraInfo() != null) {
            return onPoiClick(marker.getExtraInfo().getInt("index"));
        }
        return false;
    }

    @Override
    public boolean onPolylineClick(Polyline polyline) {
        // TODO Auto-generated method stub
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值