最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个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检索仿微信发送位置相关推荐

  1. android开发百度地图坐标偏差,利用百度地图Android sdk高仿微信发送位置功能及遇到的问题...

    接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶 我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出 1.在微信发送 ...

  2. 仿微信发送位置(高德地图定位)

    仿微信发送位置,可以定位以及附近周边位置,搜索功能,获取位置以及经纬度 源码链接: https://download.csdn.net/download/jiaosheng1/11328362

  3. 腾讯地图仿微信发送位置功能

    以下内容转载自面糊的文章<模仿微信发送位置功能> 作者:面糊 链接:https://www.jianshu.com/p/47b3ada2e36d 来源:简书 著作权归作者所有.商业转载请联 ...

  4. 腾讯位置服务仿微信发送位置功能

    以下内容转载自面糊的文章<模仿微信发送位置功能> 作者:面糊 链接:https://www.jianshu.com/p/47b3ada2e36d 来源:简书 著作权归作者所有.商业转载请联 ...

  5. 利用百度地图Android sdk高仿微信发送位置功能

    接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶    我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出 1.在微 ...

  6. Android百度地图仿微信发送位置

    先上图 前提:有百度地图账号并配置了相关环境,可以参考百度地图开发者文档并下载so和jar 代码有相对应的注释,关键的就是百度地图移动版开发密钥.正确填写SHA1 和 程序包名,这将影响百度地图的功能 ...

  7. android仿微信发送位置,Android仿微信发送位置-百度地图

    [实例简介] [实例截图] [核心代码] package com.chenxuxu.baiduwechatposition; import android.app.Activity; import a ...

  8. Android百度地图POI检索无标记显示问题

    源码地址 Github:https://github.com/Abbylolo/BasicBaiduMap Gitee: https://gitee.com/wild-piglolo/basic-ba ...

  9. Android 腾讯地图 选点定位,仿微信发送位置

    效果图: 不需要集成定位.地图,然后标记 回调等繁琐的操作,你只需要一个webview,使用腾讯地图的地图选点组件即可. 申请key 接入指引 使用地图选点组件 调用方式一: 通过iframe内嵌调用 ...

最新文章

  1. keras中conv2d,conv2dTranspose的Padding详细介绍
  2. 美团点评:基于Druid的Kylin存储引擎实践
  3. Elasticsearch的功能,Elasticsearch的适用场景,Elasticsearch的特点(来自学习资料)
  4. Android年月日选择,Android日期选择器实现年月日三级联动
  5. python运行界面黑色,在Python中使用open执行轮廓检测后,如何使图像的背景变黑?...
  6. ubuntu 12.04 php5.3 降级为 5.2
  7. Spring Cloud 与微服务学习总结(16)—— 微服务架构统一安全认证设计与实践
  8. Matplotlib - bar(条形图)
  9. 随着浏览器窗口缩小表格出现横向滚动条
  10. 2021年电子签名政策汇总 行业研究数据公布
  11. 现代管理学 罗珉 第三版
  12. nginx 自建证书https 报错 no “ssl_certificate“ is defined in server listening on SSL port while SSL handsha
  13. linux 安装 navicat
  14. python多线程爬取图虫网图片
  15. python 处理Excel 数据分析
  16. 笔记本电脑摄像头黑屏怎么处理?
  17. html怎么转换成xmind,怎么把html导入XMind
  18. 金蝶标准版的服务器文件,金蝶标准版服务器设置
  19. 基于Google Edge TPU的Coral USB加速棒体验
  20. 爬虫抓取某饿了app商铺的评论数据

热门文章

  1. python画卡通人物_追忆童年,教你用Python画出儿时卡通人物
  2. 优秀平面设计师如何培养自己的创意思维
  3. V4L2文档翻译(九)
  4. 月模拟题3 201609-3 炉石传说
  5. 怎样让自己变得更优秀?职场精英是如何炼成的?怎样成为行业精英
  6. fore-each操作数组
  7. 探秘Hadoop生态6:Hive技术初探与实践入门
  8. 关于在Unity2018中使用Vuforia实现基础图片识别AR展现效果
  9. Python代码实现md5加密
  10. 2016-2019 书单