1.今天研究了一下高德地图的POI周边搜索,以及改变下初始定位,主要涉及关键字搜索和以及marker展示,还包括搜索结果信息的获取。

2.下面直接上源码,上面都已注释

布局文件:poi_around_search.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal" ><RelativeLayout
        android:layout_width="match_parent"android:layout_height="match_parent" ><com.amap.api.maps.MapView
            android:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_alignParentTop="true" ></com.amap.api.maps.MapView></RelativeLayout><RelativeLayout
        android:id="@+id/search_bar_layout"android:layout_width="match_parent"android:layout_height="48dp"android:layout_marginLeft="@dimen/offset_title"android:layout_marginRight="@dimen/offset_title"android:layout_marginStart="@dimen/offset_title"android:layout_marginTop="@dimen/offset_title"android:gravity="center_vertical"android:orientation="horizontal" ><TextView
            android:id="@+id/btn_search"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:background="@drawable/offlinearrow_tab2_pressed"android:clickable="true"android:gravity="center"android:paddingEnd="12dp"android:paddingLeft="12dp"android:paddingRight="12dp"android:paddingStart="12dp"android:text="搜索"android:textColor="@color/white"android:textSize="12dp"/><LinearLayout
            android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerVertical="true"android:layout_toLeftOf="@+id/btn_search"android:layout_toStartOf="@+id/btn_search"android:background="@drawable/search_input_half"android:clickable="true"android:gravity="center_vertical" ><EditText
                android:id="@+id/input_edittext"android:layout_width="match_parent"android:layout_height="match_parent"android:drawableLeft="@drawable/search_input"android:background="@color/transparent"android:hint="请输入搜索关键字"android:textColorHint="@color/darkgrey"android:singleLine="true"android:textColor="@color/gary"android:textSize="14sp" /></LinearLayout></RelativeLayout><RelativeLayout
        android:id="@+id/poi_detail"android:layout_width="match_parent"android:layout_height="80dp"android:layout_alignParentBottom="true"android:background="@drawable/border_bg"android:visibility="gone"><TextView
            android:id="@+id/poi_name"android:layout_width="wrap_content"android:layout_height="30dp"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_marginLeft="12dp"android:layout_marginStart="12dp"android:ellipsize="end"android:gravity="center_vertical"android:singleLine="true"android:textColor="#5566b8"android:textSize="15sp" /><TextView
            android:id="@+id/poi_address"android:layout_width="wrap_content"android:layout_height="35dp"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_below="@id/poi_name"android:layout_marginLeft="12dp"android:layout_marginStart="12dp"android:gravity="center_vertical"android:singleLine="true"android:textColor="#333333"android:textSize="15sp" /></RelativeLayout></RelativeLayout>

3.代码文件:PoiAroundSearch.java

