Android高德地图poi检索仿微信发送位置

编程入门 行业动态 更新时间:2024-10-27 02:22:38

Android高德地图poi检索仿微信发送<a href=https://www.elefans.com/category/jswz/34/1771147.html style=位置"/>

Android高德地图poi检索仿微信发送位置

最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个demo,效果图如下:

从主界面中我们可以看到中心标记上面显示的就是我们定位的地址,下面是一个listview列表,第一条item的数据就是我们定位得到的地址,下面其余的都是我们根据定位得到的经纬度通过poi周边搜索得到的地址。我们进行了如下操作:

  1. 我们点击列表的item,中心标记会移动到该item对象的地址上面去。
  2. 我们手动移动地图的时候,中心标记的地址会发生相应的变化并且下面的列表也会发生相应的变化。
  3. 根据关键字poi搜索得到的列表,然后点击item主界面立马进行更新操作。

这里贴出主要代码,首先我们进行地图地位初始化操作:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_map);mapView.onCreate(savedInstanceState);// 此方法必须重写if (aMap == null) {aMap = mapView.getMap();// 自定义系统定位小蓝点MyLocationStyle myLocationStyle = new MyLocationStyle();// 设置小蓝点的图标myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_location_marker));// 设置小蓝点的图标                myLocationStyle.strokeColor(0x7F0070D9);// 设置圆形的边框颜色myLocationStyle.radiusFillColor(0x130070D9);// 设置圆形的填充颜色
//             myLocationStyle.anchor(int,int)//设置小蓝点的锚点myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细aMap.setMyLocationStyle(myLocationStyle);aMap.setLocationSource(this);// 设置定位监听(1)aMap.setOnCameraChangeListener(this);//手动移动地图监听 (2)aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示//设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是falseaMap.setMyLocationEnabled(true);aMap.moveCamera(CameraUpdateFactory.zoomTo(17.5f));}//------------------------------------------添加中心标记mMarkerOptions = new MarkerOptions();mMarkerOptions.draggable(false);//可拖放性mMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_tips_nearby));mCenterMarker = aMap.addMarker(mMarkerOptions);ViewTreeObserver vto = mapView.getViewTreeObserver();vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);mCenterMarker.setPositionByPixels(mapView.getWidth() >> 1, mapView.getHeight() >> 1);mCenterMarker.showInfoWindow();}});//---------------------------------------------初始化正反编码类  (3)mGeocoderSearch = new GeocodeSearch(this);mGeocoderSearch.setOnGeocodeSearchListener(this);}

我们注意重点关注在上面的三个监听回调,1处是定位监听,有以下两个回调方法:

        //-----------------地图定位回调//激活定位@Overridepublic void activate(OnLocationChangedListener onLocationChangedListener) {mListener = onLocationChangedListener;if (mlocationClient == null) {mlocationClient = new AMapLocationClient(this);mLocationOption = new AMapLocationClientOption();//设置定位监听mlocationClient.setLocationListener(this);(4)//设置为高精度定位模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位参数mlocationClient.setLocationOption(mLocationOption);// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()// 方法来取消定位请求// 在定位结束后,在合适的生命周期调用onDestroy()方法// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除mlocationClient.startLocation();}}//停止定位@Overridepublic void deactivate() {mListener = null;if (mlocationClient != null) {mlocationClient.stopLocation();mlocationClient.onDestroy();}mlocationClient = null;}

