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

解决问题

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

工具

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

效果展示

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


问题分解

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<LatLng> posList = null; 
	ArrayList<String> 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<LatLng>();
		addressList = new ArrayList<String>();
		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<len; i++){
				MarkerOptions option1 = new MarkerOptions().position(posList.get(i)).icon(bitmapA).visible(true).zIndex(2);
				//掉下动画
				option1.animateType(MarkerAnimateType.drop);
				mBaiduMap.addOverlay(option1);
			}
			
			return true;
		}
		
		if (id == R.id.action_settings) {
			//显示地址
			posList.clear();
			int len = addressList.size();
			// 初始化搜索模块,注册事件监听
			GeoCoder searchTemp1 = GeoCoder.newInstance();
			searchTemp1.setOnGetGeoCodeResultListener(geoListener);
			searchTemp1.geocode(new GeoCodeOption().city("北京").address(addressList.get(0)));
			littleSleep();
			
			for(int i=1; i<len; i++){
				// 初始化搜索模块,注册事件监听
				GeoCoder searchTemp = GeoCoder.newInstance();
				searchTemp.setOnGetGeoCodeResultListener(geoListener);
				searchTemp.geocode(new GeoCodeOption().city("北京").address(addressList.get(i)));
			}
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
	private void initializeAddressList(){
		addressList.add("房山区良乡西路2号中大瑞祥市场一层+地下一层");
		addressList.add("房山区良乡地区拱辰大街家乐福首层北侧");
		addressList.add("房山区拱辰街道东羊庄村18号一层");
		addressList.add("丰台区西三环南路10号一层");
		addressList.add("丰台区太平桥西里甲1号");
		addressList.add("朝阳区甜水园北里16号楼一层");
		addressList.add("朝阳区甘露园南里25号朝阳园三期商业一层");
		addressList.add("北京市朝阳区姚家园路东口甲1号活力东方家乐福");
		addressList.add("海淀区清华东路2号金码大厦A座首层");
		addressList.add("海淀区双清路88号华源世纪商务楼一二层");
		addressList.add("海淀区学清路甲8号一层");
		addressList.add("海淀区宝盛北里西区28号楼一层和二层");
		addressList.add("海淀区清河镇华润五彩城商业一层");
		addressList.add("海淀区清河永泰庄路甲1号");
		addressList.add("海淀区清河毛纺路南甲36号金五星商业大厦");
		addressList.add("昌平区西三旗环岛东北角上  奥世纪中心商业办公楼2#A座一层+二层");
		addressList.add("昌平区回龙观东大街1号楼-1至2层的01的一层和二层");
		addressList.add("昌平区回龙观镇黄土店黄平路泰华龙旗广场3#商业楼一层");
		addressList.add("海淀区阜成路51-2");
		addressList.add("海淀区花园北路44号");
		addressList.add("海淀区西三环北路70号");
		addressList.add("海淀区学院南路50号首层及二层");
		addressList.add("海淀区花园路2号首层");
		addressList.add("海淀区学院路17号一,二层");
		addressList.add("海淀区学院路甲38号长城电脑大厦");
		addressList.add("海淀区北三环中路49号");
		addressList.add("海淀区北三环西路48号1#楼FA8商铺");
		addressList.add("海淀区上地东里一区4号楼一层西厅中部");
		addressList.add("海淀区成府路28号优盛大厦一层09号,二层019号");
		addressList.add("海淀区农大南路与信息路交叉口东北角华联F1+F2");
		addressList.add("海淀区万泉河路68号紫金大厦一层北侧");
		addressList.add("海淀区北洼路4号");
		addressList.add("海淀区海淀南路13号楼亿方大厦一、二层");
		addressList.add("海淀区亮甲店危改小区(南区)3号楼地上部分家乐福定慧桥店首层西侧");
		addressList.add("海淀区中关村大街19号新中关大厦B1");
		addressList.add("海淀区海淀大街3号鼎好电子大厦A座B1");
		addressList.add("海淀区中关村大街11号1层C1580号商铺");
		addressList.add("海淀区魏公村路5号");
		addressList.add("海淀区远大路远大居住区二期世纪金源大酒店一层东南角");
		addressList.add("海淀区远大路1号首层");
		addressList.add("海淀区巴沟路2号北京华联万柳购物中心一层");
		addressList.add("海淀区白石桥路甲54号家乐福超市一层西侧");
		addressList.add("海淀区复兴路12号恩菲科技大厦");
		addressList.add("海淀区五棵松路35号北京欧尚超市F1、B1");
		addressList.add("海淀区永定路88号长银大厦一层");
		addressList.add("海淀区知春路29号F1+F2");
		addressList.add("海淀区阜成路23号一层、二层");
		addressList.add("海淀区西直门北大街32号枫蓝国际中心商场B座一层  ");
		addressList.add("海淀区北三环西路大钟寺国际广场一层+二层");
		addressList.add("海淀区复兴路23号二层");
		addressList.add("海淀区复兴路甲23号");
		addressList.add("海淀区复兴路69号商场地下一层B1——111号及A1-05西南侧");
		addressList.add("海淀区复兴路32号院一区");
		addressList.add("宣武区宣武门外大街32号");
		addressList.add("西城区新街口北大街50号");
		addressList.add("西城区西外大街德宝新园14号");
		addressList.add("西城区复兴门外大街8号楼裙楼二层");
		addressList.add("西城区地安门外大街178号");
		addressList.add("西城区月坛南街乙71号");
		addressList.add("宣武区前门西大街正阳市场1号楼中部");
		addressList.add("宣武区宣武门东大街24号越秀饭店西配楼一层");
		addressList.add("宣武区马莲道路11号");
		addressList.add("宣武区白广路北口综合服务楼2楼首层");
		addressList.add("宣武区建功南里3号楼首层");
		addressList.add("宣武区广安门外大街甲180号中国新纪元大厦一层");
		addressList.add("西城区西单北大街堂子胡同9号地下一层");
		addressList.add("西城区新街口北大街1号1号楼一层");
		addressList.add("西城区西直门南大街甲15-6");
		addressList.add("西城区西直门外大街132号一层+地下一层");
		addressList.add("西城区车公庄大街丙4号一层+二层");
		addressList.add("西城区阜成门大街2号万通新世界商城地下一层");
		addressList.add("丰台区方庄芳古园一区商住楼8幢B1+F1");
		addressList.add("丰台区樊家村甲3号1层");
		addressList.add("丰台区丰管路16号11号楼首层十二号");
		addressList.add("丰台区西四环路甲88号");
		addressList.add("丰台区西四环南路8号-1号楼首层+二层");
		addressList.add("大兴区黄村卫星城兴丰街15号星城商厦一层北侧");
		addressList.add("大兴区黄村镇兴丰大街东侧火神庙商业中心F座商业楼一层");
		addressList.add("大兴区绿地中央广场乐购超市一层");
		addressList.add("大兴区西红门京良路南侧乐家商业中心西侧一层");
		addressList.add("通州区马驹桥镇9号百尚生活广场一层");
		addressList.add("北京经济开发区西环北路18号F1+F2");
		addressList.add("经济技术开发区天宝园五里二区A1+A2户一层");
		addressList.add("经济技术开发区文化园东路6号北京经开汇展中心1-2层");
		addressList.add("丰台区马家堡居住区中区公建(时帆大厦)1、2层");
		addressList.add("丰台区海户屯北京新世纪服装商贸城一层南侧");
		addressList.add("丰台区南四环中路城南嘉园益城园14号楼一、二层");
		addressList.add("北京丰台区南三环东路成寿寺路2号分钟寺阳光新生活购物广场");
		addressList.add("丰台区风格与林苑甲9号楼1层102");
		addressList.add("丰台区大红门西路26号银泰百货B1");
		addressList.add("朝阳区朝外大街东大桥路1号楼");
		addressList.add("朝阳区朝阳门外大街19号(一层东侧)");
		addressList.add("朝阳区金台里甲15号");
		addressList.add("朝阳区呼家楼京广中心首层");
		addressList.add("朝阳区工体北路11-1号");
		addressList.add("朝阳区团结湖路7号");
		addressList.add("朝阳区安慧里二区4号1、2、3层");
		addressList.add("朝阳区和平西街21号天丰利市场首层北侧F1");
		addressList.add("朝阳区小营东路3号北京凯基伦购物中心一层西侧");
		addressList.add("朝阳区惠新西街23号");
		addressList.add("朝阳区樱花园东街5号新化信北侧一、二层");
		addressList.add("延庆县东外大街4号首层大门西侧");
		addressList.add("北京市延庆县延庆镇妫水北街39号A座1层");
		addressList.add("门头沟区门头沟路1号首层");
		addressList.add("北京市门头沟区双峪环岛东南角熙旺中心一层");
		addressList.add("北京市门头沟区新桥大街80号京客隆一层+二层");
		addressList.add("朝阳区洼里乡北苑路东易初莲花超市一层");
		addressList.add("朝阳区安立路68号阳光广场一层西门北侧");
		addressList.add("朝阳区北苑路158号首层");
		addressList.add("平谷区新平北路世纪广场东侧祥和宾馆首层");
		addressList.add("密云县鼓楼南大街10号");
		addressList.add("密云县鼓楼南大街5号");
		addressList.add("怀柔区开放路东侧下元市场南侧京客隆一二层");
		addressList.add("西城区北三环中路18号");
		addressList.add("朝阳区左家庄新源街24号");
		addressList.add("朝阳区霄云路27号中国庆安大厦首层西侧");
		addressList.add("北京市朝阳区西坝河西里23号一层部分");
		addressList.add("朝阳区静安西街10号国展宾馆一层");
		addressList.add("北京市朝阳区曙光西里甲5号凤凰置地广场凤凰新天地B104号商铺");
		addressList.add("朝阳区劲松4区401楼");
		addressList.add("朝阳区松榆里28号楼松榆里商场一层北侧");
		addressList.add("朝阳区广渠路31号");
		addressList.add("北京市朝阳区潘家园东里甲30号楼");
		addressList.add("朝阳区东三环中路65号一层+地下一层");
		addressList.add("朝阳区广渠路南侧44号F1+F2");
		addressList.add("北京市朝阳区天辰东路8-10-12号");
		addressList.add("朝阳区林萃西里16号楼北京华润万家超市1层");
		addressList.add("朝阳区黄寺大街15号北京城乡黄寺商厦");
		addressList.add("北京市朝阳区祁家豁子8号");
		addressList.add("朝阳区胜古南里甲34号一层和二层");
		addressList.add("东四环路大郊亭商业街5号院东侧");
		addressList.add("朝阳区百子湾12号大成国际中心1号楼1层");
		addressList.add("朝阳区朝阳路十里堡5号云柏商厦一层西侧");
		addressList.add("朝阳区石佛营东里117号楼首层");
		addressList.add("朝阳区八里庄西里99号楼-1层106,107号");
		addressList.add("朝阳区南四环成寿寺路308号北京城外诚家居广场停车广场");
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class PlaceholderFragment extends Fragment {

		public PlaceholderFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.fragment_main, container,
					false);
			return rootView;
		}
	}

}





你可能感兴趣的:(百度,sdk,地图,标注,权鉴)