[010] 百度地圖API之根據經緯度查詢地址資訊(Android)

來源:互聯網
上載者:User

      本文主要講解如何通過百度地圖API根據某個經緯度值(地理座標)查詢對應的地址資訊以及該地址周邊的POI(Point of Interest,興趣點)資訊。
      百度地圖移動版API不僅包含構建地圖的基本介面,還整合了眾多搜尋服務,包括:位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索、地址資訊查詢等。
      百度地圖移動版API提供的搜尋服務主要是通過初始化MKSearch類,註冊搜尋結果的監聽對象MKSearchListener來實現非同步搜尋服務。首先需要自訂一個MySearchListener類,它實現MKSearchListener介面,然後通過實現介面中不同的回調方法,來獲得對應的搜尋結果。MySearchListener類的定義如下:
      /**<br /> * 實現MKSearchListener介面,用於實現非同步搜尋服務,得到搜尋結果<br /> *<br /> * @author liufeng<br /> */<br />public class MySearchListener implements MKSearchListener {<br />/**<br /> * 根據經緯度搜尋地址資訊結果<br /> * @param result 搜尋結果<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetAddrResult(MKAddrInfo result, int iError) {<br />}</p><p>/**<br /> * 駕車路線搜尋結果<br /> * @param result 搜尋結果<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {<br />}</p><p>/**<br /> * POI搜尋結果(範圍檢索、城市POI檢索、周邊檢索)<br /> * @param result 搜尋結果<br /> * @param type 返回結果類型(11,12,21:poi列表 7:城市列表)<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetPoiResult(MKPoiResult result, int type, int iError) {<br />}</p><p>/**<br /> * 公交轉乘路線搜尋結果<br /> * @param result 搜尋結果<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {<br />}</p><p>/**<br /> * 步行路線搜尋結果<br /> * @param result 搜尋結果<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {<br />}<br />}
說明:上面的類定義只是在說明MKSearchListener類的5個方法的作用,全都是空實現,並未給出具體的實現。根據你要檢索的內容,再去具體實現上面對應的方法,就能擷取到搜尋結果。例如:1)你想通過一個地理座標(經緯度值)來搜尋地址資訊,那麼只需要具體實現上面的onGetAddrResult()方法就能得到搜尋結果;2)如果你想搜尋駕車路線資訊,只需要具體實現onGetDrivingRouteResult()方法就能得到搜尋結果。

緊接著,需要初始化MKSearch類:
      // 初始化MKSearch<br />mMKSearch = new MKSearch();<br />mMKSearch.init(mapManager, new MySearchListener());
經過上面兩步之後,就可以通過調用MKSearch所提供的一些檢索方法來搜尋你想要的資訊了。
      下面給出一個具體的樣本:根據某個經緯度值(地理座標)查詢對應的地址資訊以及該地址周邊的POI(Point of Interest,興趣點)資訊。
1)布局檔案res/layout/query_address.xml
      <?xml version="1.0" encoding="utf-8"?><br /><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"<br />android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"><br /><LinearLayout<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /> <TextView<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="經度:"<br /> /><br /> <EditText android:id="@+id/longitude_input"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="106.720397"<br /> /></p><p> <TextView<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="緯度:"<br /> /><br /> <EditText android:id="@+id/latitude_input"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="26.597239"<br /> /></p><p> <Button android:id="@+id/query_button"<br /> android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:layout_gravity="right"<br /> android:text="地址查詢"<br />/></p><p><TextView android:id="@+id/address_text"<br /> android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> /><br /> <!--<br /> 雖然定義了MapView,但是設定了android:visibility="gone"將其隱藏<br /> 因為本樣本並不需要顯示地圖,但不定義又不行(baidu map api的要求)<br /> --><br /> <com.baidu.mapapi.MapView android:id="@+id/map_View"<br />android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> android:clickable="true"<br /> android:visibility="gone"<br /> /><br /></LinearLayout><br /></ScrollView>
2)繼承com.baidu.mapapi.MapActivity的Activity類
      package com.liufeng.baidumap;</p><p>import android.os.Bundle;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.widget.Button;<br />import android.widget.EditText;<br />import android.widget.TextView;</p><p>import com.baidu.mapapi.BMapManager;<br />import com.baidu.mapapi.GeoPoint;<br />import com.baidu.mapapi.MKAddrInfo;<br />import com.baidu.mapapi.MKDrivingRouteResult;<br />import com.baidu.mapapi.MKPoiInfo;<br />import com.baidu.mapapi.MKPoiResult;<br />import com.baidu.mapapi.MKSearch;<br />import com.baidu.mapapi.MKSearchListener;<br />import com.baidu.mapapi.MKTransitRouteResult;<br />import com.baidu.mapapi.MKWalkingRouteResult;<br />import com.baidu.mapapi.MapActivity;</p><p>/**<br /> * 根據經緯度查詢地址資訊<br /> *<br /> * @author liufeng<br /> * @date 2011-05-03<br /> */<br />public class QueryAddressActivity extends MapActivity {<br />// 定義地圖引擎管理類<br />private BMapManager mapManager;<br />// 定義搜尋服務類<br />private MKSearch mMKSearch;</p><p>private EditText longitudeEditText;<br />private EditText latitudeEditText;<br />private TextView addressTextView;<br />private Button queryButton;</p><p>@Override<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.query_address);</p><p>// 初始化MapActivity<br />mapManager = new BMapManager(getApplication());<br />// init方法的第一個參數需填入申請的API Key<br />mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);<br />super.initMapActivity(mapManager);</p><p>// 初始化MKSearch<br />mMKSearch = new MKSearch();<br />mMKSearch.init(mapManager, new MySearchListener());</p><p>// 通過id查詢在布局檔案中定義的控制項<br />longitudeEditText = (EditText) findViewById(R.id.longitude_input);<br />latitudeEditText = (EditText) findViewById(R.id.latitude_input);<br />addressTextView = (TextView) findViewById(R.id.address_text);<br />queryButton = (Button) findViewById(R.id.query_button);</p><p>// 給地址查詢按鈕設定單擊事件監聽器<br />queryButton.setOnClickListener(new OnClickListener() {<br />@Override<br />public void onClick(View v) {<br />// 使用者輸入的經度值<br />String longitudeStr = longitudeEditText.getText().toString();<br />// 使用者輸入的緯度值<br />String latitudeStr = latitudeEditText.getText().toString();</p><p>try {<br />// 將使用者輸入的經緯度值轉換成int類型<br />int longitude = (int) (1000000 * Double.parseDouble(longitudeStr));<br />int latitude = (int) (1000000 * Double.parseDouble(latitudeStr));</p><p>// 查詢該經緯度值所對應的地址位置資訊<br />mMKSearch.reverseGeocode(new GeoPoint(latitude, longitude));<br />} catch (Exception e) {<br />addressTextView.setText("查詢出錯,請檢查您輸入的經緯度值!");<br />}<br />}<br />});<br />}</p><p>@Override<br />protected boolean isRouteDisplayed() {<br />return false;<br />}</p><p>@Override<br />protected void onDestroy() {<br />if (mapManager != null) {<br />// 程式退出前需調用此方法<br />mapManager.destroy();<br />mapManager = null;<br />}<br />super.onDestroy();<br />}</p><p>@Override<br />protected void onPause() {<br />if (mapManager != null) {<br />// 終止百度地圖API<br />mapManager.stop();<br />}<br />super.onPause();<br />}</p><p>@Override<br />protected void onResume() {<br />if (mapManager != null) {<br />// 開啟百度地圖API<br />mapManager.start();<br />}<br />super.onResume();<br />}</p><p>/**<br /> * 內部類實現MKSearchListener介面,用於實現非同步搜尋服務<br /> *<br /> * @author liufeng<br /> */<br />public class MySearchListener implements MKSearchListener {<br />/**<br /> * 根據經緯度搜尋地址資訊結果<br /> *<br /> * @param result 搜尋結果<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetAddrResult(MKAddrInfo result, int iError) {<br />if (result == null) {<br />return;<br />}<br />StringBuffer sb = new StringBuffer();<br />// 經緯度所對應的位置<br />sb.append(result.strAddr).append("/n");</p><p>// 判斷該地址附近是否有POI(Point of Interest,即興趣點)<br />if (null != result.poiList) {<br />// 遍曆所有的興趣點資訊<br />for (MKPoiInfo poiInfo : result.poiList) {<br />sb.append("----------------------------------------").append("/n");<br />sb.append("名稱:").append(poiInfo.name).append("/n");<br />sb.append("地址:").append(poiInfo.address).append("/n");<br />sb.append("經度:").append(poiInfo.pt.getLongitudeE6() / 1000000.0f).append("/n");<br />sb.append("緯度:").append(poiInfo.pt.getLatitudeE6() / 1000000.0f).append("/n");<br />sb.append("電話:").append(poiInfo.phoneNum).append("/n");<br />sb.append("郵編:").append(poiInfo.postCode).append("/n");<br />// poi類型,0:普通點,1:公交站,2:公交線路,3:地鐵站,4:地鐵線路<br />sb.append("類型:").append(poiInfo.ePoiType).append("/n");<br />}<br />}<br />// 將地址資訊、興趣點資訊顯示在TextView上<br />addressTextView.setText(sb.toString());<br />}</p><p>/**<br /> * 駕車路線搜尋結果<br /> *<br /> * @param result 搜尋結果<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {<br />}</p><p>/**<br /> * POI搜尋結果(範圍檢索、城市POI檢索、周邊檢索)<br /> *<br /> * @param result 搜尋結果<br /> * @param type 返回結果類型(11,12,21:poi列表 7:城市列表)<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetPoiResult(MKPoiResult result, int type, int iError) {<br />}</p><p>/**<br /> * 公交轉乘路線搜尋結果<br /> *<br /> * @param result 搜尋結果<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {<br />}</p><p>/**<br /> * 步行路線搜尋結果<br /> *<br /> * @param result 搜尋結果<br /> * @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {<br />}<br />}<br />}  
3)AndroidManifest.xml中的配置
      <?xml version="1.0" encoding="utf-8"?><br /><manifest xmlns:android="http://schemas.android.com/apk/res/android"<br /> package="com.liufeng.baidumap"<br /> android:versionCode="1"<br /> android:versionName="1.0"><br /> <application android:icon="@drawable/icon" android:label="@string/app_name"><br /> <activity android:name=".QueryAddressActivity" android:label="@string/app_name"><br /> <intent-filter><br /> <action android:name="android.intent.action.MAIN" /><br /> <category android:name="android.intent.category.LAUNCHER" /><br /> </intent-filter><br /> </activity><br /> </application><br /> <uses-sdk android:minSdkVersion="4" /></p><p> <!-- 訪問網路的許可權 --><br /> <uses-permission android:name="android.permission.INTERNET" /><br /><!-- 訪問精確位置的許可權 --><br /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><br /> <!-- 訪問網路狀態的許可權 --><br /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><br /> <!-- 訪問WIFI網路狀態的許可權 --><br /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><br /> <!-- 改變WIFI網路狀態的許可權 --><br /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><br /> <!-- 讀寫儲存卡的許可權 --><br /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><br /> <!-- 讀取電話狀態的許可權 --><br /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /><br /></manifest>
4)運行結果及說明
     
程式在模擬器上啟動並執行初始效果如所示。可以看出,地圖並沒有顯示出來,這和我們在設計時布局時所設想的一樣;另外兩個輸入框中也分別顯示了預設給出的經緯度值。
      點擊“地址查詢”按鈕後,將看到如所示包含了查詢結果的介面:
     
說明:圖上的“貴州省貴陽市雲岩區普陀路”正是我們要查詢的地理座標(經度:106.720397,緯度:26.597239)所對應的地址資訊;同時該地址資訊下方還顯示出了該地址附近的10個興趣點(POI),每個興趣點分別包含了“名稱”、“地址”、“經緯度”、“電話”、“郵編”和“興趣點類型”資訊。

備忘:如果本文的樣本繼續做下去,就應該將MapView顯示出來,同時結合第8篇文章“[008] 百度地圖API之ItemizedOverlay的使用(Android)”所介紹的內容將地址資訊和興趣點標註在地圖上。我想這兩方面的內容都已做過詳細講解並給出了樣本,再來實現這個應該並不是什麼難事,看文章的你就動動手來完成它吧!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.