码迷,mamicode.com
首页 > 其他好文 > 详细

百度地图demo

时间:2015-01-30 16:09:30      阅读:396      评论:0      收藏:0      [点我收藏+]

标签:

包含了百度地图的定位,覆盖物,poi搜索,路线搜索,地理编码等功能

技术分享

第一步,申请key,具体见百度地图官网:http://developer.baidu.com/map/index.php?title=android-locsdk

第二步,在manifest.xml中添加key以及百度地图的权限,如下:

<span style="font-family:Microsoft YaHei;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bmaptest"
    android:versionCode="1"
    android:versionName="1.0" >
    <!-- 百度地图权限 -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />  
	<uses-permission android:name="android.permission.USE_CREDENTIALS" />  
	<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />  
	<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />  
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
	<uses-permission android:name="android.permission.INTERNET" />  
	<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />  
	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
	<uses-permission android:name="android.permission.READ_PHONE_STATE" />  
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
	<uses-permission android:name="android.permission.BROADCAST_STICKY" />  
	<uses-permission android:name="android.permission.WRITE_SETTINGS" />  
	<uses-permission android:name="android.permission.READ_PHONE_STATE" />
	<!-- 百度地图定位功能所需权限 --> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />      
    <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />    
    <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />    
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />      
    <uses-permission android:name="android.permission.ACCESS_GPS"/>      
    <uses-permission android:name="android.permission.READ_LOGS" /> 
    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="15" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.example.bmaptest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.baidu.location.service_v2.2" >
                </action>
            </intent-filter>
        </service>

        <!-- meta-data需要写在application中 -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="6Hkv9hnwUfcG8X5LiPW7548z"/>
    </application>

</manifest>
</span>

第三步,布局文件中加入mapview

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
	<LinearLayout android:id="@+id/l1"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:orientation="horizontal">
	    <Button android:id="@+id/dingwei"
	        android:layout_width="fill_parent"
	        android:layout_height="fill_parent"
	        android:text="定位"
	        android:layout_weight="1"
	        android:textSize="10sp"/>
	    <Button android:id="@+id/poisearch"
	        android:layout_width="fill_parent"
	        android:layout_height="fill_parent"
	        android:text="POI搜索"
	        android:layout_weight="1"
	        android:textSize="10sp"/>
	     <Button android:id="@+id/routesearch"
	        android:layout_width="fill_parent"
	        android:layout_height="fill_parent"
	        android:text="路线搜索"
	        android:layout_weight="1"
	        android:textSize="10sp"/>
	     <Button android:id="@+id/geocode"
	        android:layout_width="fill_parent"
	        android:layout_height="fill_parent"
	        android:text="地理编码"
	        android:layout_weight="1"
	        android:textSize="10sp"/>
	</LinearLayout>
    <com.baidu.mapapi.map.MapView  
        android:layout_below="@id/l1"
	    android:id="@+id/bmapView"  
	    android:layout_width="fill_parent"  
	    android:layout_height="fill_parent"  
	    android:clickable="true" />

</RelativeLayout>


第四步,代码如下:

<span style="font-family:Microsoft YaHei;">package com.example.bmaptest;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMarkerDragListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.overlayutil.PoiOverlay;
import com.baidu.mapapi.overlayutil.TransitRouteOverlay;
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.geocode.GeoCodeOption;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
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.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.baidu.mapapi.search.route.DrivingRouteResult;
import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;
import com.baidu.mapapi.search.route.PlanNode;
import com.baidu.mapapi.search.route.RoutePlanSearch;
import com.baidu.mapapi.search.route.TransitRoutePlanOption;
import com.baidu.mapapi.search.route.TransitRouteResult;
import com.baidu.mapapi.search.route.WalkingRouteResult;
import com.example.bmaptest.R;

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

public class MainActivity extends Activity implements BDLocationListener,OnClickListener{

	private MapView mMapView;
	private BaiduMap mBaiduMap;
	private LatLng point;
	private OverlayOptions option;
	private Marker marker;
	private OverlayOptions textOption;
	/**
	 * 定位的客户端
	 */
	private LocationClient mLocationClient;
	/**
	 * 当前定位的模式
	 */
//	private LocationMode mCurrentMode = LocationMode.NORMAL;
	/***
	 * 是否是第一次定位
	 */
	private volatile boolean isFristLocation = true;
	private com.baidu.mapapi.search.poi.PoiSearch mPoiSearch;
	/**
	 * 初始化定位相关代码
	 */

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//在使用SDK各组件之前初始化context信息,传入ApplicationContext  
        //注意该方法要再setContentView方法之前实现  
        SDKInitializer.initialize(getApplicationContext()); 
		setContentView(R.layout.activity_main);
		
		
		Button dingweiButton = (Button)findViewById(R.id.dingwei);
		dingweiButton.setOnClickListener(this);
		Button poisearchButton = (Button)findViewById(R.id.poisearch);
		poisearchButton.setOnClickListener(this);
		Button routesearchButton = (Button)findViewById(R.id.routesearch);
		routesearchButton.setOnClickListener(this);
		Button geocodeButton = (Button)findViewById(R.id.geocode);
		geocodeButton.setOnClickListener(this);
		//获取地图控件引用  
		mMapView = (MapView) findViewById(R.id.bmapView); 
		mBaiduMap = mMapView.getMap(); 
		//普通地图  
		mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);  
		//卫星地图  
