百度地图API之根据经纬度查询地址信息(Android)

本文主要讲解如何通过百度地图API根据某个经纬度值(地理坐标)查询对应的地址信息以及该地址周边的POI(Point of Interest,兴趣点)信息。

      百度地图移动版API不仅包含构建地图的基本接口,还集成了众多搜索服务,包括:位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索、地址信息查询等。

      百度地图移动版API提供的搜索服务主要是通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener来实现异步搜索服务。首先需要自定义一个MySearchListener类,它实现MKSearchListener接口,然后通过实现接口中不同的回调方法,来获得对应的搜索结果。MySearchListener类的定义如下:    

 
  1. /** 
  2.  * 实现MKSearchListener接口,用于实现异步搜索服务,得到搜索结果 
  3.  *  
  4.  * @author liufeng 
  5.  */  
  6. public class MySearchListener implements MKSearchListener {  
  7.     /** 
  8.      * 根据经纬度搜索地址信息结果 
  9.      * @param result 搜索结果 
  10.      * @param iError 错误号(0表示正确返回) 
  11.      */  
  12.     @Override  
  13.     public void onGetAddrResult(MKAddrInfo result, int iError) {  
  14.     }  
  15.   
  16.     /** 
  17.      * 驾车路线搜索结果 
  18.      * @param result 搜索结果 
  19.      * @param iError 错误号(0表示正确返回) 
  20.      */  
  21.     @Override  
  22.     public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {  
  23.     }  
  24.   
  25.     /** 
  26.      * POI搜索结果(范围检索、城市POI检索、周边检索) 
  27.      * @param result 搜索结果 
  28.      * @param type 返回结果类型(11,12,21:poi列表 7:城市列表) 
  29.      * @param iError 错误号(0表示正确返回) 
  30.      */  
  31.     @Override  
  32.     public void onGetPoiResult(MKPoiResult result, int type, int iError) {  
  33.     }  
  34.   
  35.     /** 
  36.      * 公交换乘路线搜索结果 
  37.      * @param result 搜索结果 
  38.      * @param iError 错误号(0表示正确返回) 
  39.      */  
  40.     @Override  
  41.     public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {  
  42.     }  
  43.   
  44.     /** 
  45.      * 步行路线搜索结果 
  46.      * @param result 搜索结果 
  47.      * @param iError 错误号(0表示正确返回) 
  48.      */  
  49.     @Override  
  50.     public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {  
  51.     }  
  52. }  
说明:上面的类定义只是在说明MKSearchListener类的5个方法的作用,全都是空实现,并未给出具体的实现。根据你要检索的内容,再去具体实现上面对应的方法,就能获取到搜索结果。例如:1)你想通过一个地理坐标(经纬度值)来搜索地址信息,那么只需要具体实现上面的onGetAddrResult()方法就能得到搜索结果;2)如果你想搜索驾车路线信息,只需要具体实现onGetDrivingRouteResult()方法就能得到搜索结果。

紧接着,需要初始化MKSearch类:    

 
  1. // 初始化MKSearch   
  2. mMKSearch = new MKSearch();  
  3. mMKSearch.init(mapManager, new MySearchListener());  

经过上面两步之后,就可以通过调用MKSearch所提供的一些检索方法来搜索你想要的信息了。
      下面给出一个具体的示例:根据某个经纬度值(地理坐标)查询对应的地址信息以及该地址周边的POI(Point of Interest,兴趣点)信息。
