Android百度地图附加搜索和公交路线方案搜索

时间:2023-03-08 16:53:48
合肥程序员群:49313181。    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

综述:

今天公司让我做一个APP下百度地图,显示当前用户位置和附近加油站,同时可以搜索公交车方案。刚开始听说这样的需求我有点纠结,因为这个加油站的数据去哪弄,公交搜索我知道肯定容易。所以开始找资料……。后来发现百度地图的搜附近可以解决这个问题。所以废话不多说开始Code,工作时间快速记录。不浪费时间

一.准备:

首先下载百度地图 Android SDK,和定位SDK。百度新的API中将定位部分独立出来了。本别下载下来配置到自己的项目中。

Android百度地图附加搜索和公交路线方案搜索

配置好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>

这样基本完成:

运行结果如下:进入看到我的位置

Android百度地图附加搜索和公交路线方案搜索

点击搜索加油站:

Android百度地图附加搜索和公交路线方案搜索

这些红点就是附近的加油站。

点击到市府广场:

Android百度地图附加搜索和公交路线方案搜索

可以看到有5个公交乘车方案。

总结:这样技术层面是没有任何问题了。将这些功能嵌入到公司的项目中就可以了。

版权:归博客园和Egojit所有,转载请标明出处。