//		mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
		//开启交通图   
		mBaiduMap.setTrafficEnabled(true);
		//定义Maker坐标点  
		point = new LatLng(39.963175, 116.400244); 
		//构建Marker图标  
		BitmapDescriptor bitmap = BitmapDescriptorFactory  
		    .fromResource(R.drawable.ic_launcher);
		option = new MarkerOptions()
	    .position(point)  //设置marker的位置
	    .icon(bitmap)  //设置marker图标
	    .zIndex(9)  //设置marker所在层级
	    .draggable(true);  //设置手势拖拽
		//将marker添加到地图上
		marker = (Marker)(mBaiduMap.addOverlay(option));
		mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
			
			@Override
			public boolean onMarkerClick(Marker arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "OnMarkerClick", Toast.LENGTH_SHORT)
		    	.show();
				//创建InfoWindow展示的view
				TextView textView = new TextView(getApplicationContext());
				textView.setText("marker");
				//创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量 
				InfoWindow mInfoWindow = new InfoWindow(textView, point, 0); 
				//显示InfoWindow  
				mBaiduMap.showInfoWindow(mInfoWindow);
				return false;
			}
		});
		//调用BaiduMap对象的setOnMarkerDragListener方法设置marker拖拽的监听
		mBaiduMap.setOnMarkerDragListener(new OnMarkerDragListener() {
		    public void onMarkerDrag(Marker marker) {
		        //拖拽中
		    	Toast.makeText(MainActivity.this, "onMarkerDrag", Toast.LENGTH_SHORT)
		    	.show();
		    }
		    public void onMarkerDragEnd(Marker marker) {
		        //拖拽结束
		    	Toast.makeText(MainActivity.this, "onMarkerDragEnd", Toast.LENGTH_SHORT)
		    	.show();
		    }
		    public void onMarkerDragStart(Marker marker) {
		        //开始拖拽
		    	Toast.makeText(MainActivity.this, "onMarkerDragStart", Toast.LENGTH_SHORT)
		    	.show();
		    }
		});
        textOption = new TextOptions()  
		    .bgColor(0xAAFFFF00)  
		    .fontSize(24)  
		    .fontColor(0xFFFF00FF)  
		    .text("百度地图SDK")  
		    .rotate(-30)  
		    .position(point);  
		//在地图上添加该文字对象并显示
        mBaiduMap.addOverlay(textOption);
        // 开启定位图层  
        mBaiduMap.setMyLocationEnabled(true); 
       
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.dingwei:
			initMyLocation();
			break;
		case R.id.poisearch:
			poiSearch();
			break;
		case R.id.routesearch:
			routeSearch(); 
			break;
		case R.id.geocode:
			geocodeSearch();
			break;
		default:
			break;
		}
	}
	

	private void geocodeSearch() {
		// TODO Auto-generated method stub
		GeoCoder mSearch = GeoCoder.newInstance();
		mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
			
			@Override
			public void onGetReverseGeoCodeResult(ReverseGeoCodeResult arg0) {
				 if (arg0 == null || arg0.error != SearchResult.ERRORNO.NO_ERROR) {  
			            //没有找到检索结果  
			        }  
			        //获取反向地理编码结果  
			}
			
			@Override
			public void onGetGeoCodeResult(GeoCodeResult arg0) {
				if (arg0 == null || arg0.error != SearchResult.ERRORNO.NO_ERROR) {  
		            //没有检索到结果
					Toast.makeText(MainActivity.this, "没有检索到结果", Toast.LENGTH_SHORT).show();
		        }  
		        //获取地理编码结果  
				Toast.makeText(MainActivity.this,arg0.getLocation().toString(), Toast.LENGTH_SHORT).show();
			}
		});
		mSearch.geocode(new GeoCodeOption()  
	    .city("北京")  
	    .address("海淀区上地十街10号"));
//		mSearch.destroy();
	}
	private void routeSearch() {
		// TODO Auto-generated method stub
		//第一步,创建检索实例
		RoutePlanSearch mSearch = RoutePlanSearch.newInstance();
		//设置监听器
		mSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
			
			@Override
			public void onGetWalkingRouteResult(WalkingRouteResult arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onGetTransitRouteResult(TransitRouteResult arg0) {
				if (arg0 == null || arg0.error != SearchResult.ERRORNO.NO_ERROR) {  
		            Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();  
		        }  
				 if (arg0.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {  
			            //起终点或途经点地址有岐义,通过以下接口获取建议查询信息  
			            //result.getSuggestAddrInfo()  
					 Toast.makeText(MainActivity.this, "起终点或途经点地址有岐义", Toast.LENGTH_SHORT).show();  
			            return;  
			    } 
				 if (arg0.error == SearchResult.ERRORNO.NO_ERROR) {  
					 Toast.makeText(MainActivity.this, "结果如下", Toast.LENGTH_SHORT).show();
			            TransitRouteOverlay overlay = new TransitRouteOverlay(mBaiduMap);  
			            mBaiduMap.setOnMarkerClickListener(overlay);  
			            overlay.setData(arg0.getRouteLines().get(0));  
			            overlay.addToMap();  
			            overlay.zoomToSpan();  
			    }  
			}
			
			@Override
			public void onGetDrivingRouteResult(DrivingRouteResult arg0) {
				// TODO Auto-generated method stub
				
			}
		});
		//准备检索起、终点信息;
		PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "龙泽");  
		PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "西单");
		//发起公交线路规划检索;
		mSearch.transitSearch((new TransitRoutePlanOption())  
			    .from(stNode)  
			    .city("北京")  
			    .to(enNode));
		//释放检索实例;
