本文主要讲解如何通过百度地图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. * @param result 搜索结果
  18. * @param iError 错误号(0表示正确返回)
  19. */
  20. @Override
  21. public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
  22. }
  23. /**
  24. * POI搜索结果(范围检索、城市POI检索、周边检索)
  25. * @param result 搜索结果
  26. * @param type 返回结果类型(11,12,21:poi列表 7:城市列表)
  27. * @param iError 错误号(0表示正确返回)
  28. */
  29. @Override
  30. public void onGetPoiResult(MKPoiResult result, int type, int iError) {
  31. }
  32. /**
  33. * 公交换乘路线搜索结果
  34. * @param result 搜索结果
  35. * @param iError 错误号(0表示正确返回)
  36. */
  37. @Override
  38. public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
  39. }
  40. /**
  41. * 步行路线搜索结果
  42. * @param result 搜索结果
  43. * @param iError 错误号(0表示正确返回)
  44. */
  45. @Override
  46. public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
  47. }
  48. }

说明:上面的类定义只是在说明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. <TextView
  21. Android:layout_width="fill_parent"
  22. Android:layout_height="wrap_content"
  23. Android:text="纬度:"
  24. />
  25. <EditText Android:id="@+id/latitude_input"
  26. Android:layout_width="fill_parent"
  27. Android:layout_height="wrap_content"
  28. Android:text="26.597239"
  29. />
  30. <Button Android: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. <TextView Android:id="@+id/address_text"
  37. Android:layout_width="wrap_content"
  38. Android:layout_height="wrap_content"
  39. />
  40. <!--
  41. 虽然定义了MapView,但是设置了Android:visibility="gone"将其隐藏
  42. 因为本示例并不需要显示地图,但不定义又不行(baidu map api的要求)
  43. -->
  44. <com.baidu.mapapi.MapView Android: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>
  52. 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. import com.baidu.mapapi.BMapManager;
    9. import com.baidu.mapapi.GeoPoint;
    10. import com.baidu.mapapi.MKAddrInfo;
    11. import com.baidu.mapapi.MKDrivingRouteResult;
    12. import com.baidu.mapapi.MKPoiInfo;
    13. import com.baidu.mapapi.MKPoiResult;
    14. import com.baidu.mapapi.MKSearch;
    15. import com.baidu.mapapi.MKSearchListener;
    16. import com.baidu.mapapi.MKTransitRouteResult;
    17. import com.baidu.mapapi.MKWalkingRouteResult;
    18. import com.baidu.mapapi.MapActivity;
    19. /**
    20. * 根据经纬度查询地址信息
    21. *
    22. * @author liufeng
    23. * @date 2011-05-03
    24. */
    25. public class QueryAddressActivity extends MapActivity {
    26. // 定义地图引擎管理类
    27. private BMapManager mapManager;
    28. // 定义搜索服务类
    29. private MKSearch mMKSearch;
    30. private EditText longitudeEditText;
    31. private EditText latitudeEditText;
    32. private TextView addressTextView;
    33. private Button queryButton;
    34. @Override
    35. public void onCreate(Bundle savedInstanceState) {
    36. super.onCreate(savedInstanceState);
    37. setContentView(R.layout.query_address);
    38. // 初始化MapActivity
    39. mapManager = new BMapManager(getApplication());
    40. // init方法的第一个参数需填入申请的API Key
    41. mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);
    42. super.initMapActivity(mapManager);
    43. // 初始化MKSearch
    44. mMKSearch = new MKSearch();
    45. mMKSearch.init(mapManager, new MySearchListener());
    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(new OnClickListener() {
    53. @Override
    54. public void onClick(View v) {
    55. // 用户输入的经度值
    56. String longitudeStr = longitudeEditText.getText().toString();
    57. // 用户输入的纬度值
    58. String latitudeStr = latitudeEditText.getText().toString();
    59. try {
    60. // 将用户输入的经纬度值转换成int类型
    61. int longitude = (int) (1000000 * Double.parseDouble(longitudeStr));
    62. int latitude = (int) (1000000 * Double.parseDouble(latitudeStr));
    63. // 查询该经纬度值所对应的地址位置信息
    64. mMKSearch.reverseGeocode(new GeoPoint(latitude, longitude));
    65. catch (Exception e) {
    66. addressTextView.setText("查询出错,请检查您输入的经纬度值!");
    67. }
    68. }
    69. });
    70. }
    71. @Override
    72. protected boolean isRouteDisplayed() {
    73. return false;
    74. }
    75. @Override
    76. protected void onDestroy() {
    77. if (mapManager != null) {
    78. // 程序退出前需调用此方法
    79. mapManager.destroy();
    80. mapManager = null;
    81. }
    82. super.onDestroy();
    83. }
    84. @Override
    85. protected void onPause() {
    86. if (mapManager != null) {
    87. // 终止百度地图API
    88. mapManager.stop();
    89. }
    90. super.onPause();
    91. }
    92. @Override
    93. protected void onResume() {
    94. if (mapManager != null) {
    95. // 开启百度地图API
    96. mapManager.start();
    97. }
    98. super.onResume();
    99. }
    100. /**
    101. * 内部类实现MKSearchListener接口,用于实现异步搜索服务
    102. *
    103. * @author liufeng
    104. */
    105. public class MySearchListener implements MKSearchListener {
    106. /**
    107. * 根据经纬度搜索地址信息结果
    108. *
    109. * @param result 搜索结果
    110. * @param iError 错误号(0表示正确返回)
    111. */
    112. @Override
    113. public void onGetAddrResult(MKAddrInfo result, int iError) {
    114. if (result == null) {
    115. return;
    116. }
    117. StringBuffer sb = new StringBuffer();
    118. // 经纬度所对应的位置
    119. sb.append(result.strAddr).append("/n");
    120. // 判断该地址附近是否有POI(Point of Interest,即兴趣点)
    121. if (null != result.poiList) {
    122. // 遍历所有的兴趣点信息
    123. for (MKPoiInfo poiInfo : 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. * @param result 搜索结果
    142. * @param iError 错误号(0表示正确返回)
    143. */
    144. @Override
    145. public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
    146. }
    147. /**
    148. * POI搜索结果(范围检索、城市POI检索、周边检索)
    149. *
    150. * @param result 搜索结果
    151. * @param type 返回结果类型(11,12,21:poi列表 7:城市列表)
    152. * @param iError 错误号(0表示正确返回)
    153. */
    154. @Override
    155. public void onGetPoiResult(MKPoiResult result, int type, int iError) {
    156. }
    157. /**
    158. * 公交换乘路线搜索结果
    159. *
    160. * @param result 搜索结果
    161. * @param iError 错误号(0表示正确返回)
    162. */
    163. @Override
    164. public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
    165. }
    166. /**
    167. * 步行路线搜索结果
    168. *
    169. * @param result 搜索结果
    170. * @param iError 错误号(0表示正确返回)
    171. */
    172. @Override
    173. public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
    174. }
    175. }
    176. }

    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. <uses-permission Android:name="android.permission.INTERNET" />
    17. <!-- 访问精确位置的权限 -->
    18. <uses-permission Android:name="android.permission.ACCESS_FINE_LOCATION" />
    19. <!-- 访问网络状态的权限 -->
    20. <uses-permission Android:name="android.permission.ACCESS_NETWORK_STATE" />
    21. <!-- 访问WIFI网络状态的权限 -->
    22. <uses-permission Android:name="android.permission.ACCESS_WIFI_STATE" />
    23. <!-- 改变WIFI网络状态的权限 -->
    24. <uses-permission Android:name="android.permission.CHANGE_WIFI_STATE" />
    25. <!-- 读写存储卡的权限 -->
    26. <uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    27. <!-- 读取电话状态的权限 -->
    28. <uses-permission Android:name="android.permission.READ_PHONE_STATE" />
    29. </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

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

  1. 百度地图AK申请注意+百度地图API生成热力图+调用百度地图API自动获取经纬度和地址

    文章目录 一.百度地图AK密钥申请 二.调用百度地图API生成热力图 三.调用百度地图API自动获取经纬度和地址 一.百度地图AK密钥申请 点击百度地图API控制台,输入登录账户,即可进入,若账户未完 ...

  2. 【python】python利用百度地图API:获取经纬度、地图撒点

    本文目的: python通过百度地图API,获取所给地址的经纬度,并且在百度地图上进行撒点. 另:百度地图API功能强大,如: GPS功能(单个点沿线运动). 信息窗口示例(添加纯文字的信息窗口). ...

  3. 根据城市的三字代码查询经纬度_百度地图API简单应用——1.根据地址查询经纬度...

    这几天比较空闲,就接触了下百度地图的API(开发者中心链接地址:http://developer.baidu.com),发现调用还是挺方便的.只要简单几步注册下,就可以获得一个Key,就能直接调用(P ...

  4. 通过百度地图api实现简单经纬度输入定位(安卓端)

    老师居然检查作业了!因为之前做过一点,熬夜做了一下,太久没搞安卓了,感觉之前学的全忘了:(. 功能演示 老师的要求是实现输入经纬度,在地图中显示该坐标位置信息 通过网上经纬度查询系统查得桥楼餐厅经纬度 ...

  5. Python3调用百度地图API接口获取结构化地址

    在实际应用中,我们也许会有这样的需求,输入一个地名,就能够知道这个地方的准确地址.例如输入"清华大学",我们就可以知道清华大学在北京的哪个区哪条道路.正好百度地图开放平台服务提供了 ...

  6. python实现通过百度地图API获得地铁站经纬度(详细教程)

    第一步:注册成为开发者,获得AK号 1: 前往百度地图官网注册,注册地址,请点击:百度地址开发者注册 网站如下:http://lbsyun.baidu.com/apiconsole/key/creat ...

  7. python 调用百度地图api 实现批量经纬度转换为实际省市地点(api调用,json解析,mysql读取与写入)

    1.获取秘钥 调用百度地图API实现得申请百度账号或者登陆百度账号,然后申请自己的ak秘钥.链接如下:添加链接描述 下面是百度创建的app设置: 2.调用API将经纬度信息解析成json信息 def ...

  8. 跨域请求(使用jsonp实现跨域请求)百度地图api证逆地址解析获取周边信息(pois)

    新手程序员,新手博客,如果那里写的不好,还请大神们补充,指错 最近项目里面需要做一个电子围栏的功能,我这边做的就是需要把商户的地址的经纬度存进数据库,本来这些从百度地图API里面有Demo可以看,但是 ...

  9. python爬虫 + 百度地图api 获取城市的实时路况信息

    ​ 前言:本文写作的初衷是笔者参与了一个道路实况图的制作项目中,本人负责路况数据的抓取,本来是想要用高德地图的api来进行数据的抓取,但是很不巧的是 - 高德地图的路况查询api服务已经不能用了,于是 ...

  10. Javascrit通过百度地图API获取客户端IP、地址

    <script>var _script = document.createElement('script');_script.type = "text/javascript&qu ...

最新文章

  1. 去除掉TabHost下面那个边线的小技巧
  2. Android应用程序框架
  3. Linux中的文件描述符与打开文件之间的关系
  4. 代码中设置excel自定义格式为[红色]的处理方法
  5. sklearn svm如何选择核函数_机器学习之支持向量机多种核模型对比
  6. 无法创建t的通用数组_创建通用数组的问题
  7. Day24-Ajax文件上传
  8. Go实现Raft第四篇:持久化和调优
  9. animate.css –齐全的CSS3动画库--- 学习笔记
  10. css实现简单的loading效果
  11. 2014阿里实习生面试题——mysql如何实现的索引
  12. 驰骋工作流引擎表单设计器--表单装载前数据填充
  13. codeblocks下载
  14. Windows远程桌面连接保姆级教学
  15. [有限元方法基础理论] 质量集中有限元(谱元)
  16. 金融风险管理 思维导图
  17. linux更换进程执行码,第八节 进程的切换和系统的一般执行过程—— 20135203齐岳...
  18. Digital Square HDU - 4394 dfs + 剪枝
  19. linux创建蓝光映像光盘,11.13 mkisofs指令:创建光盘映像文件
  20. 手机如何备份数据在NAS里面?

热门文章

  1. 在 .NET 6 项目中使用 Startup.cs
  2. JAVA实现时间换算
  3. 微信三方平台授权登录
  4. docker操作记录-5
  5. iOS 13 SceneDelegate适配
  6. 立即收藏!2019前端工程师如何应对裁员潮?
  7. 4G升级5G需要换手机还是换手机卡,还是都不用换?
  8. 制作U盘启动时的写入模式HDD-FAT32、ZIP-FAT32、HDD-FAT16、ZIP-FAT16有什么区别?
  9. 分享一些常用软件序列号及注册码
  10. [CF891D]Sloth