6.百度地图例子讲解

   一.准备工作:  

百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序  百度地图移动版API不仅包含构建地图的基本接口,还提供了本地搜索、路线规划、地图定位等数据服务。

一.获取API Key
地址
:
百度地图开发官网http://developer.baidu.com/map/android-mobile-apply-key.htm
添加引擎到Andoid工程中
添加jar包: baidumapapi_v3_3_0.jar和locSDK_5.0.jar
添加.so文件:拷贝libBaiduMapSDK_v3_3_0_15.so 、 liblocSDK5.so到libs\armeabi目录下
注: locSDK_5.0.jar和liblocSDK5.so为百度定位SDK所使用资源,开发者可根据实际需求自行添加。 
    



1、打开命令行输入cd .android 进入到android签名目录 如:C:\Users\lenovo\.android
2、命令 -list -v -keystore debug.keystore 密码是android
数字签名;包名 分号是英文的  
例如:48:8C:D9:43:56:81:C4:10:10:40:B6:C3:0A:A1:84:A9:65:65:9A:5A;baidumapsdk.demo
生成的key:V3ITMGba32313GGCLFLALQdP


二.AndroidManifest中的配置

<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>


key:

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="5RcUpEpQyGNZWeTQVGb7gStr" />


三.MainActivity  页面的配置和地图的校验

public class MainActivity extends Activity {
	private static String[] objects = new String[] { "hello world", "图层",
		"圆形覆盖物", "展示文字", "marker覆盖物", "矩形范围内搜索", "圆形区域", "全城搜索", "驾车路线",
		"步行路线", "公交换乘", "我的位置" };
private static Class[] clazzs = new Class[] { HelloWorld.class,
		LayerDemo.class,CircleOptionsDemo.class,TextOptionsDemo.class,MarkerOptionsDemo.class
		,PoiSearchInBoundsDemo.class,PoiSearchNearbyDemo.class,PoiSearchCityDemo.class
		,DrivingRouteOverlayDemo.class,WalkingRouteOverlayDemo.class,TransitRouteOverlayDemo.class
		,LocationDemo.class};
private ListView list;
private ArrayAdapter<String> adapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		SDKInitializer.initialize(getApplicationContext());//初始化地图
		list = (ListView) findViewById(R.id.list);

		adapter = new ArrayAdapter<String>(getApplicationContext(),
				R.layout.item, objects);
		list.setAdapter(adapter);
		list.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Intent intent = new Intent(getApplicationContext(),
						clazzs[position]);
				startActivity(intent);
			}
		});
	}
}


<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="${relativePackage}.${activityClass}" >
     <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
     </ListView>

</RelativeLayout>






三.检验百度地图 (测试)

//百度地图,测试
public class HelloWorld extends Activity {
	private static final String TAG = "tag";
	private MybaiduMapReceiver baduSdkReceiver;
	private IntentFilter filter;
	private MapView mapView;
	private double latitude = 30.472473;// 纬度
	private double longitude = 114.418332;// 经度
	private LatLng hmPos = new LatLng(latitude, longitude);// 学校
	private BaiduMap map;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 初始化地图,因为百度会校验你的key是不是他的
		initManager();

		setContentView(R.layout.common);
		
