Android百度地图附加搜索和公交路线方案搜索
Q Q:408365330 E-Mail:egojit@qq.com
综述:
今天公司让我做一个APP下百度地图,显示当前用户位置和附近加油站,同时可以搜索公交车方案。刚开始听说这样的需求我有点纠结,因为这个加油站的数据去哪弄,公交搜索我知道肯定容易。所以开始找资料……。后来发现百度地图的搜附近可以解决这个问题。所以废话不多说开始Code,工作时间快速记录。不浪费时间
一.准备:
首先下载百度地图 Android SDK,和定位SDK。百度新的API中将定位部分独立出来了。本别下载下来配置到自己的项目中。

配置好lib就开始,新建两个类,一个是位置监听和显示,用于监听位置变化。还有一个就是查询监听,用于处理查询返回的结果。MyLocationListener类用于监听位置变化,实现BDLocationListener
import android.util.Log; import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint; /**
* 位置监听处理
* @author egojit
*
*/
public class MyLocationListener implements BDLocationListener { private static String LOG_TAG = "MyLocationListener";
private MapView mMapView;
private Context MyContext; public MyLocationListener(MapView view, Context context) {
this.mMapView = view;
this.MyContext = context;
} @Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
return; MyLocationOverlay myLocationOverlay = new MyLocationOverlay(
this.mMapView); LocationData locData = new LocationData();
// 手动将位置源置为天安门,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要使用百度经纬度坐标(bd09ll)
locData.latitude = location.getLatitude();
locData.longitude = location.getLongitude();
locData.direction = 2.0f;
myLocationOverlay.setData(locData);
if (mMapView != null && mMapView.getOverlays() != null) {
mMapView.getOverlays().add(myLocationOverlay);
mMapView.refresh();
mMapView.getController().animateTo(
new GeoPoint((int) (locData.latitude * 1e6),
(int) (locData.longitude * 1e6)));
mMapView.getController().setZoom(16);
MainActivity activity = (MainActivity) MyContext; activity.jd = locData.longitude;
activity.wd = locData.latitude;
} StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation) {
sb.append("\nspeed : ");
sb.append(location.getSpeed());
sb.append("\nsatellite : ");
logMsg("GPS定位");
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr : ");
logMsg("winfi定位");
sb.append(location.getAddrStr());
} logMsg(sb.toString());
} public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null) {
return;
}
StringBuffer sb = new StringBuffer(256);
sb.append("Poi time : ");
sb.append(poiLocation.getTime());
sb.append("\nerror code : ");
sb.append(poiLocation.getLocType());
sb.append("\nlatitude : ");
sb.append(poiLocation.getLatitude());
sb.append("\nlontitude : ");
sb.append(poiLocation.getLongitude());
sb.append("\nradius : ");
sb.append(poiLocation.getRadius());
if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
sb.append("\naddr : ");
sb.append(poiLocation.getAddrStr());
}
if (poiLocation.hasPoi()) {
sb.append("\nPoi:");
sb.append(poiLocation.getPoi());
} else {
sb.append("noPoi information");
}
logMsg(sb.toString());
} /**
* 打日志
*
* @param s
*/
private static void logMsg(String s) {
Log.i(LOG_TAG, s);
}
}
MySearchListener查询监听类实现了MKSearchListener接口
package com.egojit.dcdemo; import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.widget.Toast; import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.PoiOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKShareUrlResult;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult; /**
* 查询监听
* @author egojit
*
*/
public class MySearchListener implements MKSearchListener { private Context contxt;
private MapView mMapView; public MySearchListener(Context context, MapView mMapView) {
this.contxt = context;
this.mMapView = mMapView;
} @Override
public void onGetAddrResult(MKAddrInfo result, int iError) {
// 返回地址信息搜索结果
} @Override
public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
// 返回驾乘路线搜索结果
} @Override
public void onGetPoiResult(MKPoiResult result, int type, int iError) {
// 返回poi搜索结果 if (iError == MKEvent.ERROR_RESULT_NOT_FOUND) {
Toast.makeText(contxt, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
} else if (iError != 0 || result == null) {
Toast.makeText(contxt, "搜索出错啦..", Toast.LENGTH_LONG).show();
} PoiOverlay poiOverlay = new PoiOverlay((Activity) contxt, mMapView);
poiOverlay.setData(result.getAllPoi());
mMapView.getOverlays().clear();
mMapView.getOverlays().add(poiOverlay);
mMapView.refresh();
for (MKPoiInfo info : result.getAllPoi()) {
if (info.pt != null) {
mMapView.getController().animateTo(info.pt);
break;
}
} } @Override
public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
// 返回公交搜索结果
String plan = "目前公交方案有:\n";
for (int i = 0; i < result.getNumPlan(); i++) {
plan += (i + 1) + "." + result.getPlan(i).getContent() + "\n";
}
Dialog alertDialog = new AlertDialog.Builder(contxt).setTitle("查询结果")
.setMessage(plan).setIcon(R.drawable.ic_launcher).create(); alertDialog.show();
} @Override
public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
// 返回步行路线搜索结果
} @Override
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
// 返回公交车详情信息搜索结果
} @Override
public void onGetShareUrlResult(MKShareUrlResult result, int type, int error) {
// 在此处理短串请求返回结果.
} @Override
public void onGetPoiDetailSearchResult(int arg0, int arg1) {
// TODO Auto-generated method stub } @Override
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
// TODO Auto-generated method stub }
}
这两个是主要的类。
获取位置和网络连接都是需要相关权限的。我们知道百度LBS是三种技术的综合。GPS定位,wifi定位,基站定位。所这这些权限都是要加入AndroidManifest.xml
<!-- 使用网络功能所需权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<!-- SDK离线地图和cache功能需要读写外部存储器 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS" >
</uses-permission>
<!-- 获取设置信息和详情页直接拨打电话需要以下权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE" >
</uses-permission>
<!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission> <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</permission> <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
还有定位不可缺少的一个服务要加入AndroidManifest.xml中:
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.baidu.location.service_v2.2" >
</action>
</intent-filter>
</service>
这样基本完成:
运行结果如下:进入看到我的位置

