天天看點

百度Android地圖SDK地理編碼及标注

解決問題:

在百度地圖上标注大量位址,如“海澱區上地十街10号”

工具:

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

效果展示:

圖中包含綠色的标記“起”以及紅色标記“A”,進而可以在地圖上直覺的檢視“起”與其他标注之間的位置關系,支援縮放。

百度Android地圖SDK地理編碼及标注

問題分解:

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)

百度Android地圖SDK地理編碼及标注

通常是因為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) {
				// 沒有找到檢索結果
			}
			// 擷取反向地理編碼結果
		}
	};
           
百度Android地圖SDK地理編碼及标注

通常是由于程式在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;
		}
	}

}
           

繼續閱讀