百度地图API 之 定位周边搜索POI(奉上源代码)+ GoogleMap 详细

来源:互联网 发布:南方cass软件购买 编辑:程序博客网 时间:2024/04/30 18:32

学习了柳峰大哥的例子

之前只是单一实现了定位功能 和 搜索周边POI的功能,所以这样的程序也只能是玩具程序Demo
真正意思上的用途,应该是能够定位我当前设备的位置,根据位置去搜索我周边的POI。
虽然理论上是给了我两个完整的例子,但是真正实现中,却发现定位的位置经纬度(或是参数)没有办法传到我搜索模块。
因此纠结啊!不过现在知道怎么回事了。

百度拾取坐标系统:


原帖:

http://www.apkbus.com/forum.php?mod=viewthread&tid=19735


1)布局文件res/layout/main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical" >

  6.     <TextView
  7.         android:layout_width="fill_parent"
  8.         android:layout_height="wrap_content"
  9.         android:text="@string/hello" />
  10.    
  11.     <com.baidu.mapapi.MapView
  12.         android:id="@+id/map_View"
  13.         android:layout_width="fill_parent"
  14.         android:layout_height="fill_parent"
  15.         android:clickable="true" />
  16. </LinearLayout>

复制代码
布局文件基本上都这么个格式,这里可以加入一些其他的功能。
2)继承了com.baidu.mapapi.MapActivity的Activity类
  1. package com.search.map;

  2. import android.location.Location;
  3. import android.os.Bundle;
  4. import com.baidu.mapapi.BMapManager;
  5. import com.baidu.mapapi.GeoPoint;
  6. import com.baidu.mapapi.LocationListener;
  7. import com.baidu.mapapi.MKAddrInfo;
  8. import com.baidu.mapapi.MKDrivingRouteResult;
  9. import com.baidu.mapapi.MKPoiResult;
  10. import com.baidu.mapapi.MKSearch;
  11. import com.baidu.mapapi.MKSearchListener;
  12. import com.baidu.mapapi.MKTransitRouteResult;
  13. import com.baidu.mapapi.MKWalkingRouteResult;
  14. import com.baidu.mapapi.MapActivity;
  15. import com.baidu.mapapi.MapController;
  16. import com.baidu.mapapi.MapView;
  17. import com.baidu.mapapi.MyLocationOverlay;
  18. import com.baidu.mapapi.PoiOverlay;

  19. public class PoiSearchActivity extends MapActivity {
  20.         // 定义地图引擎管理类
  21.         private BMapManager mapManager;// 定义搜索服务类
  22.         private MKSearch mMKSearch;
  23.         private MapView mapView;
  24.         private MapController mapController;

  25.         LocationListener mLocationListener = null;// onResume时注册此listener,onPause时需要Remove
  26.         MyLocationOverlay mLocationOverlay = null; // 定位图层

  27.         @Override
  28.         public void onCreate(Bundle savedInstanceState) {
  29.                 super.onCreate(savedInstanceState);
  30.                 setContentView(R.layout.main);
  31.                 // 初始化MapActivity
  32.                 mapManager = new BMapManager(getApplication());

  33.                 // init方法的第一个参数需填入申请的APIKey
  34.                 mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);
  35.                 super.initMapActivity(mapManager);
  36.                 mapView = (MapView) findViewById(R.id.map_View);
  37.                 // 设置地图模式为交通地图
  38.                 mapView.setTraffic(true);
  39.                 // 设置启用内置的缩放控件
  40.                 mapView.setBuiltInZoomControls(true);
  41.                 // 设置在缩放动画过程中也显示overlay,默认为不绘制
  42.                 mapView.setDrawOverlayWhenZooming(true);

  43.                 // 添加定位图层
  44.                 mLocationOverlay = new MyLocationOverlay(this, mapView);
  45.                 mapView.getOverlays().add(mLocationOverlay);

  46.                 // 注册定位事件
  47.                 mLocationListener = new LocationListener() {

  48.                         @Override
  49.                         public void onLocationChanged(Location location) {
  50.                                 if (location != null) {
  51.                                         GeoPoint geoPoint = new GeoPoint((int) (location.getLatitude() * 1e6),
  52.                                                         (int) (location.getLongitude() * 1e6));
  53.                                         mapView.getController().animateTo(geoPoint);
  54.                                         mapController = mapView.getController();
  55.                                         // 设置地图的中心
  56.                                         mapController.setCenter(geoPoint);
  57.                                         // 设置地图默认的缩放级别
  58.                                         mapController.setZoom(16);
  59.                                         // 初始化
  60.                                         MKSearch mMKSearch = new MKSearch();
  61.                                         mMKSearch.init(mapManager, new MySearchListener());
  62.                                         // 搜索贵州大学校门口附近500米范围的自动取款机
  63.                                         mMKSearch.poiSearchNearBy("ATM", geoPoint, 500);
  64.                                 }
  65.                         }
  66.                 };

  67.         }

  68.         @Override
  69.         protected boolean isRouteDisplayed() {
  70.                 return false;
  71.         }

  72.         @Override
  73.         protected void onDestroy() {
  74.                 if (mapManager != null) {
  75.                         // 程序退出前需调用此方法
  76.                         mapManager.destroy();
  77.                         mapManager = null;
  78.                 }
  79.                 super.onDestroy();
  80.         }

  81.         @Override
  82.         protected void onPause() {
  83.                 if (mapManager != null) {
  84.                         // 终止百度地图API
  85.                         mapManager.getLocationManager().removeUpdates(mLocationListener);
  86.                         mLocationOverlay.disableMyLocation();
  87.                 mLocationOverlay.disableCompass(); // 关闭指南针
  88.                         mapManager.stop();
  89.                 }
  90.                 super.onPause();
  91.         }

  92.         @Override
  93.         protected void onResume() {
  94.                 if (mapManager != null) {
  95.                         // 开启百度地图API
  96.                         // 注册定位事件,定位后将地图移动到定位点
  97.                         mapManager.getLocationManager().requestLocationUpdates(mLocationListener);
  98.                         mLocationOverlay.enableMyLocation();
  99.                         mLocationOverlay.enableCompass(); // 打开指南针
  100.                         mapManager.start();
  101.                 }
  102.                 super.onResume();
  103.         }

  104.         /**
  105.          * * 实现MKSearchListener接口,用于实现异步搜索服务 * @author liufeng
  106.          */
  107.         public class MySearchListener implements MKSearchListener {
  108.                 /** * 根据经纬度搜索地址信息结果 * * @param result 搜索结果 * @param iError 错误号 (0表示正确返回) */
  109.                 @Override
  110.                 public void onGetAddrResult(MKAddrInfo result, int iError) {
  111.                 }

  112.                 /** * 驾车路线搜索结果 * * @param result 搜索结果 * @param iError 错误号 */
  113.                 @Override
  114.                 public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
  115.                 }

  116.                 /**
  117.                  * * POI搜索结果(范围检索、城市POI检索、周边检索) * * @param result 搜索结果 * @param type
  118.                  * 返回结果类型(11,12,21:poi列表 7:城市列表) * @param iError 错误号(0表示正确返回)
  119.                  */
  120.                 @Override
  121.                 public void onGetPoiResult(MKPoiResult result, int type, int iError) {
  122.                         if (result == null) {
  123.                                 return;
  124.                         }
  125.                         // PoiOverlay是baidu map api提供的用于显示POI的Overlay
  126.                         PoiOverlay poioverlay = new PoiOverlay(PoiSearchActivity.this, mapView);
  127.                         // 设置搜索到的POI数据
  128.                         poioverlay.setData(result.getAllPoi());
  129.                         // 在地图上显示PoiOverlay(将搜索到的兴趣点标注在地图上)
  130.                         mapView.getOverlays().add(poioverlay);
  131.                 }

  132.                 /** * 公交换乘路线搜索结果 * * @param result 搜索结果 * @param iError 错误号(0表示正确返回) */
  133.                 @Override
  134.                 public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
  135.                 }

  136.                 /** * 步行路线搜索结果 * * @param result 搜索结果 * @param iError 错误号(0表示正确返回) */
  137.                 @Override
  138.                 public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
  139.                 }
  140.         }
  141. }