点击搜索加油站:

这些红点就是附近的加油站。
点击到市府广场:

可以看到有5个公交乘车方案。
总结:这样技术层面是没有任何问题了。将这些功能嵌入到公司的项目中就可以了。
Android百度地图附加搜索和公交路线方案搜索的更多相关文章
- Android百度地图开发05之公交信息检索 + 路线规划
在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容. 公交信息检索 实际上,公交信息检索与POI检索.在线建议检索非常相似,也是把你需要检索的信息发送给百度地图 ...
- [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索
一个. 百度地图城市位置和POI搜索知识 上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...
- Android百度地图开发(四)线路搜索
一.标注驾车线路搜索 1.首先需要定义一个起点和一个终点 // 定义一个起始点和终点 private MKPlanNode start; private MKPlanNode end; 2.实例化地图 ...
- Android 百度地图 简单实现--- 美食搜索
Android 百度地图 简单实现--- 美食 依赖包: 加入 Android 百度依赖包: 1 key: <!-- 开发人员 key --> <meta-dat ...
- Android百度地图相关内容汇总
Android百度地图知识讲解 1.百度地图开发环境搭建 http://www.apkbus.com/android-116050-1-1.html 2.Android百度地图系列教程 h ...
- Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...
- Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...
- Android 百度地图 SDK v3.0.0 (三) 加入覆盖Marker与InfoWindow使用
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...
- android 百度地图开发实例(转载)
因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...
随机推荐
- Nim Game
简单规律: 如果你面前的石子数为1,2,3必赢 4必输: 所以4+1(5),4+2(6),4+3(7)你必赢,因为你总是有办法让对方面对4,而前面分析过了4是必输的: 所以当你面对n的时候,如果n-1 ...
- oracle迁移postgres之-oracle_fdw
1. 安装oracle_fdw 在编译安装前,需要设置postgres的环境变量,如在.bash_profile中增加: export ORACLE_HOME=/u01/app/oracle expo ...
- Java中ProcessBuilder应用实例
系列说明 浅析Java.lang.Runtime类 浅析Java.lang.Process类 浅析Java.lang.ProcessBuilder类 可以使用java中的ProcessBuilder执 ...
- 数据库为什么要用B+树结构--MySQL索引结构的实现
原理: http://blog.csdn.net/cangchen/article/details/44818485 http://blog.csdn.net/kennyrose/article/de ...
- vue路由的使用
ue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用 ...
- asp值mysql驱动
http://www.sufeinet.com/thread-10278-1-1.html%20http://tool.sufeinet.com/CodePreview/CodeView.aspx?a ...
- NetBean常用快捷键(MAC中)
shift+cmd+i:导入包 shift+alt+上:复制当前行,鼠标留在上一行 shift+alt+下:复制当前行,鼠标留在下一行 shift+ctrl+上:将选中行向上移动 shift ...
- proxifier 3.29 key
Proxifier 3.29 serial key :- [Use only One ] (Standard Edition Keys) 5EZ8G-C3WL5-B56YG-SCXM9-6QZA ...
- linux下用用iptables做端口映射的shell
情形一:跨网络.跨主机的映射Full-Nat 我们想到达主机B的80端口,但是由于网络限制可能无法直接完成.但是我们可以到达主机A的8080端口,而主机A可以直接到达B的80端口.这时候可以使用ipt ...
- Android Gallery
xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...