1)布局文件res/layout/query_address.xml      
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ScrollView xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.     Android:layout_width="fill_parent"  
  4.     Android:layout_height="fill_parent">  
  5.     <LinearLayout   
  6.         Android:orientation="vertical"  
  7.         Android:layout_width="fill_parent"  
  8.         Android:layout_height="fill_parent"  
  9.         >  
  10.         <TextView  
  11.             Android:layout_width="fill_parent"  
  12.             Android:layout_height="wrap_content"  
  13.             Android:text="经度:"  
  14.         />  
  15.         <EditText Android:id="@+id/longitude_input"  
  16.             Android:layout_width="fill_parent"  
  17.             Android:layout_height="wrap_content"   
  18.             Android:text="106.720397"  
  19.         />  
  20.           
  21.         <TextView  
  22.             Android:layout_width="fill_parent"  
  23.             Android:layout_height="wrap_content"  
  24.             Android:text="纬度:"  
  25.         />  
  26.         <EditText Android:id="@+id/latitude_input"  
  27.             Android:layout_width="fill_parent"  
  28.             Android:layout_height="wrap_content"   
  29.             Android:text="26.597239"  
  30.         />  
  31.       
  32.         <Button Android:id="@+id/query_button"  
  33.             Android:layout_width="wrap_content"  
  34.             Android:layout_height="wrap_content"  
  35.             Android:layout_gravity="right"  
  36.             Android:text="地址查询"  
  37.         />  
  38.           
  39.         <TextView Android:id="@+id/address_text"  
  40.             Android:layout_width="wrap_content"  
  41.             Android:layout_height="wrap_content"  
  42.         />  
  43.         <!--   
  44.             虽然定义了MapView,但是设置了Android:visibility="gone"将其隐藏  
  45.             因为本示例并不需要显示地图,但不定义又不行(baidu map api的要求)   
  46.         -->  
  47.         <com.baidu.mapapi.MapView Android:id="@+id/map_View"  
  48.             Android:layout_width="fill_parent"  
  49.             Android:layout_height="fill_parent"  
  50.             Android:clickable="true"  
  51.             Android:visibility="gone"  
  52.         />  
  53.     </LinearLayout>  
  54. </ScrollView>  
  55. 2)继承com.baidu.mapapi.MapActivity的Activity类     
    1. package com.liufeng.baidumap;  
    2. import Android.os.Bundle;  
    3. import Android.view.View;  
    4. import Android.view.View.OnClickListener;  
    5. import Android.widget.Button;  
    6. import Android.widget.EditText;  
    7. import Android.widget.TextView;  
    8.   
    9. import com.baidu.mapapi.BMapManager;  
    10. import com.baidu.mapapi.GeoPoint;  
    11. import com.baidu.mapapi.MKAddrInfo;  
    12. import com.baidu.mapapi.MKDrivingRouteResult;  
    13. import com.baidu.mapapi.MKPoiInfo;  
    14. import com.baidu.mapapi.MKPoiResult;  
    15. import com.baidu.mapapi.MKSearch;  
    16. import com.baidu.mapapi.MKSearchListener;  
    17. import com.baidu.mapapi.MKTransitRouteResult;  
    18. import com.baidu.mapapi.MKWalkingRouteResult;  
    19. import com.baidu.mapapi.MapActivity;  
    20.   
    21. /** 
    22.  * 根据经纬度查询地址信息 
    23.  *  
    24.  * @author liufeng 
    25.  * @date 2011-05-03 
    26.  */  
    27. public class QueryAddressActivity extends MapActivity {  
    28.     // 定义地图引擎管理类   
    29.     private BMapManager mapManager;  
    30.     // 定义搜索服务类   
    31.     private MKSearch mMKSearch;  
    32.   
    33.     private EditText longitudeEditText;  
    34.     private EditText latitudeEditText;  
    35.     private TextView addressTextView;  
    36.     private Button queryButton;  
    37.   
    38.     @Override  
    39.     public void onCreate(Bundle savedInstanceState) {  
    40.         super.onCreate(savedInstanceState);  
    41.         setContentView(R.layout.query_address);  
    42.   
    43.         // 初始化MapActivity   
    44.         mapManager = new BMapManager(getApplication());  
    45.         // init方法的第一个参数需填入申请的API Key   
    46.         mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4"null);  
    47.         super.initMapActivity(mapManager);  
    48.   
    49.         // 初始化MKSearch   
    50.         mMKSearch = new MKSearch();  
    51.         mMKSearch.init(mapManager, new MySearchListener());  
    52.   
    53.         // 通过id查询在布局文件中定义的控件   
    54.         longitudeEditText = (EditText) findViewById(R.id.longitude_input);  
    55.         latitudeEditText = (EditText) findViewById(R.id.latitude_input);  
    56.         addressTextView = (TextView) findViewById(R.id.address_text);  
    57.         queryButton = (Button) findViewById(R.id.query_button);  
    58.   
    59.         // 给地址查询按钮设置单击事件监听器   
    60.         queryButton.setOnClickListener(new OnClickListener() {  
    61.             @Override  
    62.             public void onClick(View v) {  
    63.                 // 用户输入的经度值   
    64.                 String longitudeStr = longitudeEditText.getText().toString();  
    65.                 // 用户输入的纬度值   
    66.                 String latitudeStr = latitudeEditText.getText().toString();  
    67.   
    68.                 try {  
    69.                     // 将用户输入的经纬度值转换成int类型   
    70.                     int longitude = (int) (1000000 * Double.parseDouble(longitudeStr));  
    71.                     int latitude = (int) (1000000 * Double.parseDouble(latitudeStr));  
    72.   
    73.                     // 查询该经纬度值所对应的地址位置信息   
    74.                     mMKSearch.reverseGeocode(new GeoPoint(latitude, longitude));  
    75.                 } catch (Exception e) {  
    76.                     addressTextView.setText("查询出错,请检查您输入的经纬度值!");  
    77.                 }  
    78.             }  
    79.         });  
    80.     }  
    81.   
    82.     @Override  
    83.     protected boolean isRouteDisplayed() {  
    84.         return false;  
    85.     }  
    86.   
    87.     @Override  
    88.     protected void onDestroy() {  
    89.         if (mapManager != null) {  
    90.             // 程序退出前需调用此方法   
    91.             mapManager.destroy();  
    92.             mapManager = null;  
    93.         }  
    94.         super.onDestroy();  
    95.     }  
    96.   
    97.     @Override  
    98.     protected void onPause() {  
    99.         if (mapManager != null) {  
    100.             // 终止百度地图API   
    101.             mapManager.stop();  
    102.         }  
    103.         super.onPause();  
    104.     }  
    105.   
    106.     @Override  
    107.     protected void onResume() {  
    108.         if (mapManager != null) {  
    109.             // 开启百度地图API   
    110.             mapManager.start();  
    111.         }  
    112.         super.onResume();  
    113.     }  
    114.   
    115.     /** 
    116.      * 内部类实现MKSearchListener接口,用于实现异步搜索服务 
    117.      *  
    118.      * @author liufeng 
    119.      */  
    120.     public class MySearchListener implements MKSearchListener {  
    121.         /** 
    122.          * 根据经纬度搜索地址信息结果 
    123.          *  
    124.          * @param result 搜索结果 
    125.          * @param iError 错误号(0表示正确返回) 
    126.          */  
    127.         @Override  
    128.         public void onGetAddrResult(MKAddrInfo result, int iError) {  
    129.             if (result == null) {  
    130.                 return;  
    131.             }  
    132.             StringBuffer sb = new StringBuffer();  
    133.             // 经纬度所对应的位置   
    134.             sb.append(result.strAddr).append("/n");  
    135.   
    136.             // 判断该地址附近是否有POI(Point of Interest,即兴趣点)   
    137.             if (null != result.poiList) {  
    138.                 // 遍历所有的兴趣点信息   
    139.                 for (MKPoiInfo poiInfo : result.poiList) {  
    140.                     sb.append("----------------------------------------").append("/n");  
    141.                     sb.append("名称:").append(poiInfo.name).append("/n");  
    142.                     sb.append("地址:").append(poiInfo.address).append("/n");  
    143.                     sb.append("经度:").append(poiInfo.pt.getLongitudeE6() / 1000000.0f).append("/n");  
    144.                     sb.append("纬度:").append(poiInfo.pt.getLatitudeE6() / 1000000.0f).append("/n");  
    145.                     sb.append("电话:").append(poiInfo.phoneNum).append("/n");  
    146.                     sb.append("邮编:").append(poiInfo.postCode).append("/n");  
    147.                     // poi类型,0:普通点,1:公交站,2:公交线路,3:地铁站,4:地铁线路   
    148.                     sb.append("类型:").append(poiInfo.ePoiType).append("/n");  
    149.                 }  
    150.             }  
    151.             // 将地址信息、兴趣点信息显示在TextView上   
    152.             addressTextView.setText(sb.toString());  
    153.         }  
    154.   
    155.         /** 
    156.          * 驾车路线搜索结果 
    157.          *  
    158.          * @param result 搜索结果 
    159.          * @param iError 错误号(0表示正确返回) 
    160.          */  
    161.         @Override  
    162.         public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {  
    163.         }  
    164.   
    165.         /** 
    166.          * POI搜索结果(范围检索、城市POI检索、周边检索) 
    167.          *  
    168.          * @param result 搜索结果 
    169.          * @param type 返回结果类型(11,12,21:poi列表 7:城市列表) 
    170.          * @param iError 错误号(0表示正确返回) 
    171.          */  
    172.         @Override  
    173.         public void onGetPoiResult(MKPoiResult result, int type, int iError) {  
    174.         }  
    175.   
    176.         /** 
    177.          * 公交换乘路线搜索结果 
    178.          *  
    179.          * @param result 搜索结果 
    180.          * @param iError 错误号(0表示正确返回) 
    181.          */  
    182.         @Override  
    183.         public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {  
    184.         }  
    185.   
    186.         /** 
    187.          * 步行路线搜索结果 
    188.          *  
    189.          * @param result 搜索结果 
    190.          * @param iError 错误号(0表示正确返回) 
    191.          */  
    192.         @Override  
    193.         public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {  
    194.         }  
    195.     }  
    196. }  
      
    3)AndroidManifest.xml中的配置     
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <manifest xmlns:Android="http://schemas.android.com/apk/res/android"  
    3.       package="com.liufeng.baidumap"  
    4.       Android:versionCode="1"  
    5.       Android:versionName="1.0">  
    6.     <application Android:icon="@drawable/icon" android:label="@string/app_name">  
    7.         <activity Android:name=".QueryAddressActivity" android:label="@string/app_name">  
    8.             <intent-filter>  
    9.                 <action Android:name="android.intent.action.MAIN" />  
    10.                 <category Android:name="android.intent.category.LAUNCHER" />  
    11.             </intent-filter>  
    12.         </activity>  
    13.     </application>  
    14.     <uses-sdk Android:minSdkVersion="4" />  
    15.   
    16.     <!-- 访问网络的权限 -->  
    17.     <uses-permission Android:name="android.permission.INTERNET" />  
    18.     <!-- 访问精确位置的权限 -->  
    19.     <uses-permission Android:name="android.permission.ACCESS_FINE_LOCATION" />  
    20.     <!-- 访问网络状态的权限 -->  
    21.     <uses-permission Android:name="android.permission.ACCESS_NETWORK_STATE" />  
    22.     <!-- 访问WIFI网络状态的权限 -->  
    23.     <uses-permission Android:name="android.permission.ACCESS_WIFI_STATE" />  
    24.     <!-- 改变WIFI网络状态的权限 -->  
    25.     <uses-permission Android:name="android.permission.CHANGE_WIFI_STATE" />  
    26.     <!-- 读写存储卡的权限 -->  
    27.     <uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    28.     <!-- 读取电话状态的权限 -->  
    29.     <uses-permission Android:name="android.permission.READ_PHONE_STATE" />  
    30. </manifest>   

    4)运行结果截图及说明
          
    程序在模拟器上运行的初始效果如上图所示。可以看出,地图并没有显示出来,这和我们在设计时布局时所设想的一样;另外两个输入框中也分别显示了默认给出的经纬度值。
          点击“地址查询”按钮后,将看到如下图所示包含了查询结果的界面:
          
    说明:图上的“贵州省贵阳市云岩区普陀路”正是我们要查询的地理坐标(经度:106.720397,纬度:26.597239)所对应的地址信息;同时该地址信息下方还显示出了该地址附近的10个兴趣点(POI),每个兴趣点分别包含了“名称”、“地址”、“经纬度”、“电话”、“邮编”和“兴趣点类型”信息。

    备注:如果本文的示例继续做下去,就应该将MapView显示出来,同时结合第8篇文章“百度地图API之ItemizedOverlay的使用(Android) http://www.linuxidc.com/Linux/2011-07/38864.htm”所介绍的内容将地址信息和兴趣点标注在地图上。我想这两方面的内容都已做过详细讲解并给出了示例,再来实现这个应该并不是什么难事,看文章的你就动动手来完成它吧!


    原文地址:http://www.linuxidc.com/Linux/2011-07/38866p2.htm


你可能感兴趣的:(android,api,百度,layout,null,encoding)