package com.dragon.arnav.basicFuction.locationMap;import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CircleOptions;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.dragon.arnav.R;
import com.dragon.arnav.basicFuction.util.ToastUtil;import java.util.ArrayList;
import java.util.List;/*** This file created by dragon on 2016/8/4 13:19,* belong to com.dragon.arnav.basicFuction.locationMap .*/
public class PoiAroundSearch extends Activity implements OnClickListener,AMap.OnMapClickListener,AMap.OnInfoWindowClickListener,AMap.InfoWindowAdapter,AMap.OnMarkerClickListener,PoiSearch.OnPoiSearchListener {private MapView mapView;private AMap mAMap;//地图对象private PoiResult poiResult;//the result of the poiprivate int currentPage = 0;//the page start with 0private PoiSearch.Query query;//poi query//当前定位在深圳市南山区,这个经纬度应该是经过偏移的,具体原因,相信你懂的private LatLonPoint lp=new LatLonPoint(22.528402,113.938963);private Marker locationMarker;//选择点private Marker detailMarker;private Marker mlastMarker;private PoiSearch poiSearch;private myPoiOverlay poiOverlay;//poi图层private List<PoiItem> poiItems;//poi数据private PoiItem mPoi;private RelativeLayout mPoiDetail;private TextView mPoiName,mPoiAddress;private String keyWord = "";private EditText mSearchText;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.poi_around_search);
//        基本操作mapView = (MapView)findViewById(R.id.mapView);mapView.onCreate(savedInstanceState);init();}
//AMap对象的初始化private void init(){if(mAMap == null){mAMap = mapView.getMap();
//            AMap对象的监事件mAMap.setOnMapClickListener(this);mAMap.setOnMarkerClickListener(this);mAMap.setOnInfoWindowClickListener(this);mAMap.setInfoWindowAdapter(this);
//            获取相关控件TextView searchButton = (TextView)findViewById(R.id.btn_search);searchButton.setOnClickListener(this);
//初始位置标记locationMarker = mAMap.addMarker(new MarkerOptions().anchor(0.5f,0.5f).icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.point4))).position(new LatLng(lp.getLatitude(),lp.getLongitude())));locationMarker.showInfoWindow();}setup();
//        显示摄像头的大小mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lp.getLatitude(),lp.getLongitude()),14));}private void setup(){mPoiDetail = (RelativeLayout)findViewById(R.id.poi_detail);mPoiDetail.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){}});mPoiName =(TextView)findViewById(R.id.poi_name);mPoiAddress = (TextView)findViewById(R.id.poi_address);mSearchText = (EditText)findViewById(R.id.input_edittext);}//    begin poi serchprotected void doSearchQuery(){//Trim() 函数的功能是去掉首尾空格keyWord = mSearchText.getText().toString().trim();currentPage = 0;// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)query = new PoiSearch.Query(keyWord,"","深圳市");query.setPageSize(20);//setting how mang itmes to return;query.setPageNum(currentPage);//setup query the first page;if(lp!=null){poiSearch = new PoiSearch(this,query);poiSearch.setOnPoiSearchListener(this);// 设置搜索区域为以lp点为圆心,其周围5000米范围poiSearch.setBound(new PoiSearch.SearchBound(lp,5000,true));poiSearch.searchPOIAsyn();//asyn search}}@Overrideprotected void onResume(){super.onResume();mapView.onResume();whetherToShowDetailInfo(false);}@Overrideprotected void onPause(){super.onPause();mapView.onPause();}@Overrideprotected void onSaveInstanceState(Bundle outState){super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}@Overrideprotected void onDestroy(){super.onDestroy();mapView.onDestroy();}@Overridepublic void onPoiItemSearched(PoiItem arg0,int arg1){}
//    搜索成功时的回调@Overridepublic void onPoiSearched(PoiResult result, int rcode){if(rcode ==1000){
//            检测搜索结果if(result!=null && result.getQuery()!=null){
//                是否是同一条if(result.getQuery().equals(query)){poiResult = result;poiItems = poiResult.getPois();
//                   获取poitem数据List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();if(poiItems !=null && poiItems.size()>0) {//清楚POI信息whetherToShowDetailInfo(false);
//                        并还原点击marker样式if (mlastMarker != null) {resetlastmarker();}
//                        清除之前的结果marker样式if (poiOverlay != null) {poiOverlay.removeFromMap();}
//                        新的markermAMap.clear();poiOverlay = new myPoiOverlay(mAMap, poiItems);poiOverlay.addToMap();poiOverlay.zoomToSpan();mAMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.point4))).position(new LatLng(lp.getLatitude(), lp.getLongitude())));
//在地图上显示搜索范围圈mAMap.addCircle(new CircleOptions().center(new LatLng(lp.getLatitude(), lp.getLongitude())).radius(5000).strokeColor(Color.BLUE).fillColor(Color.argb(50, 1, 1, 1)).strokeWidth(2));}else if (suggestionCities !=null && suggestionCities.size()>0){showSuggestCity(suggestionCities);} else {ToastUtil.show(PoiAroundSearch.this,R.string.no_result);}}}else {ToastUtil.show(PoiAroundSearch.this,R.string.no_result);}}}public boolean onMarkerClick(Marker marker) {if (marker.getObject() != null) {
//            显示相关的位置信息whetherToShowDetailInfo(true);try {PoiItem mCurrentPoi = (PoiItem) marker.getObject();if (mlastMarker == null) {mlastMarker = marker;} else {
//                    还原原来的markerresetlastmarker();mlastMarker = marker;}detailMarker = marker;
//                按下后的显示图标detailMarker.setIcon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.poi_marker_pressed)));setPoiItemDisplayContent(mCurrentPoi);} catch (Exception e) {}} else {whetherToShowDetailInfo(false);resetlastmarker();}return true;}
//    将之前点击的marker还原为原来的状态private void resetlastmarker() {int index = poiOverlay.getPoiIndex(mlastMarker);
//        10个以内的marker显示图标if(index<10){mlastMarker.setIcon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),markers[index])));}else{
//            大于10个后的marker显示图标信息mlastMarker.setIcon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.marker_other_highlight)));}mlastMarker = null;}private void setPoiItemDisplayContent(final PoiItem mCurrentPoi){mPoiName.setText(mCurrentPoi.getTitle());mPoiAddress.setText(mCurrentPoi.getSnippet());}@Overridepublic View getInfoContents(Marker arg0){return null;}@Overridepublic View getInfoWindow(Marker arg0){return null;}@Overridepublic void onInfoWindowClick(Marker arg0){}@Overridepublic void onClick(View v){switch (v.getId()) {case R.id.btn_search:doSearchQuery();break;default:break;}}private int[] markers = {R.drawable.poi_marker_1,R.drawable.poi_marker_2,R.drawable.poi_marker_3,R.drawable.poi_marker_4,R.drawable.poi_marker_5,R.drawable.poi_marker_6,R.drawable.poi_marker_7,R.drawable.poi_marker_8,R.drawable.poi_marker_9,R.drawable.poi_marker_10,};private void whetherToShowDetailInfo(boolean isToShow){if(isToShow){mPoiDetail.setVisibility(View.VISIBLE);}else {mPoiDetail.setVisibility(View.GONE);}}@Overridepublic void onMapClick(LatLng arg0){whetherToShowDetailInfo(false);if(mlastMarker!=null){resetlastmarker();}}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);}
//myPoiOverlay类,该类下面有多个方法private class myPoiOverlay{private AMap mamap;private List<PoiItem> mPois;private ArrayList<Marker> mPoiMarks = new ArrayList<Marker>();
//    构造函数,传进来的是amap对象和查询到的结果itmes  mPoispublic myPoiOverlay(AMap amap,List<PoiItem>pois){mamap = amap;mPois = pois;}//增加Maker到地图中public void addToMap(){for(int i=0;i<mPois.size();i++){Marker marker = mamap.addMarker(getMarkerOptions(i));PoiItem item = mPois.get(i);marker.setObject(item);mPoiMarks.add(marker);}}
//移除所有的markerpublic void removeFromMap(){for(Marker mark: mPoiMarks){mark.remove();}}
//移动镜头到当前的视角public void zoomToSpan(){if(mPois !=null && mPois.size()>0){if(mamap ==null) return;LatLngBounds bounds = getLatLngBounds();
//            瞬间移动到目标位置mamap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,100));}}private LatLngBounds getLatLngBounds(){LatLngBounds.Builder b = LatLngBounds.builder();for(int i=0;i<mPois.size();i++){b.include(new LatLng(mPois.get(i).getLatLonPoint().getLatitude(),mPois.get(i).getLatLonPoint().getLongitude()));}return b.build();}private MarkerOptions getMarkerOptions(int index){return new MarkerOptions().position(new LatLng(mPois.get(index).getLatLonPoint().getLatitude(),mPois.get(index).getLatLonPoint().getLongitude())).title(getTitle(index)).snippet(getSnippet(index)).icon(getBitmapDescriptor(index));}protected String getTitle(int index){return mPois.get(index).getTitle();}protected String getSnippet(int index){return mPois.get(index).getSnippet();}
//获取位置,第几个index就第几个poipublic int getPoiIndex(Marker marker){for(int i=0;i<mPoiMarks.size();i++){if(mPoiMarks.get(i).equals(marker)){return i;}}return -1;}public PoiItem getPoiItem(int index) {if (index < 0 || index >= mPois.size()) {return null;}return mPois.get(index);}protected BitmapDescriptor getBitmapDescriptor(int arg0){if(arg0<10){BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),markers[arg0]));return icon;}else {BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.marker_other_highlight));return icon;}}}}

github源码下载链接


专注于AR的在移动端的实现,如果你还有问题没解决,你可以加入我们一起交流。或是关注我们的技术公众号,这是提供技术干货的地方,你有干货可以向我们推荐。

如果你觉得写的不错,对你有用,请在下面点个 支持一下嘛,有问题可以在下面留言评论。


最新基于高德地图的android进阶开发(6)感兴趣点(POI)周边搜索源码浅析相关推荐