		//初始化设置
		init();
	}

	private void init() {
		// 设置地图的放大缩小的级别(V2.X 3-19 V1.X 3-18)
		// ① 修改了文件的格式 优化了空间的使用(北京 110M 15M)
		// ② 增加了级别 3D效果(18 19)
		
		
		mapView = (MapView)findViewById(R.id.mapView);
		//mapView.showZoomControls(false);// 默认是true 显示标尺
		//mapView.showScaleControl(false);// 默认是true 显示缩放按钮
		
		
		// BaiduMap: 管理具体的某一个MapView : 旋转,移动,缩放,事件。。
		map = mapView.getMap();
		//默认级别为12,设置19
		MapStatusUpdate mapStatus = MapStatusUpdateFactory.zoomTo(19);
		map.setMapStatus(mapStatus);
		
		//设置初始化的位置
		MapStatusUpdate mapStatusPoint = MapStatusUpdateFactory.newLatLng(hmPos);
		map.setMapStatus(mapStatusPoint );
		
	}

	private void initManager() {
		SDKInitializer.initialize(getApplicationContext());
		baduSdkReceiver = new MybaiduMapReceiver();
		filter = new IntentFilter();
		filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);// 注册网络错误
		filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); // 注册key校验结果
		registerReceiver(baduSdkReceiver, filter);
	}

	class MybaiduMapReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			String result = intent.getAction();
			if (result
					.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
				// 网络错误
				Toast.makeText(getApplicationContext(), "无网络", 0).show();
			} else if (result
					.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
				// key校验失败
				Toast.makeText(getApplicationContext(), "校验失败", 0).show();
			}
		}

	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		switch (keyCode) {
		case KeyEvent.KEYCODE_1:
			// 放大
			// 放大地图缩放级别 每次放大一个级别
			MapStatusUpdate zoomInStatus = MapStatusUpdateFactory.zoomIn();
			map.setMapStatus(zoomInStatus);
			break;
		case KeyEvent.KEYCODE_2:
			// 缩小
			// 缩小地图缩放级别 每次缩小一个级别
			MapStatusUpdate zooOutStatus = MapStatusUpdateFactory.zoomOut();
			map.setMapStatus(zooOutStatus);
			break;
		case KeyEvent.KEYCODE_3:
			// 以一个点为中心 旋转
			MapStatus mapStatus = map.getMapStatus();// 获取地图的当前状态
			float rotate = mapStatus.rotate;
			Log.d(TAG, "rotate:" + rotate);
			// 旋转 范围0~360
			MapStatus rotateStatus = new  MapStatus.Builder().rotate(rotate+30).build();
			// 创建新的MapStatus
			MapStatusUpdate rotateStatusUpdate = MapStatusUpdateFactory.newMapStatus(rotateStatus);
			map.setMapStatus(rotateStatusUpdate);
			
			break;
		case KeyEvent.KEYCODE_4:
			// 已一条直线 为轴 旋转 Overlooking 俯角
			MapStatus mapStatusOver = map.getMapStatus();// 获取地图的当前状态
			float overlook = mapStatusOver.overlook;
			Log.d(TAG, "overlook:" + overlook);
			// 0~45
			MapStatus overStatus = new MapStatus.Builder().overlook(overlook-5).build();
			MapStatusUpdate overStatusUpdate = MapStatusUpdateFactory.newMapStatus(overStatus);
			map.setMapStatus(overStatusUpdate);
			break;
		case KeyEvent.KEYCODE_5:
			// 移动
			MapStatusUpdate moveStatusUpdate = MapStatusUpdateFactory.newLatLng(new LatLng(40.065796,116.349868));
			// 带动画的更新地图状态 耗时300毫秒
			map.animateMapStatus(moveStatusUpdate);
			break;
		default:
			break;
		}
		return super.onKeyDown(keyCode, event);
	}
	@Override
	protected void onResume() {
		mapView.onResume();
		super.onResume();
	}
	@Override
	protected void onPause() {
		mapView.onPause();
		super.onPause();
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unregisterReceiver(baduSdkReceiver);
	}
}


布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.baidu.mapapi.map.MapView//百度地图的View
        android:id="@+id/mapView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    

</LinearLayout>
</pre><h2>四.图层示例(普通图层.交通图层.卫星图层)</h2><div><pre name="code" class="java">public class LayerDemo extends Activity {
	private MapView mapView;
	private BaiduMap baiduMap;
	private double latitude = 30.472473;// 纬度
	private double longitude = 114.418332;// 经度
	private LatLng hmPos = new LatLng(latitude, longitude);// 学校

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		// 初始化地图,因为百度会校验你的key是不是他的
		initManager();
		setContentView(R.layout.common);
		init();

	}

	private void initManager() {
		SDKInitializer.initialize(getApplicationContext());
	}

	private void init() {
		mapView = (MapView) findViewById(R.id.mapView);
		baiduMap = mapView.getMap();

		// 默认级别为12,设置19
		MapStatusUpdate mapStatus = MapStatusUpdateFactory.zoomTo(12);
		baiduMap.setMapStatus(mapStatus);

		// 设置初始化的位置
		MapStatusUpdate mapStatusPoint = MapStatusUpdateFactory
				.newLatLng(hmPos);
		baiduMap.setMapStatus(mapStatusPoint);
		
		
		//baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);卫星图
		
		baiduMap.setTrafficEnabled(true);//设置交通图
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		switch (keyCode) {
		case KeyEvent.KEYCODE_1:
			// 底图
			// 设置地图类型 MAP_TYPE_NORMAL 普通图; MAP_TYPE_SATELLITE 卫星图
			baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
			baiduMap.setTrafficEnabled(false);
			break;
		case KeyEvent.KEYCODE_2:
			// 卫星图
			baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
			baiduMap.setTrafficEnabled(false);
			break;
		case KeyEvent.KEYCODE_3:
			// 交通图
			// 是否打开交通图层
			baiduMap.setTrafficEnabled(true);
			break;

		default:
			break;
		}
		return super.onKeyDown(keyCode, event);
	}

}

