百度地图路线检索(3)

路线的检索:

三种方式:驾车、公交、步行

结合覆盖物展示搜索:驾车路线覆盖物:RouteOverlay

***使用百度地图必须进行的准备工作:

1、初始化:

1)、到百度的服务器端检验KEY

创建initManager()方法进行检验的操作:

①、创建百度地图的管理器对象:

②、对管理器对象进行初始化,调用init方法

init(String strKey, MKGeneralListener listener)

参数:

strKey:申请的授权验证码

listener:注册回调事件——需要在监听中校验key(300)和网络状态(2)

关于状态码信息我们可以在MKEvent查询

创建监听,实现其中的方法:

@onGetNetworkState:网络的判断——判断iError是否为2,是则无网络(此处可以提示用户)

@onGetPermissionState:授权验证的状态——判断iError是否为300,是则验证失败(此处可以提示用户)

2)加载布局文件:用于显示地图【mapView】

【调用父类的onCreate方法,进行初始化】

创建布局,调用setContentView方法进行解析加载:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity" >

<com.baidu.mapapi.map.MapView

android:id="@+id/mapview"

android:layout_width="match_parent"

android:layout_height="match_parent"

/>

</RelativeLayout>

3)初始化控件

①、初始化地图控件mapView:

mapView = (MapView) findViewById(R.id.mapview);

②、添加缩放按钮:

mapView.setBuiltInZoomControls(true);// 显示放大和缩小的控件

③、注册监听:

mapView.regMapViewListener(manager, new MKMapViewListener()

在onClickMapPoi(MapPoi poi)方法中可以设置点击某个兴趣点时显示的名称

4)实现生命周期的方法:

实现Activity中的onResume()、onPause()、onDestroy()三个方法,并在其中调用

@Override

protected void onResume() {

mapView.onResume();

super.onResume();

}

@Override

protected void onPause() {

mapView.onPause();

super.onPause();

}

@Override

protected void onDestroy() {

mapView.destroy();

super.onDestroy();

}

一、路线的检索实现:

驾车路线的检索:DrivingSearchDemo

步行路线的检索:WalkSearchDemo

公交路线的检索:TransitOverlayDemo

1、初始化

①、初始化的一些方法在BaseActivity中

初始化的相关内容都在上面完成了

②、创建各种路线检索的初始化方法:

driving();walking();transit():

listener = new MyListener();

search.init(manager, listener);

调用相应的检索方法:

驾车路线检索调用drivingSearch方法:drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end)

步行路线检索调用walkingSearch方法:walkingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end)

公交路线检索调用transitSearch方法:transitSearch(String city, MKPlanNode start, MKPlanNode end)

参数:

startCity:起始城市

start:起始点位

endCity:终止城市

end:终止点位

city:指定的城市

String startCity = "北京";

MKPlanNode start = new MKPlanNode();

startNaN = hmPos;

String endCity = "北京";

MKPlanNode end = new MKPlanNode();

end.name = "金燕龙办公楼";

//驾车路线检索:

search.drivingSearch(startCity, start, endCity, end);

//步行路线检索:

search.walkingSearch(startCity, start, endCity, end);

//公交路线检索:

search.transitSearch("北京", start, end);

Tips:

对于驾车路线检索:

还可以进行“搜索策略”:如距离最短,最省钱,换乘最少等等,还可以进行指定途经指定位置等搜索策略

如:

①、距离最短的搜索策略:

需要在调用搜索方法之前设置:search.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);//距离最短

②、途经指定位置:如天安门

需要设置城市和名称,并将item加入到MKWpNode集合中:

ArrayList<MKWpNode> wpNodes=new ArrayList<MKWpNode>();

MKWpNode item=new MKWpNode();

item.city="北京";

item.name="天安门";

wpNodes.add(item);

//调用重构方法

search.drivingSearch(startCity, start, endCity, end, wpNodes);

2、创建自定义监听器

驾车路线需要实现onGetDrivingRouteResult(MKTransitRouteResult result, int iError)方法