  1. 基于Android Studio开发的旅游记录与分享APP源码,Android旅游路线记录与分享APP源码

    GoTravelling 旅游路线记录与分享Android App--同享旅行 下载地址:基于Android Studio开发的旅游记录与分享APP源码 App介绍 目标用户 在寒暑假内希望结伴同游的 ...

  2. Android App开发实战项目之购物车(附源码 超详细必看)

    需要源码请点赞关注收藏后评论区留言~~~ 一.需求描述 电商App的购物车可谓是司空见惯了,可以知道购物车除了底部有一个结算行,其余部分主要是已加入购物车的商品列表,然后每个商品左边是商品小图,右边是 ...

  3. android进阶篇02、RecyclerView回收复用机制源码解析,h5移动端开发进行定位

    public void removeAndRecycleViewAt(int index, @NonNull Recycler recycler) { final View view = getChi ...

  4. 南邮Android实验报告三:基于高德地图的综合应用

    实验三 基于高德地图的综合应用 一.目的要求 1.学会安卓应用中涉及位置服务时的解决方案. 2.练习在使用第三方插件时,遇到版本不兼容时的处理步骤和方法. 二.实验环境 1.硬件配置:Intel Co ...

  5. android 基于高德地图的轨迹回放

    android 基于高德地图的轨迹回放 前段时间公司项目有一个需求,就是需要看到设备上传之后的轨迹路线,并且可以实现回放的整个过程,功能包括路线回放.地图位置插点.回放之后的轨迹标记颜色.回放加速等功 ...

  6. Android学习之高德地图的通用功能开发步骤(二)

    周一又来了,我就接着上次的开发步骤(一)来吧,继续把高德地图的相关简单功能分享一下 上次写到了第六步,接着写第七步吧. 第七步:定位 + 地图选点 + 路径规划 + 实时导航 以下是我的这个功能Nav ...

  7. Android基于高德地图实现多人实时共享位置

    自开发上一款智慧旅游产品后,发现一个很有意义而且很实用的功能,就是模仿微信的位置共享,可以看到对方的位置,一直想模仿做出这样的效果.最近闲下来之后终于实现了.下面就把我的实现过程和心得分享给大家. 步 ...

  8. 只用一个marker 替换 高德_Android基于高德地图完全自定义Marker的实现方法

    前言 相信做地图社交类APP开发的大家都知道,一般情况下,为了整体的美观和用户体验度,我们需要定制化Marker的样式.本文中实现的方式都是基于高德地图的,百度地图也类似,大家可以照葫芦画瓢,废话不多 ...

  9. 基于高德地图JsAPI进行浏览器精确定位,实现手机端考勤打卡功能

    前言: 由于项目需求需要在项目中实现手机端(基于网页)考勤打卡功能,最初考虑使用H5自身定位功能,但尝试过后,效果很不稳定.然后尝试使用百度地图JsAPI,百度家的稳定倒是很稳定,没想到的是定位位置和 ...

  10. 基于高德地图SDK实现跑步路线踩点

    前言   现在市面上有很多跑步的app,主要的功能大致是记录你的跑步路线以及你的跑步状况,速度距离等,大多是使用了高德地图,百度地图之类的SDK.   之前学校里有一款课外体育考勤的跑步APP,叫运动 ...

最新文章

  1. MySQL面试题 | 附答案解析(六)
  2. 如何轻松学会一门外语?
  3. 蓝牙进阶之路 (001) - HC-05蓝牙无线模块设置
  4. 函数式编程语言python-用Python进行基础的函数式编程的教程
  5. 操作系统(十一)线程的概念和特点
  6. (Docker实战) 第五篇:建立持续集成环境02
  7. ES6: 参数默认值及中间域
  8. Atlassian发布Bamboo 6.0和Bitbucket Server 5.0
  9. 希赛软考学习包,助您快通过软考考试
  10. 360携手HarmonyOS打造独特的“天气大师”
  11. SplitContainer控件扩展之收缩面板
  12. 思科模拟器pnatlab,华为模拟器ensp桥接本地
  13. 【疑难杂症】三步解决虚拟机启动失败,提示无法获取VMCI驱动程序的版本的问题
  14. 解析:Are We Really Making Much Progress?A Worrying Analysis of Recent Neural Recommendation Approaches
  15. 软件测试之柠檬班python全栈自动化50期测试笔记
  16. TW6869 drivers porting for freescaleandroid
  17. 动态规划求解最少硬币是多少?
  18. 个人深度学习工作站配置
  19. s7-200与计算机modbus通讯案例,西门子S7-200 Smart Modbus通信介绍与实例编程
  20. linux-gcc 找不到命令,为什么显示gcc命令没有找到?

热门文章

  1. Struts2--类型转换
  2. 查找数组中特定元素_Leetcode 540 题 有序数组中的单一元素
  3. Anaconda的安装与使用(Windows下)
  4. OpenCV-图像处理(31、图像矩(Image Moments))
  5. C语言和C++中如何编写交换两个整形变量值的函数
  6. cls_template.php on line 1067,ecshop php5.5兼容utf-8版本
  7. xis表格怎么打印_Excel做的表格怎么打印
  8. 【2019牛客多校第七场:H】Pair(数位dp)
  9. 【UVA12230】Crossing Rivers(概率/期望)
  10. 生成word_用Word生成员工信息表,单独生成独立文件,还能自动命名