android百度api由经纬获得地址名称

本文介绍如何利用百度地图移动版API实现地理坐标到地址信息的转换,并展示如何获取指定坐标的周边兴趣点(POI)信息。

转自http://blog.youkuaiyun.com/lyq8479/article/details/6387860

本文主要讲解如何通过百度地图API根据某个经纬度值(地理坐标)查询对应的地址信息以及该地址周边的POI(Point of Interest,兴趣点)信息。
百度地图移动版API不仅包含构建地图的基本接口,还集成了众多搜索服务,包括:位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索、地址信息查询等。
百度地图移动版API提供的搜索服务主要是通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener来实现异步搜索服务。首先需要自定义一个MySearchListener类,它实现MKSearchListener接口,然后通过实现接口中不同的回调方法,来获得对应的搜索结果。MySearchListener类的定义如下:

[java] view plain copy
  1. /**
  2. *实现MKSearchListener接口,用于实现异步搜索服务,得到搜索结果
  3. *
  4. *@authorliufeng
  5. */
  6. publicclassMySearchListenerimplementsMKSearchListener{
  7. /**
  8. *根据经纬度搜索地址信息结果
  9. *@paramresult搜索结果
  10. *@paramiError错误号(0表示正确返回)
  11. */
  12. @Override
  13. publicvoidonGetAddrResult(MKAddrInforesult,intiError){
  14. }
  15. /**
  16. *驾车路线搜索结果
  17. *@paramresult搜索结果
  18. *@paramiError错误号(0表示正确返回)
  19. */
  20. @Override
  21. publicvoidonGetDrivingRouteResult(MKDrivingRouteResultresult,intiError){
  22. }
  23. /**
  24. *POI搜索结果(范围检索、城市POI检索、周边检索)
  25. *@paramresult搜索结果
  26. *@paramtype返回结果类型(11,12,21:poi列表7:城市列表)
  27. *@paramiError错误号(0表示正确返回)
  28. */
  29. @Override
  30. publicvoidonGetPoiResult(MKPoiResultresult,inttype,intiError){
  31. }
  32. /**
  33. *公交换乘路线搜索结果
  34. *@paramresult搜索结果
  35. *@paramiError错误号(0表示正确返回)
  36. */
  37. @Override
  38. publicvoidonGetTransitRouteResult(MKTransitRouteResultresult,intiError){
  39. }
  40. /**
  41. *步行路线搜索结果
  42. *@paramresult搜索结果
  43. *@paramiError错误号(0表示正确返回)
  44. */
  45. @Override
  46. publicvoidonGetWalkingRouteResult(MKWalkingRouteResultresult,intiError){
  47. }
  48. }

说明:上面的类定义只是在说明MKSearchListener类的5个方法的作用,全都是空实现,并未给出具体的实现。根据你要检索的内容,再去具体实现上面对应的方法,就能获取到搜索结果。例如:1)你想通过一个地理坐标(经纬度值)来搜索地址信息,那么只需要具体实现上面的onGetAddrResult()方法就能得到搜索结果;2)如果你想搜索驾车路线信息,只需要具体实现onGetDrivingRouteResult()方法就能得到搜索结果。

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

[java] view plain copy
  1. //初始化MKSearch
  2. mMKSearch=newMKSearch();
  3. mMKSearch.init(mapManager,newMySearchListener());

经过上面两步之后,就可以通过调用MKSearch所提供的一些检索方法来搜索你想要的信息了。
下面给出一个具体的示例:根据某个经纬度值(地理坐标)查询对应的地址信息以及该地址周边的POI(Point of Interest,兴趣点)信息。
1)布局文件res/layout/query_address.xml
[xhtml] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <ScrollViewxmlns: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. <EditTextandroid:id="@+id/longitude_input"
  16. android:layout_width="fill_parent"
  17. android:layout_height="wrap_content"
  18. android:text="106.720397"
  19. />
  20. <TextView
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:text="纬度:"
  24. />
  25. <EditTextandroid:id="@+id/latitude_input"
  26. android:layout_width="fill_parent"
  27. android:layout_height="wrap_content"
  28. android:text="26.597239"
  29. />
  30. <Buttonandroid:id="@+id/query_button"
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:layout_gravity="right"
  34. android:text="地址查询"
  35. />
  36. <TextViewandroid:id="@+id/address_text"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. />
  40. <!--
  41. 虽然定义了MapView,但是设置了android:visibility="gone"将其隐藏
  42. 因为本示例并不需要显示地图,但不定义又不行(baidumapapi的要求)
  43. -->
  44. <com.baidu.mapapi.MapViewandroid:id="@+id/map_View"
  45. android:layout_width="fill_parent"
  46. android:layout_height="fill_parent"
  47. android:clickable="true"
  48. android:visibility="gone"
  49. />
  50. </LinearLayout>
  51. </ScrollView>