步行路线需要实现onGetWalkingRouteResult(MKTransitRouteResult result, int iError)方法

公交路线需要实现onGetTransitRouteResult(MKTransitRouteResult result, int iError)方法

①、驾车和步行路线检索实现的方法:

显示位置展示在地图上:

创建RouteOverkay对象:RouteOverlay overlay = new RouteOverlay(DrivingSearchDemo.this, mapView);

设置数据:

*获取路线方案的数目:result.getNumPlan()

*当获得到数目(大于0,有数据)后,进行后续操作

获得策略:result.getPlan(),返回MKRoutePlan

获得驾车的策略:plan.getRoute(0)

*设置数据,将策略设置到数据中:overlay.setData(mkRoute);

将覆盖物RouteOverkay加入到mapView中

刷新显示

if (result.getNumPlan() > 0) {

MKRoutePlan plan = result.getPlan(0);

MKRoute mkRoute = plan.getRoute(0);

overlay.setData(mkRoute);

mapView.getOverlays().add(overlay);

mapView.refresh();

}

②、公交路线检索实现的方法:

@创建TransitOverlay:TransitOverlay overlay = new TransitOverlay(TransitOverlayDemo.this, mapView);

@获取方案的数目:result.getNumPlan()

如果有多个方案,可以进行遍历,将每个方案都设置到覆盖物的数据中

注意:每次需要创建一个公交覆盖物,即每种方案对应一个公交覆盖物

@获取搜索方案:result.getPlan(index)

@果有数据:

*设置方案:

*设置数据:overlay.setData(plan)

*将覆盖物加入到mapView中:mapView.getOverlays().add(overlay);

*刷新地图,进行显示:mapView.refresh();[刷新一次即可]

四、我的位置信息:MyLocationOverlay

定位的jar包:locSDK_3.1.jar

MyLocationOverlay:一个负责显示用户当前位置的Overlay

& MyLocationOverlay:只负责显示我的位置

& LocationData:存放获取的位置数据,并设置MyLocationOverlay的数据源

需要用到两个核心类:

LocationClient:网络查询

LocationListener:处理查询的结果

实现流程:

1、定义变量,创建对象:

public LocationClient mLocationClient = null;

public BDLocationListener myListener = new MyLocationListener();

2、初始化,设置监听的参数信息

在onCreate方法中【创建location方法】进行初始化

①、创建网络查询的对象:LocationClient

mLocationClient=new LocationClient(getApplicationContext());

②、进行参数的配置:定义参数,并进行设置:

设置定位参数(LocationClientOption):定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等

//参数配置

LocationClientOption option = new LocationClientOption();

option.setOpenGps(true);

option.setAddrType("all");//返回的定位结果包含地址信息

option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02

option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms

option.disableCache(true);//禁止启用缓存定位

option.setPoiNumber(5);//最多返回POI个数

option.setPoiDistance(1000); //poi查询距离

option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息

③、将设置好的参数对象设置到LocationClient之中

④、注册监听:

mLocationClient.registerLocationListener(myListener);

3、控制定位信息获取:

通过复写Activity生命周期的方法,并在其中调用LocationClient的start和stop方法

@Override

protected void onResume() {

mLocationClient.start();

super.onResume();

}

@Override

protected void onPause() {

mLocationClient.stop();

super.onPause();

}

3、创建自定义的监听器:

实现DBLocationListener的监听接口

实现相关方法onReceiveLocation:

需要先进行判断位置对象是否为空,不为空在进行如下操作:

①、创建“我的位置信息”对象和位置数据对象

②、设置数据:指定经纬度信息:latitude和longitude;并将数据设置到覆盖物中

③、将overlay加入到mapView中

④、刷新进行显示

测试:

可以将给定的位置点以动画形式移动至地图中心,通过控制器MapController的animateTo(GeoPoint point)方法实现

对以给定的点GeoPoint,开始动画显示地图

准备工作:

public class BaseActivity extends Activity {

protected MapView mapView;

protected BMapManager manager;

protected MapController controller;

protected int latitude = (int) (40.051 * 1E6);// 纬度

protected int longitude = (int) (116.303 * 1E6);// 经度

protected GeoPoint hmPos=new GeoPoint(latitude, longitude);//黑马坐标

protected MKSearch search;

protected MKSearchListener listener;

protected void onCreate(android.os.Bundle savedInstanceState) {

// 到百度的服务器端检验KEY

initManager();

super.onCreate(savedInstanceState);

setContentView(R.layout.common);

init();

initController();// 管理地图

search();

}

private void search() {

search=new MKSearch();

}

private void initController() {

controller = mapView.getController();

controller.setZoom(12);// 3-19

controller.enableClick(true);// 控制poi是否可以被点击

controller.setCenter(hmPos);//设置地图的中心

}

private void initManager() {

manager = new BMapManager(getApplicationContext());

manager.init(ConstantValue.KEY, new MKGeneralListener() {

@Override

public void onGetPermissionState(int iError) {

// TODO 授权验证的状态

if (iError == MKEvent.ERROR_PERMISSION_DENIED) {

Toast.makeText(getApplicationContext(), "验证失败", 1).show();

}

}

@Override

public void onGetNetworkState(int iError) {

// TODO 网络判断

if (iError == MKEvent.ERROR_NETWORK_CONNECT) {

Toast.makeText(getApplicationContext(), "无网络", 1).show();

}

}

});

}

private void init() {

mapView = (MapView) findViewById(R.id.mapview);

// 添加放大和缩小的按钮

mapView.setBuiltInZoomControls(true);// 显示放大和缩小的控件

// 注册监听

mapView.regMapViewListener(manager, new MKMapViewListener() {

@Override

public void onMapMoveFinish() {}

@Override

public void onMapAnimationFinish() {}

@Override

public void onGetCurrentMap(Bitmap arg0) {}

@Override

public void onClickMapPoi(MapPoi poi) {

if (poi != null) {

Toast.makeText(getApplicationContext(), poi.strText, 0).show();

}

}

});

}

@Override

protected void onResume() {

mapView.onResume();

super.onResume();

}

@Override

protected void onPause() {

mapView.onPause();

super.onPause();

}

@Override

protected void onDestroy() {

mapView.destroy();

super.onDestroy();

}

//设置适配器

protected abstract class BaseSearchListener implements MKSearchListener{

@Override

public void onGetAddrResult(MKAddrInfo arg0, int arg1) {}

@Override

public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {}

@Override

public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {}

@Override

public void onGetPoiDetailSearchResult(int arg0, int arg1) {}

@Override

public void onGetPoiResult(MKPoiResult result, int type, int iError) {}

@Override

public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {}

@Override

public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {}

@Override

public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {}

}

}

/**

* 路线检索——驾车路线

* @author Administrator

*/

public class DrivingSearchDemo extends BaseActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

driving();

}

private void driving() {

listener = new MyListener();

search.init(manager, listener);

String startCity = "北京";

MKPlanNode start = new MKPlanNode();

startNaN = hmPos;

String endCity = "北京";

MKPlanNode end = new MKPlanNode();

end.name = "金燕龙办公楼";

//搜索策略

//search.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);//距离最短

//search.drivingSearch(startCity, start, endCity, end);

ArrayList<MKWpNode> wpNodes=new ArrayList<MKWpNode>();

MKWpNode item=new MKWpNode();

item.city="北京";

item.name="天安门";

wpNodes.add(item);

search.drivingSearch(startCity, start, endCity, end, wpNodes);

}

