百度Android地图SDK地理编码及标注

解决问题

在百度地图上标注大量地址,如“海淀区上地十街10

工具

eclipse+ADT,百度Android地图SDK v3.6.0

效果展示

图中包含绿色的标记“起”以及红色标记“A”,从而可以在地图上直观的查看“起”与其他标注之间的位置关系,支持缩放。

百度Android地图SDK地理编码及标注_第1张图片

问题分解

1、地理编码,将地址转换为经纬度

第一步,创建地理编码检索实例;

mSearch = GeoCoder.newInstance();

第二步,创建地理编码检索监听者;

OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {  
    public void onGetGeoCodeResult(GeoCodeResult result) {  
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
            //没有检索到结果  
        }  
        //获取地理编码结果  
    }  
 
    @Override  
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {  
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
            //没有找到检索结果  
        }  
        //获取反向地理编码结果  
    }  
};

第三步,设置地理编码检索监听者;

mSearch.setOnGetGeoCodeResultListener(listener);

第四步,发起地理编码检索;

mSearch.geocode(new GeoCodeOption()  
    .city(“北京”)  
    .address(“海淀区上地十街10号”);

1、标注,在地图上根据经纬度添加图标

//定义Maker坐标点  
LatLng point = new LatLng(39.963175, 116.400244);  
//构建Marker图标  
BitmapDescriptor bitmap = BitmapDescriptorFactory  
    .fromResource(R.drawable.icon_marka);  
//构建MarkerOption,用于在地图上添加Marker  
OverlayOptions option = new MarkerOptions()  
    .position(point)  
    .icon(bitmap);  
//在地图上添加Marker,并显示  
mBaiduMap.addOverlay(option);

常见错误:

(a)



通常是因为AK码有误,按照官网教程仔细填写即可。


(b)onGetCodeResult报错
OnGetGeoCoderResultListener geoListener = new OnGetGeoCoderResultListener() {
		public void onGetGeoCodeResult(GeoCodeResult result) {
			if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
				// 没有检索到结果
				Log.e(LOGSTR, "adress to LatLng error!" + result.error);
			} else {
				// 获取地理编码结果
				LatLng addressTemp = result.getLocation();
				Log.w(LOGSTR, "ADDRESS:" + addressTemp.latitude + ";"
						+ addressTemp.longitude);
				posList.add(addressTemp);
				Log.w(LOGSTR, "size of list1:"+ posList.size());
				
			}
		}

		@Override
		public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
			if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
				// 没有找到检索结果
			}
			// 获取反向地理编码结果
		}
	};



通常是由于程序在SDK初始化之后立即触发了监听器,而此时权鉴还没完成,所以要在地图SDK初始化完成过一段时间之后再触发监听器。
SDKInitializer.initialize(getApplicationContext());

(c)GeoCoder连续触发OnGetGeoCoderResultListener监听器结果返回的地理位置信息错误,原因是所有的search接口,都必须完成一次后再发起第二次,如果有几个并发的需求,就需要new几个对象分别做。


程序主要代码:

public class MainActivity extends Activity {
	GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
	BaiduMap mBaiduMap = null;
	MapView mMapView = null;
	private static final String LOGSTR = "Jerry";
	BitmapDescriptor bitmapA = null;
	BitmapDescriptor bitmapStart = null;
	ArrayList posList = null; 
	ArrayList addressList = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
		// 注意该方法要再setContentView方法之前实现
		SDKInitializer.initialize(getApplicationContext());

		setContentView(R.layout.activity_main);

		if (savedInstanceState == null) {
			getFragmentManager().beginTransaction()
					.add(R.id.container, new PlaceholderFragment()).commit();
		}
		
		posList = new ArrayList();
		addressList = new ArrayList();
		initializeAddressList();
		
		// 获取地图控件引用
		mMapView = (MapView) findViewById(R.id.bmapView);
		Log.w(LOGSTR, "initialize view success!");
		mBaiduMap = mMapView.getMap();
		Log.w(LOGSTR, "initialize baidumap success!");
		// 初始化搜索模块,注册事件监听
		mSearch = GeoCoder.newInstance();
		Log.w(LOGSTR, "initialize GeoCoder success!");
		bitmapA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
		bitmapStart = BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
		
		Log.w(LOGSTR, "initialize bitmap success!");
		mSearch.setOnGetGeoCodeResultListener(geoListener);
		Log.w(LOGSTR, "add listener success!");
		
		//在MenuItem中显示地址标注,见onOptionsItemSelected
	}

	OnGetGeoCoderResultListener geoListener = new OnGetGeoCoderResultListener() {
		public void onGetGeoCodeResult(GeoCodeResult result) {
			if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
				// 没有检索到结果
				Log.e(LOGSTR, "adress to LatLng error!" + result.error);
			} else {
				// 获取地理编码结果
				LatLng addressTemp = result.getLocation();
				Log.w(LOGSTR, "ADDRESS:" + addressTemp.latitude + ";"
						+ addressTemp.longitude);
				posList.add(addressTemp);
				Log.w(LOGSTR, "size of list1:"+ posList.size());
				
			}
		}

		@Override
		public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
			if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
				// 没有找到检索结果
			}
			// 获取反向地理编码结果
		}
	};

	@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;
	}

	private void littleSleep(){
		try {
			Thread.sleep(300);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_show){
			Log.w(LOGSTR, "meu item Show");
			mBaiduMap.clear();
			int len = posList.size();
			MarkerOptions option = new MarkerOptions().position(posList.get(0)).icon(bitmapStart).visible(true);
			//掉下动画
			option.animateType(MarkerAnimateType.drop);
			// 在地图上添加Marker,并显示
			mBaiduMap.addOverlay(option);

			littleSleep();
			for(int i=1; i





你可能感兴趣的:(Android开发)