2)继承com.baidu.mapapi.MapActivity的Activity类
[java] view plain copy
  1. packagecom.liufeng.baidumap;
  2. importandroid.os.Bundle;
  3. importandroid.view.View;
  4. importandroid.view.View.OnClickListener;
  5. importandroid.widget.Button;
  6. importandroid.widget.EditText;
  7. importandroid.widget.TextView;
  8. importcom.baidu.mapapi.BMapManager;
  9. importcom.baidu.mapapi.GeoPoint;
  10. importcom.baidu.mapapi.MKAddrInfo;
  11. importcom.baidu.mapapi.MKDrivingRouteResult;
  12. importcom.baidu.mapapi.MKPoiInfo;
  13. importcom.baidu.mapapi.MKPoiResult;
  14. importcom.baidu.mapapi.MKSearch;
  15. importcom.baidu.mapapi.MKSearchListener;
  16. importcom.baidu.mapapi.MKTransitRouteResult;
  17. importcom.baidu.mapapi.MKWalkingRouteResult;
  18. importcom.baidu.mapapi.MapActivity;
  19. /**
  20. *根据经纬度查询地址信息
  21. *
  22. *@authorliufeng
  23. *@date2011-05-03
  24. */
  25. publicclassQueryAddressActivityextendsMapActivity{
  26. //定义地图引擎管理类
  27. privateBMapManagermapManager;
  28. //定义搜索服务类
  29. privateMKSearchmMKSearch;
  30. privateEditTextlongitudeEditText;
  31. privateEditTextlatitudeEditText;
  32. privateTextViewaddressTextView;
  33. privateButtonqueryButton;
  34. @Override
  35. publicvoidonCreate(BundlesavedInstanceState){
  36. super.onCreate(savedInstanceState);
  37. setContentView(R.layout.query_address);
  38. //初始化MapActivity
  39. mapManager=newBMapManager(getApplication());
  40. //init方法的第一个参数需填入申请的APIKey
  41. mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4",null);
  42. super.initMapActivity(mapManager);
  43. //初始化MKSearch
  44. mMKSearch=newMKSearch();
  45. mMKSearch.init(mapManager,newMySearchListener());
  46. //通过id查询在布局文件中定义的控件
  47. longitudeEditText=(EditText)findViewById(R.id.longitude_input);
  48. latitudeEditText=(EditText)findViewById(R.id.latitude_input);
  49. addressTextView=(TextView)findViewById(R.id.address_text);
  50. queryButton=(Button)findViewById(R.id.query_button);
  51. //给地址查询按钮设置单击事件监听器
  52. queryButton.setOnClickListener(newOnClickListener(){
  53. @Override
  54. publicvoidonClick(Viewv){
  55. //用户输入的经度值
  56. StringlongitudeStr=longitudeEditText.getText().toString();
  57. //用户输入的纬度值
  58. StringlatitudeStr=latitudeEditText.getText().toString();
  59. try{
  60. //将用户输入的经纬度值转换成int类型
  61. intlongitude=(int)(1000000*Double.parseDouble(longitudeStr));
  62. intlatitude=(int)(1000000*Double.parseDouble(latitudeStr));
  63. //查询该经纬度值所对应的地址位置信息
  64. mMKSearch.reverseGeocode(newGeoPoint(latitude,longitude));
  65. }catch(Exceptione){
  66. addressTextView.setText("查询出错,请检查您输入的经纬度值!");
  67. }
  68. }
  69. });
  70. }
  71. @Override
  72. protectedbooleanisRouteDisplayed(){
  73. returnfalse;
  74. }
  75. @Override
  76. protectedvoidonDestroy(){
  77. if(mapManager!=null){
  78. //程序退出前需调用此方法
  79. mapManager.destroy();
  80. mapManager=null;
  81. }
  82. super.onDestroy();
  83. }
  84. @Override
  85. protectedvoidonPause(){
  86. if(mapManager!=null){
  87. //终止百度地图API
  88. mapManager.stop();
  89. }
  90. super.onPause();
  91. }
  92. @Override
  93. protectedvoidonResume(){
  94. if(mapManager!=null){
  95. //开启百度地图API
  96. mapManager.start();
  97. }
  98. super.onResume();
  99. }
  100. /**
  101. *内部类实现MKSearchListener接口,用于实现异步搜索服务
  102. *
  103. *@authorliufeng
  104. */
  105. publicclassMySearchListenerimplementsMKSearchListener{
  106. /**
  107. *根据经纬度搜索地址信息结果
  108. *
  109. *@paramresult搜索结果
  110. *@paramiError错误号(0表示正确返回)
  111. */
  112. @Override
  113. publicvoidonGetAddrResult(MKAddrInforesult,intiError){
  114. if(result==null){
  115. return;
  116. }
  117. StringBuffersb=newStringBuffer();
  118. //经纬度所对应的位置
  119. sb.append(result.strAddr).append("/n");
  120. //判断该地址附近是否有POI(PointofInterest,即兴趣点)
  121. if(null!=result.poiList){
  122. //遍历所有的兴趣点信息
  123. for(MKPoiInfopoiInfo:result.poiList){
  124. sb.append("----------------------------------------").append("/n");
  125. sb.append("名称:").append(poiInfo.name).append("/n");
  126. sb.append("地址:").append(poiInfo.address).append("/n");
  127. sb.append("经度:").append(poiInfo.pt.getLongitudeE6()/1000000.0f).append("/n");
  128. sb.append("纬度:").append(poiInfo.pt.getLatitudeE6()/1000000.0f).append("/n");
  129. sb.append("电话:").append(poiInfo.phoneNum).append("/n");
  130. sb.append("邮编:").append(poiInfo.postCode).append("/n");
  131. //poi类型,0:普通点,1:公交站,2:公交线路,3:地铁站,4:地铁线路
  132. sb.append("类型:").append(poiInfo.ePoiType).append("/n");
  133. }
  134. }
  135. //将地址信息、兴趣点信息显示在TextView上
  136. addressTextView.setText(sb.toString());
  137. }
  138. /**
  139. *驾车路线搜索结果
  140. *
  141. *@paramresult搜索结果
  142. *@paramiError错误号(0表示正确返回)
  143. */
  144. @Override
  145. publicvoidonGetDrivingRouteResult(MKDrivingRouteResultresult,intiError){
  146. }
  147. /**
  148. *POI搜索结果(范围检索、城市POI检索、周边检索)
  149. *
  150. *@paramresult搜索结果
  151. *@paramtype返回结果类型(11,12,21:poi列表7:城市列表)
  152. *@paramiError错误号(0表示正确返回)
  153. */
  154. @Override
  155. publicvoidonGetPoiResult(MKPoiResultresult,inttype,intiError){
  156. }
  157. /**
  158. *公交换乘路线搜索结果
  159. *
  160. *@paramresult搜索结果
  161. *@paramiError错误号(0表示正确返回)
  162. */
  163. @Override
  164. publicvoidonGetTransitRouteResult(MKTransitRouteResultresult,intiError){
  165. }
  166. /**
  167. *步行路线搜索结果
  168. *
  169. *@paramresult搜索结果
  170. *@paramiError错误号(0表示正确返回)
  171. */
  172. @Override
  173. publicvoidonGetWalkingRouteResult(MKWalkingRouteResultresult,intiError){
  174. }
  175. }
  176. }