复制代码
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.search.map"
  4.     android:versionCode="1"
  5.     android:versionName="1.0" >

  6.     <uses-sdk android:minSdkVersion="8" />

  7.     <application
  8.         android:icon="@drawable/ic_launcher"
  9.         android:label="@string/app_name" >
  10.         <activity
  11.             android:label="@string/app_name"
  12.             android:name="PoiSearchActivity" >
  13.             <intent-filter >
  14.                 <action android:name="android.intent.action.MAIN" />

  15.                 <category android:name="android.intent.category.LAUNCHER" />
  16.             </intent-filter>
  17.         </activity>
  18.     </application>

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

  33. </manifest>
复制代码
在这个过程,要特别注意一点,模拟器是没有办法定位,当你加入定位模块的时候,传出的参数都是空的。
定位的这个方法函数,是通过回调接口来实现,而且触发该事件的时候,需要经纬度位置改变。
官方文档写得很清楚,简单点来说,就是你没有GPS定位设备就没有办法实现(只能真机测试),GPS定位是实时监控定位,随时都在接收和发射你的位置信息,只有不断的改变才能触发该定位事件。
(不得不说百度的开发人员很仔细)
QQ截图20120116115458.png
2012-1-16 11:53 上传
下载附件(18.52 KB)

希望有更好的建议,告诉我,共同进步。

Search.zip(1.51 MB, 下载次数: 1303)
2012-1-17 17:10 上传
点击文件名下载附件
源代码
下载积分: 下载豆 -2


其实,对于开发者来说,我觉得Android系统还是用回google提供的东西比较好。
google地图提供了30多个服务,而且很多服务都是非常简单就能使用的。
附上,我自己整理一些学习google map place的一些东西。
Google Map Place API的初步使用
http://jeese.blog.163.com/blog/static/200029145201201761713107/

一步步教你用Android Google Map
http://jeese.blog.163.com/blog/static/20002914520122155351455/

如果学会了google的这套map 我相信你会更喜欢使用它,开发起来要比百度地图方便。
兼容Android系统更好。
原创粉丝点击