网站首页  词典首页

请输入您要查询的论文:

 

标题 基于百度地图的周边检索方案研究
范文

    董明华

    摘要:POI是地图应用中经常使用的功能,而周边检索是POI最常见的检索方式。该文提出了一种针对移动位置进行周边检索的方案,解决了周边检索结果误差过大及检索结果为空导致应用崩溃的问题。

    关键词:POI;周边检索;百度地图

    中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2018)27-0185-03

    Research on Nearby POI Plan Based on Baidu Map

    DONG Ming-hua

    (Suzhou Industrial Park Service Outsourcing Vocational College, Suzhou 215000, China)

    Abstract: POI is often used in map application, while nearby poi is the most important poi. In this paper, we propose a plan for nearby poi Based on mobile location. Also, it solves the problem that the poi result error is too large, and the problem that application crashes caused by empty poi result.

    Key words: POI; nearby POI; Baidu map

    1 背景

    POI, Point of Interest,译为兴趣点,即地图搜索的关键词。百度地图提供三种类型的POI检索:城市内检索、周边检索和区域检索(即矩形范围检索)。城市检索即搜索整个城市的兴趣点,范围较大;周边检索通过定位搜索指定半径内的兴趣点;区域检索通过矩形对角线左下角和右上角两个顶点经纬度,绘制出搜索区域。

    周边检索是用户比较熟悉的应用,如外卖等APP通过距离远近排序检索结果,周边检索的使用主要有两个步骤:

    1) 通过定位SDK获取终端位置。

    2) 通过地图SDK设置检索半径等配置选项,开启检索功能。

    按照百度地图Android平台开发步骤说明,实现周边检索功能时发现下述几个问题,后文给出了问题对应的解决方案。

    1) 百度地图的周边检索功能位于地图SDK模块,示例Demo基于一个固定的位置进行检索,缺少对移动位置检索的说明,而后者反而是最常见的情景。

    2) 检索结果为空导致应用崩溃的问题。

    3) 定位参数配置不当导致检索误差偏大的问题。

    2 开发流程

    周边检索的开发指南位于地图SDK,主要分为获取秘钥、AndroidStudio配置和POI检索三个部分。由于官方文档没有给出移动位置的周边检索解决方案,需要在开发过程中添加上定位SDK。

    2.1 获取秘钥

    获取秘钥必须有百度开发者账号,申请秘钥网址为http://lbsyun.baidu.com/apiconsole/key。登錄后,点击“创建应用”按钮,在弹出的创建应用界面依次确定应用名称、应用类型,输入SHA1和包名。

    应用名称没有明确要求,应用类型选“Android SDK”,启用服务根据项目需求决定,例如周边检索需要启用“云检索、Android定位SDK、云地理编码”等服务。

    获取SHA1的值流程如下,首先打开命令行控制台窗口,通过cd.android命令进入.android文件夹;然后通过keytool -list -v -keystore debug.keystore命令获取调试版SHA1值,调试版默认秘钥库密码是android,输入密码时控制台窗口没有明文显示,输入完毕回车即可;最后,在返回结果中找到SHA1值。

    采用上述步骤获取SHA1值时经常报以下错误:“'keytool' 不是内部或外部命令,也不是可运行的程序”。这是由于keytool位于JDK的bin目录下,AndroidStudio采用内置的JDK,而环境变量path值没有包含bin路径。这里介绍一种解决方案,首先,通过AndroidStudio菜单栏上的File命令找到Other Settings子菜单,展开Other Settings选项下的Default Project Structure...,在弹出的窗口中可以看到内置JDK location,如下图所示;然后,根据JDK路径在环境变量path值中添加对应的值,如“C:\AndroidStudio\studio\jre\bin”。

    如果AndroidStudio版本较新,也可以通过右侧Gradle面板,找到当前Module名称,通过该Module下的TasksàandroidàsigningReport选项查看SHA1值。

    2.2 AndroidStudio配置

    项目配置主要分为依赖包配置和AndroidManifest文件配置两部分。

    依赖包配置需要根据项目需求下载对应的地图SDK,周边检索需要下载的SDK包括基础定位、基础地图、检索功能和LBS云检索四个部分。解压下载后的SDK压缩包,把libs文件夹下的jar包复制到当前Module下的libs文件夹中,其他so文件统一复制到srcàmainàjniLibs文件夹下,jniLibs文件夹需要用户自建,需要注意的是及时Refresh Gradle project,否则后续会找不到依赖包中相关类。

    2.3 AndroidManifest配置

    AndroidManifest配置主要包括秘钥配置,权限配置和定位服务配置,权限配置包括基础地图模块的权限和定位模块的权限两部分,部分代码如下所述,其中的service主要用于后台定位服务。

    

    

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

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

    

    

    

    2.4 功能实现

    周边检索的功能实现主要包括定位和检索两部分,调用百度地图API前需要在应用程序创建时初始化 SDK引用的Context 全局变量,建议在Application或者Activity的onCreate方法中初始化,如果在Activity的onCreate方法中初始化,需要注意该方法要在setContentView方法之前实现 。

    SDKInitializer.initialize(getApplicationContext());

    2.4.1 周边检索

    通过PoiSearch的监听器收集检索结果, 在onGetPoiResult回调函数中对检索结果进行遍历。

    mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener(){

    public void onGetPoiResult(PoiResult result){

    //遍历POI检索结果

    List list = poiResult.getAllPoi();

    }

    ……});

    需要注意的是,检索结果在以下情况可能为空:没有定位成功、分页显示检索结果超出页码范围、在指定范围内查找不到检索结果等。若不对这一情况加以处理,会导致应用崩溃,因而在遍历检索结果之前需要先判断结果是否为空,若为空增加提示提升用户体验度。

    if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {Toast.makeText(MainActivity.this, "未找到结果", Toast.LENGTH_LONG).show();

    return;}

    通过设置附近检索参数触发上述PoiSearch监听器,下述代码表示以“center”经纬度为圆心,1000米为半径进行检索,显示第一页检索结果。检索结果较多时,需要分页显示结果,如pageNum为0表示显示第一页结果,为1表示第二页结果,以此类推,默认每页显示10条检索结果。由于定位完成需要时间,所以不可以在启动定位时就立刻启用周边检索功能,否则会导致缺少检索参数的异常,地图应用中经常在输入关键词后点击搜索按钮,其实就是给定位成功预留时间。

    mPoiSearch.searchNearby(new PoiNearbySearchOption()

    .keyword("检索关键词")

    .location(center)

    .radius(1000)

    .pageNum(0));

    2.4.2 移动定位

    上述检索中的center值未知,它是经纬度类LatLng的实例。由于移动端的位置经常变化,因而center的值也经常改变,需要及時通过定位更新center值。虽然周边检索功能位于基础地图SDK中,但是开发一款完善的周边检索应用需要用到定位SDK。

    百度地图定位以广播的形式通知定位结果,收到广播后根据定位参数BDLocation取得经纬度,再由LatLng的构造方法初始化上述center值。

    class MyLocationListener extends BDAbstractLocationListener {

    @Override

    public void onReceiveLocation(BDLocation location) {

    double latitude = location.getLatitude();

    double longitude = location.getLongitude();

    center = new LatLng(latitude,longitude);}}

    Android广播需要注册,在百度地图中通过LocationClient注册定位广播。同时,LocationClient可以通过LocationClientOption设置定位配置参数,包括定位精度、定位间隔时间、返回经纬度坐标类型等,代码如下所述。默认配置经纬度类型是gcj02,经验证,使用此经纬度类型定位会导致周边检索误差过大,检索不到1000米内的结果,而bd0911经纬度类型检索结果非常精确。通过设置定位间隔时间,更新定位经纬度值,以便让检索结果跟随定位位置及时刷新。定位间隔需要根据项目需求调整,间隔时间太长,则定位更新不及时,检索结果不准确;间隔时间太短,则定位频率过高,占用CPU消耗电量。

    LocationClientOption option = new LocationClientOption();

    //设置返回经纬度坐标类型,默认gcj02

    option.setCoorType("bd09ll");

    //可选,设置发起定位请求的间隔,int类型,单位ms

    option.setScanSpan(10000);

    mLocationClient.setLocOption(option);

    3 结束语

    该文通过增加定位模块实现了移动位置周边检索功能,对于官方文档缺少移动位置检索说明,该文提出的解决方案经验证有效可行。同时给出了检索结果不准确的原因分析和解决方案,以及检索结果为空导致应用崩溃的原因分析及解决方案。

    参考文献:

    [1] 张波,赵双明.基于Android平台的百度地图开发研究[J].软件导刊, 2015(7):96-99.

    [2] 蒋云良,董墨萱,范婧,等.基于POI数据的城市功能区识别方法研究[J].浙江师范大学学报: 自然科学版,2017(4):398-405.

    [通联编辑:谢媛媛]

    

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/4/15 6:20:42