安卓开发百度地图——城市公交检索功能

公交POI检索

文章只是为了记录自己的学习,方便以后查看
此次只记录城市检索功能的实现,关于百度地图秘钥的申请等操作这里不做说明。
一.城市公交的检索需要在城市检索的基础上实现,首先首先前往百度SDK下载开源代码。

https://mapopen-pub-androidsdk.cdn.bcebos.com/map/BaiduMap_AndroidSDK_v6.0.0_Sample.zip
下载解压后,找到BaiduMap_AndroidSDK_v6.0.0_Sample.zip\BaiduMap_AndroidSDK_v6.0.0_Sample\BaiduMapsApiASDemo\app\src\main\java\com\baidu\mapapi\overlayutil
中的所有java类复制,如果不知道需要哪些类,最好全部复制。如图所示:
图中所有的
将所有类复制到你的项目中与你的MainActivity.java在同一目录下。

二.编写布局界面,使用两个文本框和一个Button按钮,两个文本框用来输入城市名和公交线路,在Button按钮的监听事件中进行检索事件的开启。

以下是我布局界面的主要部分

<LinearLayout
        android:layout_margin="5dp"
        android:id="@+id/top"
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <EditText
            android:id="@+id/a"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:hint="城市名"
            android:layout_marginRight="5dp"
            />
        <EditText
            android:id="@+id/b"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="2"
            android:hint="公交线路"
            />
        <Button
            android:id="@+id/btn"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="查找"/>
    </LinearLayout>

三.在MainAcyivity.java中编写POI城市公交检索的操作。

  • 首先定义变量
 private List<String> buslineIdList;// 存储公交线路的uid
 private int buslineIndex = 0;// 标记路线
 buslineIdList = new ArrayList<String>();
  • 在Button的监听事件中:

1.创建POI检索实例
2.设置POI检索监听者
3.发起检索请求

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPoiSearch = PoiSearch.newInstance();//城市检索实例
                mPoiSearch.setOnGetPoiSearchResultListener(listener);//城市POI检索监听者
                busLineSearch = BusLineSearch.newInstance();//公交检索实例
                busLineSearch.setOnGetBusLineSearchResultListener(busLineSearchResultListener);//公交POI检索监听者
                 PoiCitySearchOption citySearchOption =
                        new PoiCitySearchOption();
                citySearchOption.city(a.getText().toString());//城市名
                citySearchOption.keyword(b.getText().toString());//公交线路名
                citySearchOption.scope(2);
                 //发起检索请求
                mPoiSearch.searchInCity(citySearchOption);
        });
  • 对POI城市检索结果的显示。
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
        @Override
        public void onGetPoiResult(PoiResult poiResult) {
            //获取POI检索结果
            if (poiResult == null
                    || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
                Toast.makeText(MainActivity.this, "未找到结果",
                        Toast.LENGTH_LONG).show();
                return;
            }
                //遍历所有POI,找到类型为公交线路的POI
                buslineIdList.clear();
                for (PoiInfo poi : poiResult.getAllPoi()) {
                        buslineIdList.add(poi.uid);
                }
                    searchBusline();

            mPoiSearch.destroy();
        }
        @Override
        public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {

        }
        @Override
        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
        }
        @Override
        public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

        }
    };
     private void searchBusline() {
        if (buslineIndex >= buslineIdList.size()) {
            buslineIndex = 0;
        }
        if (buslineIndex >= 0 && buslineIdList.size() > 0) {
            boolean flag = busLineSearch
                    .searchBusLine((new BusLineSearchOption().city(a.getText().toString())
                            .uid(buslineIdList.get(buslineIndex))));
            if (flag) {
                Toast.makeText(MainActivity.this, "检索成功",     Toast.LENGTH_LONG)
                        .show();
            } else {
                Toast.makeText(MainActivity.this, "检索失败", Toast.LENGTH_LONG)
                        .show();
            }
        } else {
            Toast.makeText(MainActivity.this, "错误", Toast.LENGTH_LONG).show();
        }
        buslineIndex++;
    }
  • 对POI公交检索结果的显示。
OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {
        @Override
        public void onGetBusLineResult(BusLineResult busLineResult) {
            if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(MainActivity.this, "抱歉,未找到结果",
                        Toast.LENGTH_SHORT).show();
            } else {
                    baiduMap.clear();
                    BusLineOverlay overlay = new MainActivity.MyBuslineOverlay(baiduMap);// 用于显示一条公交详情结果的Overlay
                    overlay.setData(busLineResult);
                    overlay.addToMap();
                    overlay.zoomToSpan();
                    baiduMap.setOnMarkerClickListener(overlay);
                    // 公交线路名称
                    Toast.makeText(MainActivity.this,
                            busLineResult.getBusLineName(), Toast.LENGTH_SHORT) .show();

            }

            };

    };
   

四.创建MyBuslineOverlay继承自BusLineOverlay

 public class MyBuslineOverlay extends BusLineOverlay {
        public MyBuslineOverlay(BaiduMap baiduMap) {
            super(baiduMap);
        }
        @Override
        public boolean onBusStationClick(int arg0) {
            MarkerOptions options =
                    (MarkerOptions) getOverlayOptions().get(arg0);
            mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition()));
            return true;
        }
    }

五.如果你没有标注站点的图片,在运行时会报错,需要修改BusLineOverlay类中的代码,找到下图所示的代码段

List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
        for (BusLineResult.BusStation station : mBusLineResult.getStations()) {
            overlayOptionses.add(new MarkerOptions()
                    .position(station.getLocation())
                            .zIndex(10)
                                    .anchor(0.5f, 0.5f)
                                            .icon(BitmapDescriptorFactory
                                                 //.fromAssetWithDpi("Icon_bus_station.png")));
                                                  .fromResource(R.drawable.icon_markg)));
        }

  • 将图中的
// .fromAssetWithDpi("Icon_bus_station.png")));
  • 注释掉,添加下面一行的
 .fromResource(R.drawable.icon_markg)));//原位置新添加的
  • 这里的
R.drawable.icon_markg
  • 是你自己项目里边的图片。
  • 自此POI城市检索完成,项目运行后的结果为:

在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值