高德地圖搜索附近的實現

        最近項目中有用到搜索附近4S店和加油站的功能,於是我寫了個Demo,輸入你想查找的內容,就可以顯示相關的信息.效果如下:

        PS:listview中有兩個緯度,後一個應該是經度的,不小心寫錯了名稱。

      

     這裏使用的是高德地圖,先需要去高德SDK網站申請一個key,下載相應的SDK導入工程,需要地圖SDK和定位SDK,網站在此,然後配置AndroidManifest文件。

     配置對應權限:  

 <!-- 地圖包、搜索包需要的基礎權限 -->
   <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <!-- 定位包、導航包需要的額外權限(注:基礎權限也需要) -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     配置key  

 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="0f9baee65aefab8f09065d4e60942305" /> <!--輸入你申請的key  -->
    配置定位的服務

 <service android:name="com.amap.api.location.APSService" >
   現在編寫代碼了。先實現定位,獲取手機的經緯度,先創建一個AMapLocationClient 對象,  然後設置定位回調監聽,需要創建一個mLocationListener對象   

// 聲明定位回調監聽器
	public AMapLocationListener mLocationListener = new AMapLocationListener() {
		@Override
		public void onLocationChanged(AMapLocation amapLocation) {
			if (amapLocation != null) {
		        if (amapLocation.getErrorCode() == 0) {
		        //定位成功回調信息,設置相關消息
		        	Latitude=amapLocation.getLatitude();//獲取緯度
		            Longitude=amapLocation.getLongitude();//獲取經度
		        
		     } else {
		              //顯示錯誤信息ErrCode是錯誤碼,errInfo是錯誤信息,詳見錯誤碼錶。
		        Log.e("AmapError","location Error, ErrCode:"
		            + amapLocation.getErrorCode() + ", errInfo:"
		            + amapLocation.getErrorInfo());
		        }
		    }
		}
	};
    再獲取定位參數配置AMapLocationClientOption的實例,進行一些參數的配置,比如定位模式,間隔等。   

  <pre name="code" class="java">                // 初始化定位參數
		mLocationOption = new AMapLocationClientOption();
		// 設置定位模式爲高精度模式,Battery_Saving爲低功耗模式,Device_Sensors是僅設備模式
		mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
		// 設置是否返回地址信息(默認返回地址信息)
		mLocationOption.setNeedAddress(true);
		// 設置是否只定位一次,默認爲false
		mLocationOption.setOnceLocation(false);
		// 設置是否強制刷新WIFI,默認爲強制刷新
		mLocationOption.setWifiActiveScan(true);
		// 設置是否允許模擬位置,默認爲false,不允許模擬位置
		mLocationOption.setMockEnable(false);
		// 設置定位間隔,單位毫秒,默認爲2000ms
		mLocationOption.setInterval(2000);


      給客戶端對象設置參數,開始監聽

               // 給定位客戶端對象設置定位參數
		mLocationClient.setLocationOption(mLocationOption);
		// 啓動定位
		mLocationClient.startLocation();
      在mLocationListener的回調監聽裏可以獲得經緯度,下一步就是搜索附近的實現了,PS: 別忘了在onDestory方法裏關閉定位.

      先通過new PoiSearch.Query(keyword, type,cityCode )創建一個Query對象。 傳入三個參數,keyword是你要查找的內容,type是要查找的類型,默認爲:生活服務、餐飲服務、商務住宅,共有20種,cityCode是城市編號,可以傳空值,空值表示在全國範圍裏查找。獲取Query對象後,可以設置返回多少條結果,查第幾頁。傳入context和Query對象獲得PoiSearch對象,通過setBound方法設置中心點和查找區域,中心點則是之前獲取的定位的經緯度。 

     之後設置回調監聽器,然後調用searchPOIAsyn()方法開始搜索。    

query = new PoiSearch.Query(content, "汽車維修|修車服務", "");
		// keyWord表示搜索字符串,第二個參數表示POI搜索類型,默認爲:生活服務、餐飲服務、商務住宅
		// 共分爲以下20種:汽車服務|汽車銷售|
		// 汽車維修|摩托車服務|餐飲服務|購物服務|生活服務|體育休閒服務|醫療保健服務|
		// 住宿服務|風景名勝|商務住宅|政府機構及社會團體|科教文化服務|交通設施服務|
		// 金融保險服務|公司企業|道路附屬設施|地名地址信息|公共設施
		// cityCode表示POI搜索區域,(這裏可以傳空字符串,空字符串代表全國在全國範圍內進行搜索)
		query.setPageSize(10);// 設置每頁最多返回多少條poiitem
		query.setPageNum(1);// 設置查第一頁
		PoiSearch poiSearch = new PoiSearch(this, query);
		//如果不爲空值
		if(Latitude!=0.0&&Longitude!=0.0){
			poiSearch.setBound(new SearchBound(new LatLonPoint(Latitude,
					Longitude), 6000));// 設置周邊搜索的中心點以及區域
			poiSearch.setOnPoiSearchListener(this);// 設置數據返回的監聽器
			poiSearch.searchPOIAsyn();// 開始搜索
		}else{
			Toast.makeText(MainActivity.this, "定位失敗", 0).show();
		}

   返回的結果在onPoiSearched方法裏,就是參數PoiResult,這裏我用listview展示了結果。result.getPois()返回類型爲Poiltem的Arraylist集合,Poiltem有許多屬性,例如通過getTel()獲取電話,getDistance()獲取距離,getLatLonPoint獲取緯度等。   

    

@Override
	public void onPoiSearched(PoiResult result, int code) {
 		MyAdapter mAdapter=new MyAdapter(MainActivity.this,result.getPois());
	    result_listview.setAdapter(mAdapter);
  	}

就這樣完成了附近搜索功能,大家可以自己嘗試下。

      Demo地址:點擊打開鏈接

 

       




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章