五.BaseActivity (代码提取)

public class BaseActivity extends Activity {
	protected BaiduMap baiduMap;
	protected MapView mapview;
	public double latitude = 30.472473;// 纬度
	public double longitude = 114.418332;// 经度
	public LatLng hmPos = new LatLng(latitude, longitude);// 学校
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		initManager();

		setContentView(R.layout.common);

		init();
	}
	private void initManager() {
		//SDKInitializer.initialize(getApplicationContext()); // 不能传递Activity,必须是全局Context
	}

	private void init() {
		// 设置地图级别(V2.X 3-19 V1.X 3-18)
		// ① 修改了文件的格式 优化了空间的使用(北京 110M 15M)
		// ② 增加了级别 3D效果(18 19)

		mapview = (MapView) findViewById(R.id.mapView);

		baiduMap = mapview.getMap();
		// BaiduMap: 管理具体的某一个MapView : 旋转,移动,缩放,事件。。

		// 描述地图状态将要发生的变化 使用工厂类MapStatusUpdateFactory创建
		MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 默认的级别12
		// 设置缩放级别
		baiduMap.setMapStatus(mapstatusUpdate);

		// LatLng latlng = new LatLng(arg0, arg1);// 坐标 经纬度 参数1 纬度 参数2 经度
		MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory
				.newLatLng(hmPos);
		// 设置中心点 默认是学校
		baiduMap.setMapStatus(mapstatusUpdatePoint);

		// mapview.showZoomControls(false);// 默认是true 显示缩放按钮
		//
		// mapview.showScaleControl(false);// 默认是true 显示标尺
	}
	@Override
	protected void onDestroy() {
		mapview.onDestroy();
		super.onDestroy();
	}
	@Override
	protected void onResume() {
		mapview.onResume();
		super.onResume();
	}

	@Override
	protected void onPause() {
		mapview.onPause();
		super.onPause();
	}
}


六.展示圆形覆盖物



public class CircleOptionsDemo extends BaseActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		draw();
	}

	private void draw() {
		CircleOptions circleOptions = new CircleOptions();
		circleOptions.center(hmPos)
		.radius(100)
		.fillColor(0X66FF0000);
		baiduMap.addOverlay(circleOptions);
	}
}


七.显示文字



public class TextOptionsDemo extends BaseActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		draw();
	}

	private void draw() {
		TextOptions options = new TextOptions();
		options.fontColor(0x60FF0000)
		.text("老罗的家") // 文字内容
		.position(hmPos) // 位置
		.fontSize(50)// 字体大小
		.typeface(Typeface.SANS_SERIF)// 字体
		.rotate(30);// 旋转
		baiduMap.addOverlay(options);
	}
}


八.展示图片在特地位置(Mark覆盖物)


public class MarkerOptionsDemo extends BaseActivity {
	private View pop;
	private MarkerOptions markerOptions;
	private TextView title;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		draw();
		