private class MyListener extends BaseSearchListener {

@Override

public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {

if (result != null && iError == 0) {

RouteOverlay overlay = new RouteOverlay(DrivingSearchDemo.this, mapView);

// int getNumPlan()

// 获取方案数目

Toast.makeText(getApplicationContext(), "查询结果:"+result.getNumPlan()+"条方案", 0).show();

if (result.getNumPlan() > 0) {

MKRoutePlan plan = result.getPlan(0);

MKRoute mkRoute = plan.getRoute(0);

overlay.setData(mkRoute);

mapView.getOverlays().add(overlay);

mapView.refresh();

}

}

}

}

}

/**

* 公交换乘查询

*

* @author Administrator

*

*/

public class TransitOverlayDemo extends BaseActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

transit();

}

private void transit() {

listener = new MyListener();

search.init(manager, listener);

MKPlanNode start = new MKPlanNode();

startNaN = hmPos;

MKPlanNode end = new MKPlanNode();

end.name = "金燕龙办公楼";

search.transitSearch("北京", start, end);

}

private class MyListener extends BaseSearchListener {

@Override

public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {

if (result != null && iError == 0) {

// int getNumPlan()

// 获取方案数目

Toast.makeText(getApplicationContext(), "查询结果:" + result.getNumPlan() + "条方案", 0).show();

if (result.getNumPlan() > 0) {

for (int index = 0; index < result.getNumPlan(); index++) {

TransitOverlay overlay = new TransitOverlay(TransitOverlayDemo.this, mapView);

MKTransitRoutePlan plan = result.getPlan(index);

overlay.setData(plan);

mapView.getOverlays().add(overlay);

}

mapView.refresh();

}

}

}

}

}

/**

* 定位

* @author Administrator

*

*/

public class MyLocationOverlayDemo extends BaseActivity {

public LocationClient mLocationClient = null;

public BDLocationListener myListener = new MyLocationListener();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

location();

}

private void location() {

mLocationClient=new LocationClient(getApplicationContext());

//参数配置

LocationClientOption option = new LocationClientOption();

option.setOpenGps(true);

option.setAddrType("all");//返回的定位结果包含地址信息

option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02

option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms

option.disableCache(true);//禁止启用缓存定位

option.setPoiNumber(5);//最多返回POI个数

option.setPoiDistance(1000); //poi查询距离

option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息

mLocationClient.setLocOption(option);

mLocationClient.registerLocationListener(myListener);

}

@Override

protected void onResume() {

mLocationClient.start();

super.onResume();

}

@Override

protected void onPause() {

mLocationClient.stop();

super.onPause();

}

private class MyLocationListener implements BDLocationListener{

@Override

public void onReceiveLocation(BDLocation location) {

if(location==null)

return;

MyLocationOverlay overlay=new MyLocationOverlay(mapView);

LocationData data=new LocationData();

data.latitude=location.getLatitude();

data.longitude=location.getLongitude();

overlay.setData(data);

mapView.getOverlays().add(overlay);

mapView.refresh();

int latitude=(int) (data.latitude*1E6);

controller.animateTo(new GeoPoint(latitude, (int)(data.longitude*1E6)));

}

@Override

public void onReceivePoi(BDLocation arg0) {

// TODO Auto-generated method stub

}

}

}

时间: 2024-10-04 01:37:17

百度地图路线检索(3)的相关文章

iOS真机测试友盟碰到错误linker command failed with exit code 1 (use -v to see invocation) 百度地图的检索失败 sqlite 错误码

因为友盟不支持bitcode 在模拟器上运行正常,但是在模拟器上就会报错,这是因为xocde7之后增加了一个bitcode,bitcode是被编译程序的一种中间形式的代 码.包含bitcode配置的程序将会在App store上被编译和链接.bitcode允许苹果在后期重新优化程序的二进制文件,而不需要重新提交一个新的版本到App store上. 碰到以上问题,我们有两种解决方式,要么关闭bitcode要么让第三方支持bitcode,我们这里讲第一种,配置bitcode,我们可以 在”Build

iOS百度地图poi检索(基于百度地图2.3.0SDK开发)

