主布局:
<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;
}
}