		initPop();
		// 点击某一个Marker 在脑袋上弹出pop
	}

	private void initPop() {
		pop = View.inflate(getApplicationContext(), R.layout.pop, null);
		LayoutParams params = new MapViewLayoutParams.Builder()
		.layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)// 按照经纬度设置位置
		.position(hmPos)// 不能传null 设置为mapMode时 必须设置position
		.width(MapViewLayoutParams.WRAP_CONTENT)
		.height(MapViewLayoutParams.WRAP_CONTENT).build();
		mapview.addView(pop,params );
		
		pop.setVisibility(View.INVISIBLE);
		title = (TextView) pop.findViewById(R.id.title);
		
	}

	private void draw() {
	
		
		BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.eat_icon);
		BitmapDescriptor bitmap2 = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
		ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
		bitmaps.add(bitmap);
		bitmaps.add(bitmap2);
		
		markerOptions = new MarkerOptions();
		markerOptions.draggable(true)
		.title("老罗")
		.position(hmPos)
		.icons(bitmaps)
		.period(10);// 设置多少帧刷新一次图片资源,Marker动画的间隔时间,值越小动画越快
		baiduMap.addOverlay(markerOptions);
		
		
		markerOptions= new MarkerOptions().title("向北")
				.position(new LatLng(latitude + 0.001, longitude))
				.icon(bitmap);
		baiduMap.addOverlay(markerOptions);
		
		markerOptions= new MarkerOptions().title("向东")
				.position(new LatLng(latitude , longitude+ 0.001))
				.icon(bitmap);
		baiduMap.addOverlay(markerOptions);
		
		markerOptions= new MarkerOptions().title("向西南")
				.position(new LatLng(latitude - 0.001, longitude - 0.001))
				.icon(bitmap);
		baiduMap.addOverlay(markerOptions);
		
		baiduMap.setOnMarkerClickListener(new MyListener());
	}
	
	class MyListener implements OnMarkerClickListener{

		@Override
		public boolean onMarkerClick(Marker result) {
			// 当点击时 更新pop的位置 设置为显示
			LayoutParams params = new MapViewLayoutParams.Builder()
			.layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)// 按照经纬度设置位置
			.position(result.getPosition())// 不能传null
			.width(MapViewLayoutParams.WRAP_CONTENT)
			.height(MapViewLayoutParams.WRAP_CONTENT)
			.yOffset(-10)// 距离position的像素 向下是正值 向上是负值
			.build();
			
			//更新位置
			mapview.updateViewLayout(pop, params);
			pop.setVisibility(View.VISIBLE);
			title.setText(result.getTitle());
			
			return true;
		}
		
	}
}

九.矩形范围内搜索加油站



public class PoiSearchInBoundsDemo extends BaseActivity {
	private PoiSearch poiSearch;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		search();
	}

	private void search() {
		poiSearch = PoiSearch.newInstance();
		
		PoiBoundSearchOption poiboundSearch = new PoiBoundSearchOption();
		LatLngBounds latlngbounds = new LatLngBounds.Builder()
//		public double latitude = 30.472473;// 纬度
//		public double longitude = 114.418332;// 经度
		.include(new LatLng(30.480073,114.421132))
		.include(new LatLng(30.495673,114.434332))
		.build();
		poiboundSearch.bound(latlngbounds);
		poiboundSearch.keyword("加油站");
		poiSearch.searchInBound(poiboundSearch);
		
		//当搜索到信息时,回调这个监听
		poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
			
			@Override
			public void onGetPoiResult(PoiResult result) {
				if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){
					Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
					return;
				}
				
//				PoiOverlay overlay = new PoiOverlay(baiduMap);
				PoiOverlay overlay = new MyOverlay(baiduMap);//设置点击事件
				baiduMap.setOnMarkerClickListener(overlay);//将点击事件传递给下面的overlay
				overlay.setData(result);// 设置POI数据
				overlay.addToMap();//将所有Overlay 添加到地图上
				overlay.zoomToSpan();//缩放地图,使所有Overlay都在合适的视野内
			}
			
			@Override
			public void onGetPoiDetailResult(PoiDetailResult result) {
				
			}
		});
	}
	
	class MyOverlay extends PoiOverlay{

		public MyOverlay(BaiduMap arg0) {
			super(arg0);
		}
		@Override
		public boolean onPoiClick(int index) {
			PoiResult poiResult = getPoiResult();
			PoiInfo poiInfo = poiResult.getAllPoi().get(index);
			String info = poiInfo.city + ":" +poiInfo.name + ":" + poiInfo.address;
			Toast.makeText(getApplicationContext(), info, 0).show();
			return super.onPoiClick(index);
		}
	}
}

