Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發 百度地圖之傳送一個詳細地址獲取在地圖上的位置

Android開發 百度地圖之傳送一個詳細地址獲取在地圖上的位置

編輯:關於Android編程

要求點擊一個地址,直接調用百度地圖,將地址顯示到百度地圖上,參數只有一個地址,沒有對應的坐標,這就想到了以前做的地圖是傳送一個坐標,將該地址顯示到地圖上,就有了這樣的思路:怎麼將一個詳細地址轉換成坐標,然後再傳送給百度地圖,但是這樣做好像是雖然能把詳細地址轉換成坐標,但是這個是在顯示地址之後轉換的所以就出現了空指針,具體就沒再研究,覺得再換一種思路,就在網上看到了百度地圖的api上面有一個輸入地址點擊搜索就會在將該地址顯示到了地圖上,覺得這個應該就可以,於是好好看了一下百度demo中的GeoCoder這個java文件,這個就是輸入一個地址,點擊搜索按鈕直接顯示將地址顯示在地圖上的,點擊搜索是調用的MKSearch的geocode("詳細地址","具體城市"),然後我就在我的調用地圖的那個界面 初始化地圖之後就調用了這個方法,點擊進入之後,就一直在加載,顯示不出來位置,我這裡跟他的唯一區別就是百度地圖demo是點擊觸發這個事件,而我是初始化地圖後就調用該方法。但是這是為什麼呢,我的為什麼一直就加載中,但是不顯示呢。

一下代碼是百度地圖demo的代碼

// 初始化搜索模塊,注冊事件監聽
        mSearch = new MKSearch();
        mSearch.init(app.mBMapMan, new MKSearchListener() {
            @Override
            public void onGetPoiDetailSearchResult(int type, int error) {
            }
            
			public void onGetAddrResult(MKAddrInfo res, int error) {
				if (error != 0) {
					String str = String.format("錯誤號:%d", error);
					Toast.makeText(GeoCoder.this, str, Toast.LENGTH_LONG).show();
					return;
				}

				mMapView.getController().animateTo(res.geoPt);
					
				String strInfo = String.format("緯度:%f 經度:%f\r\n", res.geoPt.getLatitudeE6()/1e6, 
							res.geoPt.getLongitudeE6()/1e6);

				Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show();
				Drawable marker = getResources().getDrawable(R.drawable.iconmarka);  //得到需要標在地圖上的資源
				marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker
						.getIntrinsicHeight());   //為maker定義位置和邊界
				mMapView.getOverlays().clear();
				mMapView.getOverlays().add(new OverItemT(marker, GeoCoder.this, res.geoPt, res.strAddr));
			}
			public void onGetPoiResult(MKPoiResult res, int type, int error) {
				if (error != 0 || res == null) {
					Toast.makeText(GeoCoder.this, "解析失敗", Toast.LENGTH_LONG).show();
					return;
				}
				if (res != null && res.getCurrentNumPois() > 0) {
					GeoPoint ptGeo = res.getAllPoi().get(0).pt;
					// 移動地圖到該點:
					mMapView.getController().animateTo(ptGeo);
					
					String strInfo = String.format("緯度:%f 經度:%f\r\n", ptGeo.getLatitudeE6()/1e6, 
							ptGeo.getLongitudeE6()/1e6);
					strInfo += "\r\n附近有:";
					for (int i = 0; i < res.getAllPoi().size(); i++) {
						strInfo += (res.getAllPoi().get(i).name + ";");
					}
					Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show();
				}
			}
			public void onGetDrivingRouteResult(MKDrivingRouteResult res,
					int error) {
			}
			public void onGetTransitRouteResult(MKTransitRouteResult res,
					int error) {
			}
			public void onGetWalkingRouteResult(MKWalkingRouteResult res,
					int error) {
			}
			public void onGetBusDetailResult(MKBusLineResult result, int iError) {
			}
			@Override
			public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
				// TODO Auto-generated method stub
				
			}
            @Override
            public void onGetRGCShareUrlResult(String arg0, int arg1) {
                // TODO Auto-generated method stub
                
            }

        });

EditText editCity = (EditText)findViewById(R.id.city);
			EditText editGeoCodeKey = (EditText)findViewById(R.id.geocodekey);
			mSearch.geocode(editGeoCodeKey.getText().toString(), editCity.getText().toString());



後來網友就說該方法是被動的方法,要主動調用,建議用一個線程去調用,我就在初始化地圖之後,寫了一個線程,在線程裡調用MKSearch的geocode("詳細地址","具體城市")方法,果然加載成功了。但是有一個問題是,我必須的點擊一下屏幕,地圖才刷新,有開始在網上搜,說是把AndroidMainfest.xml文件中的androidmanifest 的android:targetSdkVersion="10"去掉就可以了,果然成功了!

在說一下,這個是成功了,但是還有一個問題,讓地址顯示到地圖上之後,還想彈出一個詳細地址,一直放到地圖上,現在是可以將地標放到地圖上,如下代碼,該代碼寫到監聽事件中MKSearchListener()

Drawable marker = getResources().getDrawable(R.drawable.point_start);  //得到需要標在地圖上的資源
				marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker
						.getIntrinsicHeight());   //為maker定義位置和邊界
				View mPopView = getLayoutInflater().inflate(R.layout.popview2, null);
				OverItemT overItemT = new OverItemT(marker, LocationActivity.this, res.geoPt, res.strAddr);


但是我想彈出個詳細地址的泡泡,這該怎麼做呢,百度地圖demo中還有一個ItemizedOverlayDemo這個Java類是可以顯示泡泡的,但是這個是點擊地標之後會彈出泡泡,如下代碼如下

// 處理當點擊事件
	protected boolean onTap(int i) {
		setFocus(mGeoList.get(i));
		// 更新氣泡位置,並使之顯示
		GeoPoint pt = mGeoList.get(i).getPoint();
		ItemizedOverlayDemo.mMapView.updateViewLayout( ItemizedOverlayDemo.mPopView,
                new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
                		pt, MapView.LayoutParams.BOTTOM_CENTER));
		ItemizedOverlayDemo.mPopView.setVisibility(View.VISIBLE);
		Toast.makeText(this.mContext, mGeoList.get(i).getSnippet(),
				Toast.LENGTH_SHORT).show();
		return true;
	}


哈哈,我把改代碼寫到了

我把以上代碼寫到了MKSearchListener()這個監聽事件裡,但是這時會報錯,原來是因為我沒有將彈出氣泡添加到地圖裡就update了,應該在MKSearchListener()這個監聽事件加上如下代碼

// 創建點擊mark時的彈出泡泡
		mPopView=super.getLayoutInflater().inflate(R.layout.popview, null);
		mMapView.addView( mPopView,
                new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
                		null, MapView.LayoutParams.TOP_LEFT));
		mPopView.setVisibility(View.GONE);


加上代碼之後就可以在地標的圖片位置有彈出的詳細地址泡泡了,但是這時候就是彈出的泡泡跟地標圖片重疊了,剛開始我想在update處改一下泡泡的位置,但是這個不是簡單的

point,所以後來我想到了修改泡泡的layout文件,哈哈,最後就成功了。

代碼下載地址如下:http://download.csdn.net/detail/ladyweiwei1234/7129687

參考百度地圖demo下載地址如下(1.3.5版本):http://download.csdn.net/detail/ladyweiwei1234/7129701


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved