zoukankan      html  css  js  c++  java
  • 【“零起点”百度地图手机SDK】如何查询公交线路?如北京的104路

    摘要:想要查询北京市的108路公交车经过什么地方?这一章将讲解公交导航和查询的接口。

    ----------------------------------------------------------------------

    系列阅读:
    1、【百度地图-安卓SDK】从头开始写android程序
    http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html  
    2、【“零起点”--百度地图手机SDK】如何创建一张地图
    http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html 
    3、【“零起点”--百度地图手机SDK】如何使用离线地图?
    http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.html

    4、【“零起点”--百度地图手机SDK】如何添加地图图层+按钮事件+水平垂直布局?

    http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html

    5、【“零起点”--百度地图手机SDK】如何进行三种POI搜索?

    http://www.cnblogs.com/milkmap/archive/2012/06/05/2536764.html 
    -----------------------------------------------------------------------

    一、创建一张地图

    参考教程2:【“零起点”--百度地图手机SDK】如何创建一张地图
    http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html 

    步骤温习:

    1、创建YingTransitActivity的安卓工程。

    2、创建libs文件夹,放入jar文件。创建libs\armeabi文件夹,放入so文件。工程属性里增加jar。

    3、修改如下四个文件,

    TransitActivity.java是展示地图的主程序;

    transit.Manfest里增加了使用权限和安卓版本支持;

    main.xml里增加了地图控件;

    strings.xml里可以修改标题和文本控件的文字内容。

    4、真机运行。

    二、查询104关键词

    分为三步:

    第一、需要查询104关键词;

    第二、回调函数里判断POI结果为公交线路的,并返回uid;

    第三、根据uid查询公交线路详情。

    1、查询104关键词

    因为是查询整个城市内的公交线路,所以使用城市内查询接口。

    在activity里先申明变量

    MKSearch myMKSearch = null;    //POI搜索变量申明

    再在oncreate函数里,对其进行初始化

    myMKSearch = new MKSearch();  //初始化

    最后进行POI查询

    myMKSearch.poiSearchInCity("北京", "104"); 

    2、回调函数里得到公交线路的uid

    POI查询的结果有以下几种类型:poi类型,0:普通点,1:公交站,2:公交线路,3:地铁站,4:地铁线路

    在POI检索的回调函数onGetPoiResult里,判断POI查询的结果类型,只返回公交线路的。

    // 找到公交路线poi node
                    MKPoiInfo curPoi = null;
                    int totalPoiNum  = result.getNumPois();
                    for( int idx = 0; idx < totalPoiNum; idx++ ) {
                        curPoi = result.getPoi(idx);
                        if ( 2 == curPoi.ePoiType ) {
                            break;
                        }
                     } 

    然后在检索的回调函数onGetPoiResult里进行公交线路的查询:

    myMKSearch.busLineSearch("北京", curPoi.uid);

    3、使用uid查询公交线路

     最后,只需要在公交线路的回调函数onGetBusDetailResult里,进行输出即可。

    RouteOverlay routeOverlay = new RouteOverlay(YingTransitActivity.this, mMapView);
                    // 此处仅展示一个方案作为示例
                    routeOverlay.setData(result.getBusRoute());
                    mMapView.getOverlays().clear();
                    mMapView.getOverlays().add(routeOverlay);
                    mMapView.invalidate();
                 
                    mMapView.getController().animateTo(result.getBusRoute().getStart());

     三、注意事项

    查询语句,最好写在回调函数的后面。

    以保证程序不会异常,而造成关闭。

    myMKSearch.init(mBMapMan, new MKSearchListener(){});  //回调函数
    myMKSearch.poiSearchInCity("北京", "104");    //POI查询

    四、全部源代码:

    package com.baidu.yingTransit;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    /** 引入import **/
    import java.util.ArrayList;
    import java.util.List;
     
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Point;
    import android.graphics.drawable.Drawable;
    import android.location.Location;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Toast;
     
    import com.baidu.mapapi.BMapManager;
    import com.baidu.mapapi.GeoPoint;
    import com.baidu.mapapi.ItemizedOverlay;
    import com.baidu.mapapi.LocationListener;
    import com.baidu.mapapi.MKAddrInfo;
    import com.baidu.mapapi.MKBusLineResult;
    import com.baidu.mapapi.MKDrivingRouteResult;
    import com.baidu.mapapi.MKGeneralListener;
    import com.baidu.mapapi.MKLocationManager;
    import com.baidu.mapapi.MKPlanNode;
    import com.baidu.mapapi.MKPoiInfo;
    import com.baidu.mapapi.MKPoiResult;
    import com.baidu.mapapi.MKSearch;
    import com.baidu.mapapi.MKSearchListener;
    import com.baidu.mapapi.MKSuggestionResult;
    import com.baidu.mapapi.MKTransitRouteResult;
    import com.baidu.mapapi.MKWalkingRouteResult;
    import com.baidu.mapapi.MapActivity;
    import com.baidu.mapapi.MapController;
    import com.baidu.mapapi.MapView;
    import com.baidu.mapapi.MyLocationOverlay;
    import com.baidu.mapapi.Overlay;
    import com.baidu.mapapi.OverlayItem;
    import com.baidu.mapapi.PoiOverlay;
    import com.baidu.mapapi.RouteOverlay;
    import com.baidu.mapapi.TransitOverlay;
    
    
    public class YingTransitActivity extends MapActivity {
        
        /** 申明变量 **/
        BMapManager mBMapMan = null;
        MapView mMapView = null; 
        MKSearch myMKSearch = null;    //POI搜索变量申明
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            /** 创建地图 **/
            mBMapMan = new BMapManager(getApplication());
            mBMapMan.init("1713A92A7A0C854D1B8717670EF8B6CA75696567", null);
            super.initMapActivity(mBMapMan);
             
            mMapView = (MapView) findViewById(R.id.bmapsView);//地图控件,不添加的话,就不用写。
            mMapView.setBuiltInZoomControls(true);  //设置启用内置的缩放控件
            MapController mMapController = mMapView.getController();  // 得到mMapView的控制权,可以用它控制和驱动平移和缩放
            GeoPoint point = new GeoPoint((int) (39.915 * 1E6),
                    (int) (116.404 * 1E6));  //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
            mMapController.setCenter(point);  //设置地图中心点
            mMapController.setZoom(12);    //设置地图zoom级别
            
            myMKSearch = new MKSearch();  //初始化
            
              /** 判断是否有结果 **/
    //        if(myMKSearch == null)
    //        {
    //            Toast.makeText(this, "error", Toast.LENGTH_LONG).show();
    //            return;
    //        }
    //        Toast.makeText(this, "ok", Toast.LENGTH_LONG).show();
    
            myMKSearch.init(mBMapMan, new MKSearchListener(){
                @Override
                public void onGetPoiResult(MKPoiResult result, int type, int error) {
                    // 错误号可参考MKEvent中的定义
                    if (error != 0 || result == null) {
                        Toast.makeText(YingTransitActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
                        return;
                    }
                 
                    // 找到公交路线poi node
                    MKPoiInfo curPoi = null;
                    int totalPoiNum  = result.getNumPois();
                    for( int idx = 0; idx < totalPoiNum; idx++ ) {
                        curPoi = result.getPoi(idx);
                        if ( 2 == curPoi.ePoiType ) {
                            break;
                        }
                     }             
                    myMKSearch.busLineSearch("北京", curPoi.uid);
                }
    
                public void onGetDrivingRouteResult(MKDrivingRouteResult res,
                        int error) {
                }
                public void onGetTransitRouteResult(MKTransitRouteResult res,
                        int error) {
                }
                public void onGetWalkingRouteResult(MKWalkingRouteResult res,
                        int error) {
                }
                public void onGetAddrResult(MKAddrInfo res, int error) {
                }
                public void onGetBusDetailResult(MKBusLineResult result, int error) {                
                    if (error != 0 || result == null) {
                        Toast.makeText(YingTransitActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
                        return;
                    }
                 
                    RouteOverlay routeOverlay = new RouteOverlay(YingTransitActivity.this, mMapView);
                    // 此处仅展示一个方案作为示例
                    routeOverlay.setData(result.getBusRoute());
                    mMapView.getOverlays().clear();
                    mMapView.getOverlays().add(routeOverlay);
                    mMapView.invalidate();
                 
                    mMapView.getController().animateTo(result.getBusRoute().getStart());
                }
    
                @Override
                public void onGetSuggestionResult(MKSuggestionResult result, int error) {
                    // TODO Auto-generated method stub                
                }
                
            });
            
            myMKSearch.poiSearchInCity("北京", "104");  //搜索104关键词。放在回调函数之后,以保证正确返回。
        }
        
        protected boolean isRouteDisplayed() {
            return false;
        }
        
        /** 引入方法管理API **/
        @Override
        protected void onDestroy() {
            if (mBMapMan != null) {
                mBMapMan.destroy();
                mBMapMan = null;
            }
            super.onDestroy();
        }
        @Override
        protected void onPause() {
            if (mBMapMan != null) {
                mBMapMan.stop();
            }
            super.onPause();
        }
        @Override
        protected void onResume() {
            if (mBMapMan != null) {
                mBMapMan.start();
            }
            super.onResume();
        }
        
    }
  • 相关阅读:
    Angel investor
    [HNOI 2003]消防局的设立
    [USACO 08JAN]Telephone Lines
    [Luogu 2265]路边的水沟
    [NOI 2010]航空管制
    [HNOI 2004]敲砖块
    [Luogu 1730]最小密度路径
    [USACO 13NOV]No Change
    [POJ 1006]生理周期
    [AHOI 2012]树屋阶梯
  • 原文地址:https://www.cnblogs.com/milkmap/p/2554843.html
Copyright © 2011-2022 走看看