十.圆形范围内搜索加油站



//周边的搜索
public class PoiSearchNearbyDemo extends BaseActivity {
	private PoiSearch poiSearch;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		search();
	}

	private void search() {
		poiSearch = PoiSearch.newInstance();
		PoiNearbySearchOption nearbySearch = new PoiNearbySearchOption();
		nearbySearch.location(hmPos);
		nearbySearch.radius(1500);
		nearbySearch.keyword("加油站");
		
		poiSearch.searchNearby(nearbySearch);
		
		//当搜索到信息时,回调这个监听
		poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
			
			//poi 查询结果回调
			@Override
			public void onGetPoiResult(PoiResult result) {
				if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){
					Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
					return;
				}
				
//				PoiOverlay overlay = new PoiOverlay(baiduMap);
				PoiOverlay overlay = new MyOverlay(baiduMap);//设置点击事件
				baiduMap.setOnMarkerClickListener(overlay);//将点击事件传递给下面的overlay
				overlay.setData(result);// 设置POI数据
				overlay.addToMap();//将所有Overlay 添加到地图上
				overlay.zoomToSpan();//缩放地图,使所有Overlay都在合适的视野内
			}
			
			
			//poi 详情查询结果回调
			@Override
			public void onGetPoiDetailResult(PoiDetailResult result) {
				if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){
					Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
					return;
				}
				
				String text = result.getAddress()+ "::" + result.getCommentNum() + result.getFacilityRating();
				Toast.makeText(getApplicationContext(), text, 0).show();
			}
		});
	}
	
	class MyOverlay extends PoiOverlay{

		public MyOverlay(BaiduMap arg0) {
			super(arg0);
		}
		@Override
		public boolean onPoiClick(int index) {
			PoiResult poiResult = getPoiResult();
			PoiInfo poiInfo = poiResult.getAllPoi().get(index);
			String info = poiInfo.city + ":" +poiInfo.name + ":" + poiInfo.address;
			Toast.makeText(getApplicationContext(), info, 0).show();
			
			//在点击事件中添加详情uid
			PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption();
			detailSearchOption.poiUid(poiInfo.uid);// 设置poi的uid
			poiSearch.searchPoiDetail(detailSearchOption);
			
			return super.onPoiClick(index);
		}
	}
}

十一.全城搜索加油站(南京,一个城市有很多.进行分页)



public class PoiSearchCityDemo extends BaseActivity {
	private PoiSearch poiSearch;
	private int currentPageIndex = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		search();
	}

	private void search() {
		poiSearch = PoiSearch.newInstance();
		PoiCitySearchOption poicitySearch = new PoiCitySearchOption();
		poicitySearch.city("南京");
		poicitySearch.keyword("加油站");
		poicitySearch.pageNum(currentPageIndex);
		poiSearch.searchInCity(poicitySearch );
		
		//当搜索到信息时,回调这个监听
		poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
			
			@Override
			public void onGetPoiResult(PoiResult result) {
				if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){
					Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
					return;
				}
				
				String text = "共" + result.getTotalPageNum() + "页,共"
						+ result.getTotalPoiNum() + "条,当前第"
						+ result.getCurrentPageNum() + "页,当前页"
						+ result.getCurrentPageCapacity() + "条";
				Toast.makeText(getApplicationContext(), text, 1).show();
				baiduMap.clear();// 清空地图所有的 Overlay 覆盖物以及 InfoWindow
				
				
//				PoiOverlay overlay = new PoiOverlay(baiduMap);
				PoiOverlay overlay = new MyOverlay(baiduMap);//设置点击事件
				baiduMap.setOnMarkerClickListener(overlay);//将点击事件传递给下面的overlay
				overlay.setData(result);// 设置POI数据
				overlay.addToMap();//将所有Overlay 添加到地图上
				overlay.zoomToSpan();//缩放地图,使所有Overlay都在合适的视野内
			}
			
			@Override
			public void onGetPoiDetailResult(PoiDetailResult result) {
				
			}
		});
	}
	
	class MyOverlay extends PoiOverlay{

		public MyOverlay(BaiduMap arg0) {
			super(arg0);
		}
		@Override
		public boolean onPoiClick(int index) {
			PoiResult poiResult = getPoiResult();
			PoiInfo poiInfo = poiResult.getAllPoi().get(index);
			String info = poiInfo.city + ":" +poiInfo.name + ":" + poiInfo.address;
			Toast.makeText(getApplicationContext(), info, 0).show();
			return super.onPoiClick(index);
		}
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode==KeyEvent.KEYCODE_1){
			currentPageIndex++;
			search();
		}
		return super.onKeyDown(keyCode, event);
	}
}

