写在前面

本来想使用百度定位的SDK把定位功能实现了,可无奈遇上个坑到写这篇blog为止都还没有解决。故所以把使用百度地图SDK实现简单的POI检索功能和遇到的坑先做一个总结。

下载.os和jar包

如果需要使用自定义的功能,最好不要分别下载。

例如之前我只是想先简单的实现POI检索功能,所以只下载了跟百度地图相关的SDK,实现了之后觉得单调,决定加入定位功能的时候再单独去下载了定位相关的SDK,坑就出现了,引入.os和jar之后,

出现 java.lang.NoSuchMethodError: No direct method 这样的错误。只要我们下载的时候勾选要下载的SDK统一下载,就不会出现这样的bug了。

这里写图片描述

2.jar和.os引入之后,仍然无法使用(初始化SDK)。

解决方案是在app的build.gradle加入

android{

...

sourceSets {

main() {

jniLibs.srcDirs = ['libs']

}

}

}

这在地图的文档没有说到,但在定位的文档才可以找到。小小的吐槽一下百度文档...

地图初始化

添加密匙 (申请百度账号,密匙在这里就不写了。很简单)

android:name="com.baidu.lbsapi.API_KEY"

android:value="开发者 key" />

添加所需权限

在布局xml文件中添加地图控件

android:id="@+id/bmapView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:clickable="true" />

在应用程序创建时初始化 SDK

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

/***

* 初始化定位sdk,建议在Application中创建

*/

SDKInitializer.initialize(getApplicationContext());

}

}

管理地图生命周期

@Override

protected void onDestroy() {

super.onDestroy();

//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理

mMapView.onDestroy();

}

@Override

protected void onResume() {

super.onResume();

//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理

mMapView.onResume();

}

@Override

protected void onPause() {

super.onPause();

//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理

mMapView.onPause();

}

}

当然,还要在你的AndroidManifest中把你的Application设置成我们自定义的MyApplication

完成以上步骤运行,就能把地图显示出来,在没实现定位功能之前,初始化位置是在北京。

POI检索

初始化POI检索对象

/**

*实例化

*/

PoiSearch mPoiSearch = PoiSearch.newInstance();

/**

*回调

*/

OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){

@Override

public void onGetPoiResult(PoiResult result){

//获取POI检索结果

}

@Override

public void onGetPoiDetailResult(PoiDetailResult result){

//获取Place详情页检索结果

}

@Override

public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

//获取门址类列表

}

};

/**

*设置监听

*/

mPoiSearch.setOnGetPoiSearchResultListener(poiListener);

检索

城市检索

mPoiSearch.searchInCity((new PoiCitySearchOption())

.city("深圳")//城市

.keyword("美食")//检索关键字

.pageNum(0)//分页编码

.pageCapacity(5));//每页容量,默认10条

周边检索

mPoiSearch.searchNearby(new PoiNearbySearchOption()

//搜索结果排序规则,PoiSortType.comprehensive->距离排序

.sortType(PoiSortType.comprehensive) ->综合排序;

.radius(1000)//检索半径范围,单位:米

.location(LatLng location)) //检索位置

区域检索

mPoiSearch.searchInBound(new PoiBoundSearchOption()

.bound(LatLngBounds bound)//检索范围

);

构建LatLngBounds对象

LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);// 西南

LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 东北

LatLngBounds bounds = new LatLngBounds.Builder().include(southwest)

.include(northeast).build();// 得到一个地理范围对象

所有检索的结果都在poiListener中回调

在每一个POI中都包含一个"Uid"的字段,如果我们需要知道某个POI的详情,我们可以

mPoiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(uid));

检索的结果同样是在poiListener中回调

详细的文档内容在这里

在回调中得到的是一条条的信息,纯文本看着多没意思,展示的地图还没用上。那我们就可以给每个检索出来的POI在地图上标注起来,瞬间好玩多了!

覆盖物

自定义 PoiOverlay 类

