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) {

  /**

  * 汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|

  * 体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|zf机构及社会团体

  * |科教文化服务|交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施

  */

  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 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 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));

(0)

相关推荐

  • 高德地图怎么查询公交车的具体位置?

    等公交车很浪费时间,想要看看路线以及公交车的位置,该怎么查询呢?下面我们就来看看高德地图精确查询公交位置的教程. 1.首先启动软件,在上方搜索栏,可以输入出行目的地进行搜索. 2.如下图所示,出行目的 ...

  • 手机高德地图怎么组队邀请别人共享位置

    高德地图是我们现在经常使用的地图导航软件,今天小编跟大家分享的是手机高德地图怎么组队邀请别人共享位置.具体如下:1.首先我们打开手机中的高德地图.2. 进入主界面之后点击左上方的头像.3. 然后我们点 ...

  • 手机高德地图怎么解绑微信帐号

    高德地图是我们常用的导航软件之一,我们可能在使用的过程中绑定了微信号,如果我们想要更换微信号就需要进行解绑,接下来小编就教大家怎么解绑具体如下:1. 首先我们打开手机进入到手机桌面,然后在手机桌面找到 ...

  • 如何设置可以在高德地图上查看到他人的位置?

    有网友反映想通过高德地图查看家人的位置,要如何在手机上进行设置定位功能呢?请查看下面小编给出的解决方法:第一步:首先进入高德地图软件,然后点击窗口底部箭头所指的[我].第二步:接下来在个人窗口中,找到 ...

  • w'xv怎样给别人发送自己的位置信息(微信发送位置怎么自己创建)

    使用微信聊天时可以很方便快速的发送自己的位置给好友,如果觉得微信推荐位置不够准确,其实也可以通过自定义直接编辑位置信息的,那么微信怎么发送自定义位置呢?一起来看看下面的教程.微信怎么发送自定义位置?打 ...

  • 高德地图App中能不能查到他人的位置信息 怎么通过高德地图分享自己位置

    今天,小编给大家分享高德地图App中查询他人位置信息和分享自己位置的方法,希望对大家有所帮助.具体如下:1. 小编告诉大家,我们只有在别人把位置信息分享给自己时才能得知TA的信息,否则无法查询.首先, ...

  • 如何解决高德地图无法定位的问题

    今天给大家介绍一下高德地图无法定位的问题的具体解决方法.1. 解锁手机后,找到桌面上的设置图标,打开2. 进入设置页面后,找到应用选项,打开3. 在打开的应用设置页面,找到权限管理选项,打开4. 进入 ...

  • 高德地图怎么设置导航途径地点

    一般情况下,我们只使用了高德地图导航目的地的功能,殊不知我们还可以设置一个目的地和多个途经点,途经点就是指我们要去某个地方中途要经过的地点.下面小编就来给大家分享下如何设置高德地图的途经点吧. 操作方 ...

  • 怎么分享高德地图上的位置给微信好友

    有的小伙伴想要到某个地方去,但是却不知道该地方的路线,就想要使用高德地图来导航,然后分享给微信好友,但是却不知道如何分享给好友,那么小编就来为大家介绍一下吧.具体如下:1. 第一步,点击并打开高德地图 ...