十二.驾车路线

//驾车路线图
public class DrivingRouteOverlayDemo extends BaseActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		search();
	}

	private void search() {
		//1.创建实例
		RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();

		DrivingRoutePlanOption drivingRoutePlanOption = new DrivingRoutePlanOption();

		PlanNode from = PlanNode.withLocation(hmPos);// 创建起点;
		drivingRoutePlanOption.from(from);

		//设置路途中经过的点
		List<PlanNode> node = new ArrayList<PlanNode>();
		node.add(PlanNode.withCityNameAndPlaceName("武汉", "光谷广场"));
		drivingRoutePlanOption.passBy(node);

		PlanNode to = PlanNode.withLocation(new LatLng(30.422473, 114.418932));
		drivingRoutePlanOption.to(to);

		drivingRoutePlanOption
				.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_DIS_FIRST);// 设置策略
		// 2.加载
		routePlanSearch.drivingSearch(drivingRoutePlanOption);

		//3.设置驾车路线监听
		routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {

					@Override
					public void onGetWalkingRouteResult(WalkingRouteResult arg0) {

					}

					@Override
					public void onGetTransitRouteResult(TransitRouteResult arg0) {

					}

					@Override
					public void onGetDrivingRouteResult(
							DrivingRouteResult result) {
						if (result == null
								|| SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
							Toast.makeText(getApplicationContext(), "未搜索到结果", 0)
									.show();
							return;
						}
						DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(
								baiduMap);
						baiduMap.setOnMarkerClickListener(drivingRouteOverlay);
						drivingRouteOverlay.setData(result.getRouteLines().get(
								0));// 路线为第一条,有很多条
						drivingRouteOverlay.zoomToSpan();
						drivingRouteOverlay.addToMap();

					}
				});
	}
	
	class MyDrivingOverlay extends DrivingRouteOverlay {

		public MyDrivingOverlay(BaiduMap arg0) {
			super(arg0);
		}
		
		//起始点的图标设置
		@Override
		public BitmapDescriptor getStartMarker() {
			return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
		}
		//终点的图标设置
		@Override
		public BitmapDescriptor getTerminalMarker() {
			// TODO Auto-generated method stub
			return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
		}
	}
}

十三.步行路线


/**
 * 步行路线
 * @author h
 *
 */
public class WalkingRouteOverlayDemo extends BaseActivity {
	private RoutePlanSearch routePlanSearch;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		search();
	}

	private void search() {
		//1.创建实例
		routePlanSearch = RoutePlanSearch.newInstance();
		
		WalkingRoutePlanOption walkOption = new WalkingRoutePlanOption();
		PlanNode from = PlanNode.withLocation(hmPos);// 创建起点
		PlanNode to = PlanNode.withLocation(new LatLng(30.422473, 114.418932));// 创建终点
		walkOption.from(from);
		walkOption.to(to);
		//2.设置步行
		routePlanSearch.walkingSearch(walkOption);
		//3.设置监听
		routePlanSearch.setOnGetRoutePlanResultListener(new MyListener());
	}
	
	class MyListener implements OnGetRoutePlanResultListener{

		@Override
		public void onGetDrivingRouteResult(DrivingRouteResult result) {}

		@Override
		public void onGetTransitRouteResult(TransitRouteResult result) {
			
		}
		
		//监听结果
		@Override
		public void onGetWalkingRouteResult(WalkingRouteResult result) {

			if (result == null
					|| SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
				Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
				return;
			}
			//展示Overlay
			WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap);
			baiduMap.setOnMarkerClickListener(overlay);// 把事件传递给overlay
			overlay.setData(result.getRouteLines().get(0));// 设置线路为第一条
			overlay.addToMap();
			overlay.zoomToSpan();
			
		
		}
	}
}