private class MyPoiOverlay extends PoiOverlay {

public MyPoiOverlay(BaiduMap baiduMap) {

super(baiduMap);

}

@Override

public boolean onPoiClick(int index) {

super.onPoiClick(index);

return true;

}

}

在POI检索回调接口中添加自定义的PoiOverlay

public void onGetPoiResult(PoiResult result) {

if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {

return;

}

if (result.error == SearchResult.ERRORNO.NO_ERROR) {

mBaiduMap.clear();

//创建PoiOverlay

PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);

//设置overlay可以处理标注点击事件

mBaiduMap.setOnMarkerClickListener(overlay);

//设置PoiOverlay数据

overlay.setData(result);

//添加PoiOverlay到地图中

overlay.addToMap();

overlay.zoomToSpan();

return;

}

}

这样,检索出来的POI在地图上就完成标注了

这里写图片描述

写到这里,简单的地图的POI功能就完成了。

写在最后

简简单单的POI检索当然不能满足我们日益膨胀的心呀!所以现在努力实现定位的功能,到时候再更新blog,分享给那些还没了解定位但即将使用的筒靴一个开篇指引和遇到的坑。加油!

note:

在覆盖物中设计到两个类:PoiOverlay 和OverlayManager在SDK中是没有的,但在官方的Demo中给出。这里是给没有下载Demo的筒靴的一个帮助,希望可以共同进步!

12月6号更新:

今天什么也没改跑了一遍Demo,原先实现的定位功能突然就好了... 船到桥头自然直呀

贴一下定位的代码,基本照搬官方文档上的代码,就不作过多的解释了

/**

* 封装定位结果和时间的实体类

*

* @author baidu

*/

class LocationEntity {

BDLocation location;

long time;

}

private void initlocalMap() {

mBaiduMap = mMapView.getMap();

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(15));

mBaiduMap.setMyLocationEnabled(true);

locService = ((MyApplication) getApplication()).locationService;

LocationClientOption mOption = locService.getDefaultLocationClientOption();

mOption.setOpenGps(true);

mOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

mOption.setCoorType("bd09ll");

// locService.setLocationOption(mOption);

// locService.registerListener(listener);

// locService.start();

mClient = new LocationClient(this);

mClient.setLocOption(mOption);

mClient.registerLocationListener(listener);

mClient.start();

}

/***

* 定位结果回调,在此方法中处理定位结果

*/

BDLocationListener listener = new BDLocationListener() {

@Override

public void onReceiveLocation(BDLocation location) {

if (location != null && (location.getLocType() == 161 || location.getLocType() == 66)) {

Message locMsg = locHander.obtainMessage();

Bundle locData;

locData = Algorithm(location);

if (locData != null) {

locData.putParcelable("loc", location);

locMsg.setData(locData);

locHander.sendMessage(locMsg);

}

}

}

};

/***

* 平滑策略代码实现方法,主要通过对新定位和历史定位结果进行速度评分,

* 来判断新定位结果的抖动幅度,如果超过经验值,则判定为过大抖动,进行平滑处理,若速度过快,

* 则推测有可能是由于运动速度本身造成的,则不进行低速平滑处理 ╭(●`∀´●)╯

*

* @param location

* @return Bundle

*/

