Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用

  • 一简要描述
  • 二地图中已标记POI点
    • 1接口
    • 2MapPoi 类
    • 3获取POI
  • 三搜索关键词获取POI点
    • 描述
    • 1combaidumapapisearchpoi
      • 接口OnGetPoiSearchResultListener
      • PoiResult类
      • PoiInfo类
      • 搜索POI
    • 2combaidumapapisearchsug
      • 接口
      • SuggestionResultseggestionInfo
      • 联想搜索
  • 四搜索效果
    • 1联想搜索效果
    • 2直接搜索效果
    • 3选择一条联想搜索结果
  • 五总结

一.简要描述

百度地图的POI点可以分有两种:地图中已经标记的点和通过关键词搜索得到的POI点。对于这两种POI点,百度封装成了不同的类和接口来实现监听,下面简单讲一点。

二.地图中已标记POI点

首先遇到的第一个问题就时如何获取已标记点的信息,在百度地图点击已标记的点会有信息的,那么在自己的地图上如何产生点击事件呢?

(1)接口

百度提供了一个POI点击事件的接口 BaiduMap.OnMapClickListener,该接口提供了两个方法,如下表。

(测试下CSDN的MarkDown编辑器画表格的功能,不会把首行的标题居中呀)

返回类型 方法 说明
boolean onMapClick(LatLng point) 地图单击事件回调函数
boolean onMapPoiClick(MapPoi poi) 地图内 Poi 单击事件回调函数

(2)MapPoi 类

返回类型 方法 说明
java.lang.String getName() 获取该兴趣点的名称
LatLng getPosition() 获取该兴趣点的地理坐标

(3)获取POI

我们只需要重写onMapPoiClick()就可以了。

代码如下:

 baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
            }
            @Override
            public boolean onMapPoiClick(MapPoi mapPoi)
            {
                String POIName = mapPoi.getName();//POI点名称
                LatLng POIPosition = mapPoi.getPosition();//POI点坐标
                //下面就是自己随便应用了
                //根据POI点坐标反向地理编码
                //reverseSearch(POIPosition);
                 //添加图层显示POI点
                /*baiduMap.clear();
                baiduMap.addOverlay(
                        new MarkerOptions()
                                .position(POIPosition)                                     //坐标位置
                                .icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka))
                                .title(POIName)                                         //标题

                );
                //将该POI点设置为地图中心
                baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(POIPosition));*/
                return true;
            }
        });

其次,为了获得该POI点的其他详细信息,因为MapPoi没有uid,我尝试通过对position进行反向地理编码,结果还是不太满意,百度地图上直接点击已标记的POI点,是可以获得该点的很多信息的(可见下面的第三部分中PoiInfo),关于这一点,暂时还没找到更好的方式解决。

三.搜索关键词获取POI点

1.描述

该功能就是百度地图首页的顶端,输入想要去的地方或者食物、店铺等名词进行POI搜索,但是这部分分两种查询结果:

(1)根据关键词直接搜索到的相关POI,对应包为com.baidu.mapapi.search.poi;

(2)根据关键词进行联想得到的POI,对应包为com.baidu.mapapi.search.sug。

所谓联想搜索得到的POI,比如我们输入上海的时候,百度会联想搜索将结果提示给你:上海菜、上海大众汽车等等,如下图

2.两种POI有用不同的接口、回调函数、数据类型,如下表:

(1)com.baidu.mapapi.search.poi

接口:OnGetPoiSearchResultListener

类型 方法 说明
void onGetPoiDetailResult(PoiDetailResult result) poi详情查询结果回调
void onGetPoiResult(PoiResult result) poi 查询结果回调

然后主要需要了解的是

PoiResult类

PoiInfo类

搜索POI

private AutoCompleteTextView keyWorldsView;//输入搜索文字的AutoCompleteTextView
private PoiSearch mPoiSearch;//POI搜索模块
mPoiSearch = PoiSearch.newInstance();//实例化
PoiSearch.setOnGetPoiSearchResultListener(this);//监听接口
//*****
//比如在onclick事件里添加:搜索->进入回调函数:onGetPoiResult(PoiResult result)
mPoiSearch.searchInCity((new PoiCitySearchOption())//
              .city(currentLoction.getCity())//定位的城市为搜索city
              .keyword(keyWorldsView.getText().toString())//关键词
              .pageNum(loadIndex));//第几页:默认从0开始,分页为10,所以如果搜索结果大于10,要显示多余10的部分就需要进行loadIndex=页码,或者loadIndex++等来更改loadIndex显示下一页数据

