高德地图搜索附近的实现

        最近项目中有用到搜索附近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地址:点击打开链接

 

       




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