private Bundle Algorithm(BDLocation location) {

Bundle locData = new Bundle();

double curSpeed = 0;

if (locationList.isEmpty() || locationList.size() < 2) {

LocationEntity temp = new LocationEntity();

temp.location = location;

temp.time = System.currentTimeMillis();

locData.putInt("iscalculate", 0);

locationList.add(temp);

} else {

if (locationList.size() > 5)

locationList.removeFirst();

double score = 0;

for (int i = 0; i < locationList.size(); ++i) {

LatLng lastPoint = new LatLng(locationList.get(i).location.getLatitude(),

locationList.get(i).location.getLongitude());

LatLng curPoint = new LatLng(location.getLatitude(), location.getLongitude());

double distance = DistanceUtil.getDistance(lastPoint, curPoint);

curSpeed = distance / (System.currentTimeMillis() - locationList.get(i).time) / 1000;

score += curSpeed * EARTH_WEIGHT[i];

}

if (score > 0.00000999 && score < 0.00005) { // 经验值,开发者可根据业务自行调整,也可以不使用这种算法

location.setLongitude(

(locationList.get(locationList.size() - 1).location.getLongitude() + location.getLongitude())

/ 2);

location.setLatitude(

(locationList.get(locationList.size() - 1).location.getLatitude() + location.getLatitude())

/ 2);

locData.putInt("iscalculate", 1);

} else {

locData.putInt("iscalculate", 0);

}

LocationEntity newLocation = new LocationEntity();

newLocation.location = location;

newLocation.time = System.currentTimeMillis();

locationList.add(newLocation);

}

return locData;

}

LatLng point;

/***

* 接收定位结果消息,并显示在地图上

*/

private Handler locHander = new Handler() {

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

super.handleMessage(msg);

try {

BDLocation location = msg.getData().getParcelable("loc");

int iscal = msg.getData().getInt("iscalculate");

if (location != null) {

point = new LatLng(location.getLatitude(), location.getLongitude());

// 构建Marker图标

BitmapDescriptor bitmap = null;

if (iscal == 0) {

bitmap = BitmapDescriptorFactory.fromResource(R.drawable.huaji); // 非推算结果

} else {

bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_openmap_focuse_mark); // 推算结果

}

// 构建MarkerOption,用于在地图上添加Marker

OverlayOptions option = new MarkerOptions().position(point).icon(bitmap);

// 在地图上添加Marker,并显示

mBaiduMap.addOverlay(option);

mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point));

}

} catch (Exception e) {

// TODO: handle exception

}

}

};

这里我们拿到定位返回的LatLng,然后我们检索定位周边的POI

修改原先的search方法

private void search(String searchPoi) {

mPoiSearch = PoiSearch.newInstance();

/*mPoiSearch.searchInCity((new PoiCitySearchOption())

.city("深圳")

.keyword(searchPoi)

.pageNum(1)

.pageCapacity(5));*/

mPoiSearch.searchNearby(new PoiNearbySearchOption()

.keyword(searchPoi)

.location(point)

.radius(2000)

.pageNum(0)

.pageCapacity(5)

.sortType(PoiSortType.distance_from_near_to_far));

mPoiSearch.setOnGetPoiSearchResultListener(poiListener);

}

这样,就只能直接检索你所在位置的POI了