//		mSearch.destroy();
	}



	private void poiSearch() {
		mPoiSearch = PoiSearch.newInstance();
		//第二步,设置POI检索监听者
		mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
			
			@Override
			public void onGetPoiResult(PoiResult arg0) {
				if (arg0 == null
						|| arg0.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
					Toast.makeText(MainActivity.this, "未找到结果", Toast.LENGTH_LONG)
					.show();
					return;
				}
				if (arg0.error == SearchResult.ERRORNO.NO_ERROR) {
					mBaiduMap.clear();
					PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);
					mBaiduMap.setOnMarkerClickListener(overlay);
					overlay.setData(arg0);
					overlay.addToMap();
					overlay.zoomToSpan();
					return;
				}
				if (arg0.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {

					// 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
					String strInfo = "在";
					for (CityInfo cityInfo : arg0.getSuggestCityList()) {
						strInfo += cityInfo.city;
						strInfo += ",";
					}
					strInfo += "找到结果";
					Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG)
							.show();
				}				
			}
			
			@Override
			public void onGetPoiDetailResult(PoiDetailResult arg0) {
				// TODO Auto-generated method stub
				if (arg0.error != SearchResult.ERRORNO.NO_ERROR) {
					Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT)
							.show();
				} else {
					Toast.makeText(MainActivity.this, arg0.getName() + ": " + arg0.getAddress(), Toast.LENGTH_SHORT)
					.show();
				}
			}
		});
		//第三步,发起检索请求;
		mPoiSearch.searchInCity((new PoiCitySearchOption())  
			    .city("北京")  
			    .keyword("美食")  
			    .pageNum(10));
		//第四步,释放POI检索实例;
//		mPoiSearch.destroy();
	}
	private class MyPoiOverlay extends PoiOverlay {

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

		@Override
		public boolean onPoiClick(int index) {
			super.onPoiClick(index);
			PoiInfo poi = getPoiResult().getAllPoi().get(index);
				// if (poi.hasCaterDetails) {
				mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
						.poiUid(poi.uid));
			// }
			return true;
		}
	}


	private void initMyLocation()
	{
		// 定位初始化
		mLocationClient = new LocationClient(this.getApplicationContext());
		mLocationClient.registerLocationListener(this);
		// 设置定位的相关配置
		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true);// 打开gps
		option.setCoorType("bd09ll"); // 设置坐标类型
		option.setScanSpan(1000);
		mLocationClient.setLocOption(option);
		mLocationClient.requestLocation();  
        mLocationClient.start();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	@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();  
    }

	@Override
	public void onReceiveLocation(BDLocation arg0) {
		// TODO Auto-generated method stub
		StringBuffer sb = new StringBuffer(256);  
        sb.append("time : ");  
        sb.append(arg0.getTime());  
        sb.append("\nerror code : ");  
        sb.append(arg0.getLocType());  
        sb.append("\nlatitude : ");  
        sb.append(arg0.getLatitude());  
        sb.append("\nlontitude : ");  
        sb.append(arg0.getLongitude());  
        sb.append("\nradius : ");  
        sb.append(arg0.getRadius());
        System.out.println(sb);
		// 构造定位数据  
		MyLocationData locData = new MyLocationData.Builder()  
		    .accuracy(arg0.getRadius())  
		    // 此处设置开发者获取到的方向信息,顺时针0-360  
		    .direction(100).latitude(arg0.getLatitude())  
		    .longitude(arg0.getLongitude()).build();  
		// 设置定位数据  
		mBaiduMap.setMyLocationData(locData);  
		// 设置定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标)  
		LatLng latLng = new LatLng(arg0.getLatitude(), arg0.getLongitude());
		BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory  
		    .fromResource(R.drawable.pause);  
		option = new MarkerOptions()
	    .position(latLng)  //设置marker的位置
	    .icon(mCurrentMarker)  //设置marker图标
	    .draggable(false);  //设置手势拖拽
		//将marker添加到地图上
		mBaiduMap.addOverlay(option);
//		MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);  
//		mBaiduMap.setMyLocationConfiguration();  
		// 当不需要定位图层时关闭定位图层  
		mBaiduMap.setMyLocationEnabled(false);
	}
}
</span>


百度地图demo

标签:

原文地址:http://blog.csdn.net/u010335298/article/details/43304731

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