正好做到百度地图的poi检索,拿来分享一下,基于百度地图2.3.0SDK开发,说实话,这个新版本poi真不好用 先来看头文件里面,定义poi对象,当然你也可以写到实现文件里面 #import <UIKit/UIKit.h> #import "BMapKit.h" @interface NearByPlaceViewController : ViewControllerBase <BMKPoiSearchDelegate> {     BMKPoiSearch *

iOS地图集成示例:百度地图POI检索

一.集成百度地图(傻瓜教程,以网站说明文档为准,此处罗列几项主要步骤) 1.登录  http://lbsyun.baidu.com  百度地图开发者平台,获取SDK和集成文档. 2.百度地图可以提供的一些服务 (1)地图:提供地图展示和地图操作功能: (2)POI检索:支持周边检索.区域检索和城市内兴趣点检索: (3)地理编码:提供经纬度和地址信息相互转化的功能接口: (4)线路规划:支持公交.驾车.步行.骑行,四种方式的线路规划: (5)覆盖物图层:支持在地图上添加覆盖物(标注.几何图形.热力

【Android】代理模式封装百度地图路线规划模块

百度地图的Demo里有个路线规划的功能,但是,这个功能和Activity耦合性太高,所以需要单独抽离出路径规划功能,进行"解耦". 注:由于项目原因,本文只针对驾车路线规划进行封装. 首先,定义RoutePlan类,这个类就是路线规划类,既然是路线规划,所以要实现OnGetRoutePlanResultListener接口,路线规划需要的三个参数作为它的成员,即城市city.起点start.终点end. 然后,由于需要搜索,所以对外提供搜索接口: public void driving

百度地图路线搜索

public class MainActivity extends MapActivity {       private MapView mapView;//百度地图的相关控件     private BMapManager bMapManager;//加载地图的引擎     private String keyString = "04763B1D8C925195965E838C6E59DB767DAE4BA7";//百度地图的key     private MapControlle

iOS 百度地图反检索地址的问题

今天碰到了这样一个问题,我从服务器端获取了当前用户的轨迹数据列表,想通过反向检索获取用户的轨迹地址,逻辑代码基本上是这样 BMKGeoSearch *signleSearch; for(location in locationArray) { CLLocationCoordinate2d pt = xxxxx; BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init];

C#实现百度地图附近搜索&amp;调用JavaScript函数

前一篇文章"C#调用百度地图API入门&解决BMap未定义问题"讲述了如何通过C#调用百度API显示地图,并且如何解决BMap未定义的问题.这篇文章主要更加详细的介绍百度地图的一些功能,包括附近搜索.城市搜索.路线规划.添加覆盖物等等. 希望文章对你有所帮助!如果文章中有不足之处,还请海涵~ 百度官方文档:http://developer.baidu.com/map/jsmobile.htm 官方DEMO例:http://developer.baidu.com/map/jsde

百度地图进阶【POI数据检索】

前面学习百度地图的一些基本的用法,这次我们一起来看一看百度地图的检索功能吧 poi检索api的基本用法 百度地图的POI类中共有如下几个方法 PoiBoundSearchOption POI范围内检索参数 PoiCitySearchOption poi城市内检索参数 PoiDetailResult 详情检索结果 PoiDetailSearchOption poi 详情检索参数 PoiNearbySearchOption 附近检索参数 PoiResult poi搜索结果. PoiSearch PO

Android学习笔记之使用百度地图实现Poi搜索

PS:装个系统装了一天.心里憔悴.感觉不会再爱了. 学习内容: 1.使用百度Map实现Poi搜索. 2.短串分享 3.在线建议查询   百度地图的研究也算是过半了.能够实现定位,实现相关信息的搜索,实现地图控制这也就算是掌握了一大部分了.这次主要是说说如何去实现poi搜索.那么什么是Poi.   Poi:poi中文翻译为兴趣点.捞干的说其实就是周边的一些ktv,酒店,餐馆,理发店等等都是一个poi.在实现了基础定位的前提后,去搜索附近的poi.这样就可以完成一些其他事情.比如说订一份外卖,预定一