4处的监听定位成功后会回调onLocationChanged这个方法,在这个方法里面我们可以获得定位到的经纬读,地址,显示出上面我们设置的自定义系统定位小蓝点出来等等,

    @Overridepublic void onLocationChanged(AMapLocation aMapLocation) {//这个方法会循环执行mLongitude = aMapLocation.getLongitude();//经度mLatitude = aMapLocation.getLatitude();//纬度cityCode = aMapLocation.getCityCode();//citycode}

我们再来分析2处地图位置改变时回调:

    @Overridepublic void onCameraChange(CameraPosition cameraPosition) {}@Overridepublic void onCameraChangeFinish(CameraPosition cameraPosition) {/**这个方法很重要,虽然在上述的onLocationChanged方法我们也能获得坐标点的信息但是我们通常在这里获得定位坐标的经纬度,获得了经纬度后我们并不能知道该坐标点的具体坐标信息,所以需要把对应的坐标点转化为具体地址,这就是所谓的同步逆地理编码请求,和定位是黄金搭档*/mCurrentPoint = new LatLonPoint(cameraPosition.target.latitude, cameraPosition.target.longitude);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系RegeocodeQuery query = new RegeocodeQuery(mCurrentPoint, 200, GeocodeSearch.AMAP);mGeocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求}

3处我们做的地理正反编码回调如下:

    //----------------逆地址编码回调:坐标->地址@Overridepublic void onRegeocodeSearched(RegeocodeResult result, int rCode) {if (rCode == 0) {if (result != null && result.getRegeocodeAddress() != null && result.getRegeocodeAddress().getFormatAddress() != null) {/*** 汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|* 体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体* |科教文化服务|交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施*/mPoiQuery = new PoiSearch.Query("", "住宿服务|公司企业", result.getRegeocodeAddress().getCityCode());mPoiQuery.setPageSize(10);// 设置每页最多返回多少条poiitemmPoiQuery.setPageNum(0);//设置查第一页PoiSearch poiSearch = new PoiSearch(this, mPoiQuery);poiSearch.setOnPoiSearchListener(this);//设置数据返回的监听器 (5)//设置周边搜索的中心点以及区域poiSearch.setBound(new PoiSearch.SearchBound(mCurrentPoint, 1500, true)); poiSearch.searchPOIAsyn();//开始搜索} else {ToastUtil.show(mContext, R.string.no_result);}} else {ToastUtil.show(mContexts, rCode);}}//----------------地址编码回调:地址->坐标@Overridepublic void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {}

我们在这儿进行了poi周边搜索操作,回调方法

    @Overridepublic void onPoiSearched(PoiResult result, int rcode) {if (rcode == 0) {if (result != null && result.getQuery() != null) {// 搜索poi的结果if (result.getQuery().equals(query)) {// 是否是同一条poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();/*** listviw具体操作逻辑*/  }} else if (suggestionCities != null&& suggestionCities.size() > 0) {showSuggestCity(suggestionCities);}else {ToastUtil.show(mContexts, "对不起,没有搜索到相关数据!");}}}@Overridepublic void onPoiItemSearched(PoiItem poiitem, int rcode) {}/*** poi没有搜索到数据,返回一些推荐城市的信息*/private void showSuggestCity(List<SuggestionCity> cities) {String infomation = "推荐城市\n";for (int i = 0; i < cities.size(); i++) {infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:"+ cities.get(i).getCityCode() + "城市编码:"+ cities.get(i).getAdCode() + "\n";}ToastUtil.show(this, infomation);}

类似的含关键字的poi搜索也是类似的:

        // 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)mPoiQuery = new PoiSearch.Query(key, "", cityCode);mPoiSearch = new PoiSearch(this, mPoiQuery);mPoiQuery.setPageSize(15);// 设置每页最多返回多少条poiitemmPoiQuery.setPageNum(0);//设置查第一页mPoiSearch.setOnPoiSearchListener(this);// 设置搜索区域为以lp点为圆心,其周围5000米范围LatLonPoint lp=new LatLonPoint(latitude,longitude);mPoiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));mPoiSearch.searchPOIAsyn();//开始搜索

最后还有一个知识点就是我们点击item的时候地图自动去移动的实现,其实就是aMap.moveCamera方法去实现的,它会自动调用onCameraChangeFinish方法走的流程还是和我们手动拖动地图一样的。

 aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(poiItem.getLatLonPoint().getLatitude(), poiItem.getLatLonPoint().getLongitude()), 20));

基本上就是这样了,至于一些细节方面自己去调节和优化吧,哪些问题都不大。武汉这几天都是阴雨连绵,可能影响了心情吧,人也跟着抑郁起来了,今天难得出大太阳了,希望今年不管技术还是感情都能有所收获O(∩_∩)O哈哈~

更多推荐

Android高德地图poi检索仿微信发送位置

本文发布于:2023-07-03 14:16:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1007549.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:位置   地图   Android   仿微信   poi

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!