十四.公交换乘


/**
 * 公交换乘路线
 * @author h
 *
 */
public class TransitRouteOverlayDemo extends BaseActivity {
	private RoutePlanSearch routePlanSearch;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		search();
	}

	private void search() {
		//1.创建实例
		routePlanSearch = RoutePlanSearch.newInstance();
		
		
		TransitRoutePlanOption transitOption = new TransitRoutePlanOption();
		PlanNode from = PlanNode.withLocation(hmPos);// 创建起点
		PlanNode to = PlanNode.withLocation(new LatLng(30.422473, 114.418932));// 创建终点
		transitOption.from(from);
		transitOption.to(to);
		transitOption.city("武汉");
		transitOption.policy(TransitRoutePlanOption.TransitPolicy.EBUS_WALK_FIRST);
		//2.设置公交
		routePlanSearch.transitSearch(transitOption);
		
		//3.设置监听
		routePlanSearch.setOnGetRoutePlanResultListener(new MyListener());
	}
	
	class MyListener implements OnGetRoutePlanResultListener{

		@Override
		public void onGetDrivingRouteResult(DrivingRouteResult result) {}
		
		//路线结果
		@Override
		public void onGetTransitRouteResult(TransitRouteResult result) {

			if (result == null
					|| SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
				Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
				return;
			}
			TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap);
			baiduMap.setOnMarkerClickListener(overlay);// 把事件传递给overlay
			overlay.setData(result.getRouteLines().get(0));// 设置线路为第一条
			overlay.addToMap();
			overlay.zoomToSpan();
			
		
		}

		@Override
		public void onGetWalkingRouteResult(WalkingRouteResult result) {
			
		}
		
	}
	class MyDrivingOverlay extends DrivingRouteOverlay{

		public MyDrivingOverlay(BaiduMap arg0) {
			super(arg0);
		}
		
		@Override
		public BitmapDescriptor getStartMarker() {
			//覆写此方法以改变默认起点图标
			return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
		}
		@Override
		public BitmapDescriptor getTerminalMarker() {
			//覆写此方法以改变默认终点图标
			return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
		}
		
	}
}


十五.定位



public class LocationDemo extends BaseActivity {
	private LocationClient mLocationClient;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		locate();
	}

	private void locate() {
		BDLocationListener myListener = new MyLocationListener();

		mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类
		mLocationClient.registerLocationListener(myListener); // 注册监听函数

		initLocation();
	}

	private void initLocation() {
		LocationClientOption option = new LocationClientOption();
		
		option.setLocationMode(LocationMode.Hight_Accuracy);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
		option.setIgnoreKillProcess(false);
		option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系
		int span = 1000;
		option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
		option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
		//option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
		//option.setIsNeedLocationDescribe(true);//
		// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
		// option.setIsNeedLocationPoiList(true);//
		// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
		//option.setIgnoreKillProcess(false);// 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
		//option.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集
		// option.setEnableSimulateGps(false);// 可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
		mLocationClient.setLocOption(option);
		
		BitmapDescriptor geo = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_geo);
		MyLocationConfiguration configuration = new MyLocationConfiguration(
				MyLocationConfiguration.LocationMode.COMPASS, true, geo);//NORMAL FOLLOWING COMPASS三种模式
		baiduMap.setMyLocationConfigeration(configuration);// 设置定位显示的模式
		baiduMap.setMyLocationEnabled(true);// 打开定位图层
	}

	class MyLocationListener implements BDLocationListener {

		@Override
		public void onReceiveLocation(BDLocation result) {
			if (result != null) {
				MyLocationData data = new MyLocationData.Builder()
						.latitude(result.getLatitude())
						.longitude(result.getLongitude()).build();
				baiduMap.setMyLocationData(data);
			}
		}

	}
	
	@Override
	protected void onStart() {
		mLocationClient.start();
		super.onStart();
	}

	@Override
	protected void onPause() {
		mLocationClient.stop();
		super.onPause();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值