天天看點

百度地圖API 之 定位周邊搜尋POI(奉上源代碼)+ GoogleMap 詳細

學習了柳峰大哥的例子

之前隻是單一實作了定位功能 和 搜尋周邊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.     <com.baidu.mapapi.MapView
  11.         android:id="@+id/map_View"
  12.         android:layout_width="fill_parent"
  13.         android:layout_height="fill_parent"
  14.         android:clickable="true" />
  15. </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.         public class MySearchListener implements MKSearchListener {
  105.                 @Override
  106.                 public void onGetAddrResult(MKAddrInfo result, int iError) {
  107.                 }
  108.                 @Override
  109.                 public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
  110.                 }
  111.                 @Override
  112.                 public void onGetPoiResult(MKPoiResult result, int type, int iError) {
  113.                         if (result == null) {
  114.                                 return;
  115.                         }
  116.                         // PoiOverlay是baidu map api提供的用于顯示POI的Overlay
  117.                         PoiOverlay poioverlay = new PoiOverlay(PoiSearchActivity.this, mapView);
  118.                         // 設定搜尋到的POI資料
  119.                         poioverlay.setData(result.getAllPoi());
  120.                         // 在地圖上顯示PoiOverlay(将搜尋到的興趣點标注在地圖上)
  121.                         mapView.getOverlays().add(poioverlay);
  122.                 }
  123.                 @Override
  124.                 public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
  125.                 }
  126.                 @Override
  127.                 public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
  128.                 }
  129.         }
  130. }

複制代碼 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定位是實時監控定位,随時都在接收和發射你的位置資訊,隻有不斷的改變才能觸發該定位事件。

(不得不說百度的開發人員很仔細)

百度地圖API 之 定位周邊搜尋POI(奉上源代碼)+ GoogleMap 詳細

2012-1-16 11:53 上傳 下載下傳附件(18.52 KB)

希望有更好的建議,告訴我,共同進步。

百度地圖API 之 定位周邊搜尋POI(奉上源代碼)+ GoogleMap 詳細

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系統更好。

繼續閱讀