接下来就是onGetPoiResult(PoiResult result)

 public void onGetPoiResult(PoiResult result) {
        if (result == null
                || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
            Toast.makeText(PoiSearchDemo.this, "未找到结果", Toast.LENGTH_LONG)
                    .show();
            return;
        }
        if (result.error == SearchResult.ERRORNO.NO_ERROR) {
            //成功在传入的搜索city中搜索到POI
            //对result进行一些应用
            //一般都是添加到地图中,然后绑定一些点击事件
            //官方Demo的处理如下:
            mBaiduMap.clear();
            PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);
            mBaiduMap.setOnMarkerClickListener(overlay);
            //MyPoiOverlayextends PoiOverlay;PoiOverlay extends OverlayManager
            //看了这三个class之间的关系后瞬间明白咱自己也可以写overlay,重写OverlayManager中的一些方法就可以了
            //比如重写了点击事件,这个方法真的太好,对不同类型的图层可能有不同的点击事件,百度地图3.4.0之后就支持设置多个监听对象了,只是本人还没把这个方法彻底掌握...
            overlay.setData(result);//图层数据
            overlay.addToMap();//添加到地图中(添加的都是marker)
            overlay.zoomToSpan();//保证能显示所有marker
            return;
        }
        if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {

            // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
            String strInfo = "在";
            for (CityInfo cityInfo : result.getSuggestCityList()) {
                strInfo += cityInfo.city;
                strInfo += ",";
            }
            strInfo += "找到结果";
            Toast.makeText(PoiSearchDemo.this, strInfo, Toast.LENGTH_LONG)
                    .show();
        }
    }

(2)com.baidu.mapapi.search.sug

接口

该包就一个void onGetSuggestionResult(SuggestionResult result)

SuggestionResult.seggestionInfo

从字段说明中可以看到,联想搜索的结果都是已经标记的POI点,拥有uid

联想搜索

 @Override
    public void onGetSuggestionResult(SuggestionResult res) {
        if (res == null || res.getAllSuggestions() == null) {
            return;
        }
        suggest = new ArrayList<String>();//获取联想搜索结果
        for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) {
            if (info.key != null) {
                suggest.add(info.key);
            }
        }
        sugAdapter = new ArrayAdapter<String>(PoiSearchDemo.this, android.R.layout.simple_dropdown_item_1line, suggest);//适配器,当然可以给加上item的click事件进行处理
        keyWorldsView.setAdapter(sugAdapter);
        keyWorldsView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                SuggestionResult.SuggestionInfo info = res.getAllSuggestions().get(position);
                //String uid = info.uid;
                mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())//去搜索该POI的详情->onGetPoiDetailResult(PoiDetailResult result)
                        .poiUid(info.uid));
            }
        });
        sugAdapter.notifyDataSetChanged();
    }

四.搜索效果

(1)联想搜索效果

(2)直接搜索效果

搜索餐厅的结果:其实这里还可以个性化处理,比如在定位的附近搜索等等

(3)选择一条联想搜索结果

选在一条联想搜索结果的显示:

五.总结

就如前面所说,OverlayManager的重写,可以让我们对图层进行一些个性化的处理是非常容易的,只是自己的前期做的时候并没有发现这一点,而且有对图层的一些操作,所以现在想重构图层相关的代码真的一时半会还完成不了。

时间: 2024-08-07 12:55:31

Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用的相关文章

Android studio 百度地图开发(5)查询周边服务(加油站)

email:[email protected] 开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0. 百度地图应用(1):Android studio 百度地图开发(1)配置工程.显示地图 百度地图应用(2):Android studio 百度地图开发(2)地图定位 百度地图应用(3):Android studio 百度地图开发(3)地图导航 百度地图应用(4):Android studio 百度地图开发(4)触摸选点

