Android高德地图poi检索仿微信发送位置实例代码

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

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

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

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

@Override protected 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表示隐藏定位层并不可触发定位,默认是false aMap.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() { @Override public 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处是定位监听,有以下两个回调方法:

//-----------------地图定位回调 //激活定位 @Override public 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(); } } //停止定位 @Override public void deactivate() { mListener = null; if (mlocationClient != null) { mlocationClient.stopLocation(); mlocationClient.onDestroy(); } mlocationClient = null; }

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

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

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

@Override public void onCameraChange(CameraPosition cameraPosition) { } @Override public 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处我们做的地理正反编码回调如下:

//----------------逆地址编码回调:坐标->地址 @Override public 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);// 设置每页最多返回多少条poiitem mPoiQuery.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); } } //----------------地址编码回调:地址->坐标 @Override public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) { }

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

@Override public 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, "对不起,没有搜索到相关数据!"); } } } @Override public 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);// 设置每页最多返回多少条poiitem mPoiQuery.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));

基本上就是这样了,至于一些细节方面自己去调节和优化吧,哪些问题都不大。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-31 09:00:31

Android高德地图poi检索仿微信发送位置实例代码的相关文章

Android仿微信发送语音消息的功能及示例代码

微信的发送语音是有一个向上取消的,我们使用onTouchListener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private MediaPlayer mPlayer = null; private MediaRecorder mRecorder = null; //语音文件保存路径 private String FileName = null; FileName = Environment.getExternalStorageDirectory().getAbs

Android 百度地图POI搜索功能实例代码_Android

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

关于Android高德地图的简单开发实例代码(DEMO)_Android

废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab

百度地图 poi检索返回PERMISSION_UNFINISHED

问题描述 百度地图 poi检索返回PERMISSION_UNFINISHED 大家好 ,我android项目中在使用百度检索功能时.在回调方法 public void onGetPoiResult(PoiResult poiResult) 参数poiResult中,一直出现PERMISSION_UNFINISHED.我注册的密钥安全码为3E:15:84:CA:CB:6E:21:5E:B7:D8:B1:6D:9D:46:2D:AD:27:4D:53:44;com.lst.请问各位大神是怎么回事?

Android 百度地图POI搜索功能实例代码

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

关于Android高德地图的简单开发实例代码(DEMO)

废话不多说了,直接给大家上干货了. 以下为初次接触时 ,练手的DEMO import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatab

android高德地图的使用

问题描述 android高德地图的使用 android高德地图开发如何下载完离线地图后调用呢,是自动调用还是怎样呢 解决方案 在Swift基础 - - 高德地图实践(一)中使用swift来使用高德地图,这里使用Android实践高德地图包含定位,移动地图动画,获取网络数据,marker标记以及点击,Infowindow自定义界面以及点击,以及点击无marker地图上面隐藏infowindow等功能.直接看代码package com.carmap.ui; import android.graphi

自动匹配-百度地图POI检索 做成这样大概步骤是什么

问题描述 百度地图POI检索 做成这样大概步骤是什么 列表">. 大神们这个具体怎么做能给点指导吗 解决方案 这个你需要建议查询或者POI检索. 参考:http://blog.csdn.net/crazy1235/article/details/44002459

高德地图POI升维 打通阿里电商数据

近期,高德地图开始了地图POI信息维度的全面升级.高德地图表示:POI(Point of Interest,地图兴趣点)信息应不仅仅包括横向的静态地理位置信息,还应该在纵向上叠加更多的基于位置的动态信息,这些信息将使POI所承载的内容信息更加丰富.立体,也使地图工具进一步人性化.动态化,体现更大的信息价值. 据了解,高德地图POI信息维度升级首先接入的是阿里巴巴电商数据,用户可在高德地图上的实体店铺POI详情中直接进入其天猫或淘宝店铺,之后高德地图还将接入多类基于位置的信息. POI升级 高德地