android地图搜索功能,[Android]百度地图POI检索相关推荐

  1. Android中应用百度地图API开发地图APP实例-显示百度地图

    场景 效果 在使用百度地图API之前需要先在百度地图开放平台中申请API_KEY http://lbsyun.baidu.com/index.php 申请API_KEY 登录百度开放平台后找到控制台下 ...

  2. android百度地图定位自定义图标,百度地图SDK集成及根据坐标实现定位(android studio开发)...

    百度地图SDK集成及根据坐标实现定位(android studio开发) 百度地图SDK集成及根据坐标实现定位(android studio开发) 1.下载百度地图SDK 链接:http://lbsy ...

  3. Android开发初体验之百度地图开发(3)

    在前面文章我分享了如何开始初步的使用百度地图API以及地图搜索功能,这次我将分享如何在百度地图上设置marker,以及info窗口,这次也主要是参考了鸿洋老师的博客,大家想继续学习的话也可以关注一下鸿 ...

  4. android 高德地图移动卡顿_高德地图4.8和百度地图3.1的抉择,如何发送地址到车机(下载失效本帖奉上百度云盘)...

    9月已经过去半个月了,升级一直围绕着领克车友,8月的兴奋,总想知道车机有什么改变,很多车友提前去预约,总想尝第一口鲜,这个第一口可不好喝,头啖汤随好,但会烫口,于是我带着观望的态度,因为我始终觉得,安 ...

  5. android java 经纬度(国标WGS84/gps84/硬件/谷歌地球卫星,Gcj02/腾讯地图/高德地图,Bd09/百度地图)之间互换

    android java 经纬度(国标WGS84/gps84/硬件/谷歌地球卫星,Gcj02/腾讯地图/高德地图,Bd09/百度地图)之间互换 前言: 由于项目需要,很多时候都需要地图经纬度直接的转换 ...

  6. Android百度地图雷达效果,地图导航实测:百度地图路线雷达圈粉“老司机”

    原标题:地图导航实测:百度地图路线雷达圈粉"老司机" 前段时间,百度和高德就谁是第一的问题引发了一场争论,而作为驾龄近10年的老司机,我并不关心两家输赢,只想说说哪个导航更好用.更 ...

  7. 百度地图API制作类似 百度地图的路线导航界面并实现简单的路线规划功能

    之前我们讲了怎么在百度地图上设置Marker(如A点..) 和弹出框(跟随Marker的,Marker移动的时候也是会跟着移动的),接着又觉得百度地图自带的放大缩小不(fei)是(chang)很(de ...

  8. SAP系统和微信集成的系列教程之八:100行代码在微信公众号里集成地图搜索功能

    本系列的英文版Jerry写作于2017年,这个教程总共包含十篇文章,发表在SAP社区上. 系列目录 (1) 微信开发环境的搭建 (2) 如何通过微信公众号消费API (3) 微信用户关注公众号之后,自 ...

  9. android代码查找快捷键是什么,Android Studio搜索功能(查找功能)及快捷键图文详解(示例代码)...

    1.在当前窗口查找文本[Ctrl+F] F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[fi ...

  10. 百度地图集成(一):百度地图简单实现

    百度地图集成概要 百度地图集成(一):百度地图简单实现 百度地图集成(二):百度定位以及反编译地理位置 百度地图集成(三):检索功能的实现 百度地图集成(四):零散 百度地图集成第一篇: 百度地图简单 ...

最新文章

  1. Pytorch使用GPU
  2. DELL 向左走 向右走?(二)
  3. 流放之路材质过滤怎么设置_三种不同材质的精密过滤设备特点
  4. Struts2框架的学习遇到的问题
  5. case 关键字后面的的值有什么要求吗?
  6. 关于Java API不能远程访问HBase的问题
  7. (JavaWeb)JSP,JSTL
  8. 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排
  9. mac 设计表结构_模具设计丨问题点检表、全套标准件结构分布,值得转发
  10. LeetCode 637 二叉树的层平均值-简单
  11. vscode openOCD 配置Jlink 下载和调试STM32 教程
  12. __clone class php_「PHP 技巧」 不要直接克隆对象,请使用深拷贝
  13. UVA 993 Product of digits
  14. win10 开机启动_win10 -- 取消不需要的开机启动项和服务项加快win10系统开机速度...
  15. 离散数学第六版第er章偶数题答案_离散数学答案第二章习题解答
  16. 计算机应用基础2207,山东省高等教育自学考试2012年4月份考试专业科目一览表
  17. Admob ANE for Flash Air最新中文教程
  18. 获取win10计算机所有权限,如何获得管理员权限 教您win10获取管理员所有权限的方法。...
  19. 友盟推送 php,laravel5.4+umeng(友盟)集成app消息推送功能
  20. 华为哪款手机是鸿蒙系统_华为鸿蒙系统不会用于手机?

热门文章

  1. 小农民在深山树林里发现古墓_“快来!快来!这边有一个洞!”秦岭多古墓,难不成还真碰到了?...
  2. 关于消息队列的一些问题
  3. Ceph添加、删除osd及故障硬盘更换
  4. [零基础学python]为什么要开设本栏目
  5. mysql 表单记录主键重新从1开始排序
  6. HDU 5265 pog loves szh II (二分查找)
  7. python自定义事件event的含义_pyqt自定义事件学习出现问题
  8. face_recognition初始
  9. 汇编语言--x86汇编指令集大全
  10. Grub 开启serial console支持