Android studio 百度地图开发(6)Marker绑定事件、计算两点距离

email:[email protected] 开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0. 百度地图应用(1):Android studio 百度地图开发(1)配置工程.显示地图 百度地图应用(2):Android studio 百度地图开发(2)地图定位 百度地图应用(3):Android studio 百度地图开发(3)地图导航 百度地图应用(4):Android studio 百度地图开发(4)触摸选点

Android studio 百度地图开发(3)地图导航

email:[email protected] 开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0. 地图显示.工程配置请参考:Android studio 百度地图开发(1)配置工程.显示地图 百度地图定位请参考:Android studio 百度地图开发(2)地图定位 一.我为百度做点事 因为在写定位功能时自己想从头到尾地写,但最后完全是参考了百度官网上的Demo才弄出来,后来发现用Android Studio做导

Android studio百度地图demo出现230错误,key校验失败

转自daoxiaomianzi原文 Android studio 百度地图demo出现230错误,key校验失败 使用AndroidStudio导入Baidu地图的as版的demo,引入后,发现没有key,于是到http://lbsyun.baidu.com/apiconsole/key,创建应用,申请key,但是把sha1和报名都输入后,将key复制到manifest.xml里,部署到手机上,提示: 验证出错,错误码:230,请AndroidManifest.xml文件中检查 kye 设置.

android studio ndk-builld方式开发

之前都是在Ubuntu开发,项目也是老的,自然也就顺理成章的用eclipse做各种android的开发.最近想在android studio 切换下,有点不习惯.android studio 为ndk开发提供了两种不同的方式,使用cmake自动编译脚本 和类似eclipse上的ndk-build.这两者之间使用区别在于,如果想直接开发新的单模块可以考虑使用cmake,ide有自带辅助插件,让程序员使用起来更加舒心.如果想在第三方源码库上面做二次开发,或者需要多个源码库关联,感觉还是使用ndk-b

Android实战技巧之二十三:Android Studio的NDK开发

较新的NDK版本是r10b,Android Studio对NDK开发的支持还处于构思阶段,所以很多工作比如用javah生成头文件等工作还要自己做.今天用一个例子来演示AS中的NDK开发. 新建一个项目SecondNdkTest 在此项目中新建一个Module叫ndklibrary,作为so库单独划出来.在library中新建一个java类SecondLib,内容如下: package com.linc.ndklibrary; /** * Created by linc on 15-3-29. *

Android地图开发之地图的选择

做lbs开发差不多快2年了,地图相关的产品也差不多做了3个了,用到过的地图包括google地图.高德地图.百度地图.图吧.Osmdroid,今天总结下,方便大家开发时选择合适的地图. 首先说定位模块选择,高德地图.百度地图现在都有了单独的地位sdk,且都支持全球定位,都是非常不错的选择.我现在做的项目对定位要求很高,现在的选择是gps定位使用系统定位方式,基站定位使用百度定位,gps连接成功使用系统定位接口,gps断开切换到百度基站定位. gps定位,百度和高德都用过,但是测试发现没有同类产品统

使用Android Studio进行安卓开发教程

本教程介绍如何创建Android应用程序.它基于Android5.0(Lollipop)介绍Android Studio的用法. 安卓介绍 Android是基于Linux内核的操作系统.负责开发Android系统的项目被为Android Open Source Project (AOSP) ,由谷歌领导. Android系统支持后台处理,提供了丰富的用户界面库,使用的OpenGL标准支持2-D和3-D图形,并允许访问文件系统以及嵌入式SQLite数据库. Android应用包含可见和不可见组件,

Android开发工具全面转向Android Studio(1)——准备开发环境

工欲善其事必先利其器,本文适合Android新手以及用过Eclipse而没用过Android Studio开发Android的老手,众所周知,谷歌是不会再维护和开发ADT了,旧的ADT已经是完全不能渲染Android 6.0的UI布局了,码农们必须适应时代快速转向AS. 注:以下以Windows平台为标准,AS以目前最新稳定版1.4.1为准.为了描述简单,以下用<AS>代替Android Studio描述词. 一.正常使用AS进行开发必备软件环境:一个操作系统(Windows.OSX或Linu