Routemylocationoverlayy在v3.1.0中怎样实现

1498人阅读
《http://blog.csdn.net/shuaiyinoo》谢谢
今天是百度地图的最后一个博客的更新了,看了上面几篇博客不知道大家有没有感受或者有没有什么体会,基本上百度地图提供的查询的方法基本上都是异步调用的,通过异步调用显示在 &MySearchListener implements MKSearchListener &实现了这个接口的各个方法当中
当然这次的经纬度查询和转换同样是在这里面有所体会,在进行经纬度转换的时候,只需要调用百度地图的下面两个方法,就可以成功的知道如何进行经纬度的转换了
总得来说百度地图做起来比Google地图的API做起来简单,原因可能就是应为百度地图的API是中文的,中国人开发的更加适合中国人的使用习惯等等,加油,成功是所于大家的,下面我就把这一几篇博客的核心代码贴出来,供大家参考参考
然后附上这几个博客的总体的项目,请大家笑纳......有很多不足的地方还请大家多多包含......
package com.shuaiyin.
import java.util.ArrayL
import java.util.L
import android.content.C
import android.graphics.C
import android.graphics.P
import android.graphics.P
import android.graphics.drawable.D
import android.os.B
import android.widget.T
import com.baidu.mapapi.BMapM
import com.baidu.mapapi.GeoP
import com.baidu.mapapi.ItemizedO
import com.baidu.mapapi.MKAddrI
import com.baidu.mapapi.MKBusLineR
import com.baidu.mapapi.MKDrivingRouteR
import com.baidu.mapapi.MKGeneralL
import com.baidu.mapapi.MKPlanN
import com.baidu.mapapi.MKPoiI
import com.baidu.mapapi.MKPoiR
import com.baidu.mapapi.MKS
import com.baidu.mapapi.MKSearchL
import com.baidu.mapapi.MKSuggestionR
import com.baidu.mapapi.MKTransitRouteR
import com.baidu.mapapi.MKWalkingRouteR
import com.baidu.mapapi.MapA
import com.baidu.mapapi.MapC
import com.baidu.mapapi.MapV
import com.baidu.mapapi.O
import com.baidu.mapapi.OverlayI
import com.baidu.mapapi.RouteO
import com.baidu.mapapi.TransitO
* 让百度地图继承MapActivity
* @author shuaiyin
public class BaiDu_SuYiActivity extends MapActivity {
//添加百度地图的相关控件
private MapView mapV
//加载百度地图的引起
private BMapManager bMapM
//定义百度地图的KEY
private String key = &3DA89A4BEEB0211C4&;
//在百度地图上添加相应的控件
private MapController mapC
//定义搜索对象
private MKSearch mkS
//定义一个起点
private MKPlanN
//定义一个终点
private MKPlanN
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//首先实例化mapView
mapView = (MapView) this.findViewById(R.id.bmapView);
bMapManager = new BMapManager(BaiDu_SuYiActivity.this);
//调用百度地图加载KEY
bMapManager.init(key, new MKGeneralListener() {
public void onGetPermissionState(int arg0) {
if(arg0 == 300){
Toast.makeText(BaiDu_SuYiActivity.this, &您输入的KEY有问题,请核实&, 2).show();
public void onGetNetworkState(int arg0) {
this.initMapActivity(bMapManager);
//表示可以设置缩放功能
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
//在百度地图上标注一个中心点
//GeoPoint geoPoint = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
//给地图对象设置一个中心点
//mapController.setCenter(geoPoint);
//设置地图的缩放级别
//mapController.setZoom(12);
//显示交通地图
//mapView.setTraffic(true);
//显示卫星地图
//mapView.setSatellite(true);
//给地图对象设置标注物
//mapView.getOverlays().add(new MyOverlay());
//mapController.setZoom(12);
//给地图设置多个标注物
//显示标注的图标
//Drawable drawable = getResources().getDrawable(R.drawable.iconmarka);
//mapView.getOverlays().add(new MyOverLayItem(drawable));
//mapController.setZoom(14);
//在地图范围内实现对物体的搜索
//mkSearch = new MKSearch();
//mkSearch.init(bMapManager, new MySearchListener());
//这个方法表示根据中心点搜索周边的内容
//mkSearch.poiSearchNearBy(&厕所&, new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6)), 5000);
//v5.00驾车路线的搜索
//mapController.setZoom(14);
//在地图范围内实现对物体的搜索
//mkSearch = new MKSearch();
//mkSearch.init(bMapManager, new MySearchListener());
//给定第一个坐标
//start = new MKPlanNode();
//start.pt = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
//给定第二个坐标
//end = new MKPlanNode();
//end.pt = new GeoPoint(307852);
//路线的优先顺序
//mkSearch.setDrivingPolicy(MKSearch.EBUS_TIME_FIRST);
//调用路线的回调方法
//mkSearch.drivingSearch(null, start, null, end);
//6.0行走路线的搜索
//mapController.setZoom(12);
//在地图范围内实现对物体的搜索
//mkSearch = new MKSearch();
//mkSearch.init(bMapManager, new MySearchListener());
//给定第一个坐标
//start = new MKPlanNode();
//start.pt = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
//给定第二个坐标
//end = new MKPlanNode();
//end.pt = new GeoPoint(307852);
//设置回调的行走路线的方法
//mkSearch.walkingSearch(null, start, null, end);
//7.0公交换乘路线的搜索
//mapController.setZoom(12);
//在地图范围内实现对物体的搜索
//mkSearch = new MKSearch();
//mkSearch.init(bMapManager, new MySearchListener());
//给定第一个坐标
//start = new MKPlanNode();
//start.pt = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
//给定第二个坐标
//end = new MKPlanNode();
//end.pt = new GeoPoint(307852);
//设置回调的行走路线的方法
//mkSearch.transitSearch(&北京&, start, end);
//8.0公交详细路线的搜索
//mapController.setZoom(12);
//在地图范围内实现对物体的搜索
//mkSearch = new MKSearch();
//mkSearch.init(bMapManager, new MySearchListener());
//设置回调的行走路线的方法
//mkSearch.poiSearchInCity(&北京&, &300&);
//v9.00驾车路线多条搜索
mapController.setZoom(14);
//在地图范围内实现对物体的搜索
mkSearch = new MKSearch();
mkSearch.init(bMapManager, new MySearchListener());
//给定第一个坐标
start = new MKPlanNode();
start.pt = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
//给定第二个坐标
end = new MKPlanNode();
end.pt = new GeoPoint(307852);
//调用路线的回调方法
mkSearch.transitSearch(&北京&, start, end);
//搜索对象的实现
public class MySearchListener implements MKSearchListener{
//根据名称获取经纬度
public void onGetAddrResult(MKAddrInfo res, int error) {
if(error != 0){
Toast.makeText(BaiDu_SuYiActivity.this, &对不起,找不到您的结果&, 2).show();
mapView.getController().animateTo(res.geoPt);
String msg = String.valueOf(res.geoPt.getLatitudeE6()/1E6)+String.valueOf(res.geoPt.getLongitudeE6()/1E6);
Drawable drawable = getResources().getDrawable(R.drawable.iconmarka);
mapView.getOverlays().clear();
public void onGetBusDetailResult(MKBusLineResult result, int type) {
if(result == null||type != 0){
Toast.makeText(BaiDu_SuYiActivity.this, &对不起,找不到您的结果&, 2).show();
RouteOverlay routeOverlay = new RouteOverlay(BaiDu_SuYiActivity.this, mapView);
routeOverlay.setData(result.getBusRoute());
//清空所有的公交信息
mapView.getOverlays().clear();
mapView.getOverlays().add(routeOverlay);
mapView.invalidate();
mapView.getController().animateTo(result.getBusRoute().getStart());
public void onGetDrivingRouteResult(MKDrivingRouteResult result, int type) {
//对调用的搜索方法进行回调响应
if(result == null){
RouteOverlay routeOverlay = new RouteOverlay(BaiDu_SuYiActivity.this, mapView);
//里面的参赛之所以填0是应为我们只需要返回第一条线路
routeOverlay.setData(result.getPlan(0).getRoute(0));
mapView.getOverlays().add(routeOverlay);
mapView.invalidate();
public void onGetPoiDetailSearchResult(int result, int type) {
public void onGetPoiResult(MKPoiResult result, int type, int iError) {
//对调用的搜索方法进行回调响应
//if(result == null){
//PoiOverlay poiOverlay = new PoiOverlay(BaiDu_SuYiActivity.this, mapView);
//poiOverlay.setData(result.getAllPoi());
//mapView.getOverlays().add(poiOverlay);
//mapView.invalidate();
if(result == null||iError != 0){
Toast.makeText(BaiDu_SuYiActivity.this, &对不起,找不到您的结果&, 2).show();
//定义一个公交线路图描述类
MKPoiInfo mkPoiInfo =
//获得公交线路图的总的站点
int totalPoiNum = result.getNumPois();
for(int i = 0;i&totalPoiNi++){
mkPoiInfo = result.getPoi(i);
if(mkPoiInfo.ePoiType == 2){
//如果说返回的时候公交的线路图就返回
mkSearch.busLineSearch(&北京&, mkPoiInfo.uid);
public void onGetRGCShareUrlResult(String arg0, int arg1) {
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
public void onGetTransitRouteResult(MKTransitRouteResult result, int type) {
//公交换乘的回调方法
//if(result == null){
//TransitOverlay transitOverlay = new TransitOverlay(BaiDu_SuYiActivity.this, mapView);
//transitOverlay.setData(result.getPlan(0));
//mapView.getOverlays().add(transitOverlay);
//刷新地图
//mapView.invalidate();
if(result == null){
//获得所有的驾车线路图
int planNum = result.getNumPlan();
for(int i = 0 ;i&planNi++){
TransitOverlay transitOverlay = new TransitOverlay(BaiDu_SuYiActivity.this, mapView);
transitOverlay.setData(result.getPlan(i));
mapView.getOverlays().add(transitOverlay);
mapView.invalidate();
mapView.getController().animateTo(result.getStart().pt);
public void onGetWalkingRouteResult(MKWalkingRouteResult result, int type) {
//对调用的搜索方法进行回调响应
if(result == null){
RouteOverlay routeOverlay = new RouteOverlay(BaiDu_SuYiActivity.this, mapView);
routeOverlay.setData(result.getPlan(0).getRoute(0));
mapView.getOverlays().add(routeOverlay);
//刷新地图
mapView.invalidate();
//标注一个遮盖物
public class MyOverlay extends Overlay{
//声明一个地点
private GeoPoint geoPoint = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
//声明一个画笔工具
private Paint paint = new Paint();
public void draw(Canvas arg0, MapView arg1, boolean arg2) {
super.draw(arg0, arg1, arg2);
Point point = mapView.getProjection().toPixels(geoPoint, null);
arg0.drawText(&这里是天安门&, point.x,point.y,paint);
//标注多个遮盖物
public class MyOverLayItem extends ItemizedOverlay&OverlayItem&{
private List&OverlayItem& overlayItem = new ArrayList&OverlayItem&();
//定义一组坐标
private double mLat1 = 39.90923;//经
private double mLot1 = 116.397428;//纬
private double mLat2 = 39.92923;//经
private double mLot2 = 116.377428;//纬
private double mLat3 = 39.94923;//经
private double mLot3 = 116.357428;//纬
private double mLat4 = 39.96923;//经
private double mLot4 = 116.337428;//纬
//用于在地图上标识坐标,用一个图片标注
public MyOverLayItem(Drawable drawable) {
super(drawable);
GeoPoint geoPoint1 = new GeoPoint((int)(mLat1*1E6),(int)(mLot1*1E6));
GeoPoint geoPoint2 = new GeoPoint((int)(mLat2*1E6),(int)(mLot2*1E6));
GeoPoint geoPoint3 = new GeoPoint((int)(mLat3*1E6),(int)(mLot3*1E6));
GeoPoint geoPoint4 = new GeoPoint((int)(mLat4*1E6),(int)(mLot4*1E6));
overlayItem.add(new OverlayItem(geoPoint1, &A&, &这是第一个&));
overlayItem.add(new OverlayItem(geoPoint2, &B&, &这是第二个&));
overlayItem.add(new OverlayItem(geoPoint3, &C&, &这是第三个&));
overlayItem.add(new OverlayItem(geoPoint4, &D&, &这是第四个&));
//刷新地图
populate();
//返回指定的List集合中每一个坐标
protected OverlayItem createItem(int arg0) {
return overlayItem.get(arg0);
public int size() {
return overlayItem.size();
//当标注物被点击的时候
public boolean onTap(int i) {
Toast.makeText(BaiDu_SuYiActivity.this, overlayItem.get(i).getSnippet(), 2).show();
protected void onDestroy() {
super.onDestroy();
if(bMapManager != null){
bMapManager.destroy();
bMapManager =
protected void onResume() {
super.onResume();
if(bMapManager != null){
bMapManager.start();
protected void onPause() {
super.onPause();
if(bMapManager != null){
bMapManager.stop();
protected boolean isRouteDisplayed() {
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:75797次
积分:1186
积分:1186
排名:第15024名
原创:37篇
评论:106条
(10)(2)(8)(12)(1)(1)(4)摘要:公交导航,即在市内坐公交,从哪儿去哪儿,比如从王府井到西单。有多种公交策略可以选择,比如少步行,不坐地铁等。
----------------------------------------------------------------------系列阅读:1、【百度地图-安卓SDK】从头开始写android程序&2、【&零起点&--百度地图手机SDK】如何创建一张地图&3、【&零起点&--百度地图手机SDK】如何使用离线地图?&4、【&零起点&--百度地图手机SDK】如何添加地图图层+按钮事件+水平垂直布局?&5、【&零起点&--百度地图手机SDK】如何进行三种POI搜索?&
6、【&零起点&--百度地图手机SDK】如何查询公交线路?如北京的104路
-----------------------------------------------------------------------
先按照第6章的内容,搭好环境与代码框架。接下来,只需要修改少量代码,即可实现公交导航功能。
一、公交导航接口transitSearch
由于公交导航只支持市内公交,所以,设置城市是必须的。
目前还不支持跨城公交,将来会考虑增加火车信息。
另外,驾车导航,支持跨城驾车。
myMKSearch.transitSearch("北京", start, end); // 必须设置城市名。
该接口支持检索起点和终点为关键字,或者坐标。但请注意,都必须使用到MKPlanNode接口。
MKPlanNode start = new MKPlanNode();
start.name = "王府井";//关键字方式
//start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));//经纬度方式
接下来设置公交策略。有如下几种策略:
EBUS_TIME_FIRST:时间优先;
EBUS_TRANSFER_FIRST:少换乘;
EBUS_WALK_FIRST:少步行;
EBUS_NO_SUBWAY: 不乘坐地铁。
myMKSearch.setTransitPolicy(MKSearch.EBUS_NO_SUBWAY); //不乘坐地铁
二、设置回调函数
回调函数onGetTransitRouteResult里,需要设置如下内容:
TransitOverlay transitOverlay = new TransitOverlay(YingTransitActivity.this, mMapView);//创建公交覆盖物对象
transitOverlay.setData(res.getPlan(0));// 此处仅展示一个方案作为示例
mMapView.getOverlays().add(transitOverlay);//添加覆盖物到地图上
mMapView.invalidate();
//刷新地图
三、运行结果
四、全部源代码
package com.baidu.yingT
import android.app.A
import android.os.B
/** 引入import **/
import java.util.ArrayL
import java.util.L
import android.content.C
import android.graphics.C
import android.graphics.P
import android.graphics.P
import android.graphics.drawable.D
import android.location.L
import android.os.B
import android.util.L
import android.view.V
import android.widget.T
import com.baidu.mapapi.BMapM
import com.baidu.mapapi.GeoP
import com.baidu.mapapi.ItemizedO
import com.baidu.mapapi.LocationL
import com.baidu.mapapi.MKAddrI
import com.baidu.mapapi.MKBusLineR
import com.baidu.mapapi.MKDrivingRouteR
import com.baidu.mapapi.MKGeneralL
import com.baidu.mapapi.MKLocationM
import com.baidu.mapapi.MKPlanN
import com.baidu.mapapi.MKPoiI
import com.baidu.mapapi.MKPoiR
import com.baidu.mapapi.MKS
import com.baidu.mapapi.MKSearchL
import com.baidu.mapapi.MKSuggestionR
import com.baidu.mapapi.MKTransitRouteR
import com.baidu.mapapi.MKWalkingRouteR
import com.baidu.mapapi.MapA
import com.baidu.mapapi.MapC
import com.baidu.mapapi.MapV
import com.baidu.mapapi.MyLocationO
import com.baidu.mapapi.O
import com.baidu.mapapi.OverlayI
import com.baidu.mapapi.PoiO
import com.baidu.mapapi.RouteO
import com.baidu.mapapi.TransitO
public class YingTransitActivity extends MapActivity {
/** 申明变量 **/
BMapManager mBMapMan = null;
MapView mMapView = null;
MKSearch myMKSearch = null;
//POI搜索变量申明
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/** 创建地图 **/
mBMapMan = new BMapManager(getApplication());
mBMapMan.init("A0C854D1BB6CA", 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(14);
//设置地图zoom级别
myMKSearch = new MKSearch();
myMKSearch.init(mBMapMan, new MKSearchListener(){
public void onGetPoiResult(MKPoiResult result, int type, int error) {
public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) {
public void onGetTransitRouteResult(MKTransitRouteResult res, int error) {
if (res == null) {return;}
TransitOverlay transitOverlay = new TransitOverlay(YingTransitActivity.this, mMapView);
// 此处仅展示一个方案作为示例
transitOverlay.setData(res.getPlan(0));
mMapView.getOverlays().add(transitOverlay);
mMapView.invalidate();
//刷新地图
public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) {
public void onGetAddrResult(MKAddrInfo res, int error) {
public void onGetBusDetailResult(MKBusLineResult result, int error) {
public void onGetSuggestionResult(MKSuggestionResult result, int error) {
/** 公交导航查询 **/
MKPlanNode start = new MKPlanNode();
start.name = "王府井";//关键字方式
//start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));//经纬度方式
MKPlanNode end = new MKPlanNode();
end.name = "西单"; //关键词方式
//end.pt = new GeoPoint(6307852);//经纬度方式
myMKSearch.setTransitPolicy(MKSearch.EBUS_NO_SUBWAY); //公交策略:EBUS_TIME_FIRST:时间优先;EBUS_TRANSFER_FIRST:少换乘;EBUS_WALK_FIRST:少步行;EBUS_NO_SUBWAY: 非地铁
myMKSearch.transitSearch("北京", start, end); // 必须设置城市名。start和end可通过关键字,坐标两种方式指定,但必须使用MKPlanNode接口。
protected boolean isRouteDisplayed() {
return false;
/** 引入方法管理API **/
protected void onDestroy() {
if (mBMapMan != null) {
mBMapMan.destroy();
mBMapMan = null;
super.onDestroy();
protected void onPause() {
if (mBMapMan != null) {
mBMapMan.stop();
super.onPause();
protected void onResume() {
if (mBMapMan != null) {
mBMapMan.start();
super.onResume();
阅读(...) 评论()如何利用百度地图,实现自己的实时路况
- eoeAndroid
如何利用百度地图,实现自己的实时路况
具体情况是这样的假如可以从服务器上获取到某一个地区的主要交通道路的实时路况信息,那么如何能像百度等地图软件那样在地图上展示出路况信息呢?百度的效果图,相信使用过的人都知道,还是挺方便的应该是用路线覆盖的方法,然后从服务器上获取实时数据通过颜色(某速度区间用某种颜色)的区分(类似百度地图的做法),更新路况信息,如何覆盖交通道路啊???新人等大虾解决啊
不知道你是想做一个类似百度地图那样的带路况功能的地图,还是直接使用百度地图,然后显示自己的路况信息?无论哪种,首先需要了解地图图层的概念,如地理底图和路况图、遥感图、还有自行车路线图等等都是分别作为不同的图层;然后了解图层叠加。ps:可以有自己的路况图,很牛啊;如果没有的话,调用百度的路况图应该有相应接口
其他回答 (11)
理论上是直接调用google 百度等 地图的SDK实现...
先使用百度定位sdk定位当前位置,如何设置显示交通图
百度有个demo里面写的挺全的可以试一试
嗯,那个看过了,没有合适的,给百度地图上的道路覆盖颜色不好弄啊,画线倒是能实现,可是道路不会啊。
百度没有提供接口,只有一个设置参数,设置为true就出实时路况了。我想利用百度地图,在地图上的道路自己覆盖不同颜色的图层以代表实时路况
你这句话怎么理解?第一个定位很好做,自己覆盖道路图层就不会啊,求地图大虾来解决一下啊
百度没有提供接口啊,只有mMapView.setTraffic(true),设置这个就能显示实时路况,我的需求是自己做啊,不用百度,用百度地图为基础,覆盖自己的图层,这个原理估计跟百度地图的那个差不多。
设置这个true参数就是百度提供的接口,只不过其内部实现全藏起来了,这样的话调用的是百度的路况。如果你想用自己的路况,而又要用百度的底图,说实话应该挺麻烦的,大的来说就是你自己搞一个路况图层,其实可以理解成一个道路图,只不过带不同颜色而已,然后该图层跟百度底图叠加。而你要实现自己的图层,就必须要绘图,这里就是绘线了,坐标转换需要的、坐标匹配需要的……应该很复杂的工作。画完自己的路况图后,两个图层叠加,坐标匹配之类的同样需要。总的来说自己实现比较麻烦,如果可以直接调百度提供的路况图就好了
这个小项目就是导师要自己实现实时路况啊,如果直接调用百度地图的感觉没法交差啊,android新手现在感觉好捉急啊。
大虾,研究了很久好像有点思路,百度地图有个路线图层RouteOverlay类,我觉得可以重写这个类以达到我的目的?你觉得可行吗?
这个类是用来做路径查询规划的,你是可以重写生成一条自定义的路线,但恐怕那些颜色效果、颜色分段什么的不太好实现;你可以先试一下效果,如果不行再考虑重新写一个自己的
等待您来回答
该问题来自:eoeAndroid 开发门户,中国最大最活跃的Android开发社区。互联网领域专家

我要回帖

更多关于 top overlay 的文章

 

随机推荐