3)AndroidManifest.xml中的配置
[xhtml] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.liufeng.baidumap"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
  7. <activityandroid:name=".QueryAddressActivity"android:label="@string/app_name">
  8. <intent-filter>
  9. <actionandroid:name="android.intent.action.MAIN"/>
  10. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  11. </intent-filter>
  12. </activity>
  13. </application>
  14. <uses-sdkandroid:minSdkVersion="4"/>
  15. <!--访问网络的权限-->
  16. <uses-permissionandroid:name="android.permission.INTERNET"/>
  17. <!--访问精确位置的权限-->
  18. <uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
  19. <!--访问网络状态的权限-->
  20. <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
  21. <!--访问WIFI网络状态的权限-->
  22. <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
  23. <!--改变WIFI网络状态的权限-->
  24. <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
  25. <!--读写存储卡的权限-->
  26. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  27. <!--读取电话状态的权限-->
  28. <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
  29. </manifest>

4)运行结果截图及说明

程序在模拟器上运行的初始效果如上图所示。可以看出,地图并没有显示出来,这和我们在设计时布局时所设想的一样;另外两个输入框中也分别显示了默认给出的经纬度值。
点击“地址查询”按钮后,将看到如下图所示包含了查询结果的界面:

说明:图上的“贵州省贵阳市云岩区普陀路”正是我们要查询的地理坐标 (经度:106.720397,纬度:26.597239)所对应的地址信息;同时该地址信息下方还显示出了该地址附近的10个兴趣点(POI),每个兴趣点分别包含了“名称”、“地址”、“经纬度”、“电话”、“邮编”和“兴趣点类型”信息。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值