Android 高德地图集成 地图展示+定位+路线规划+各种原有图标的隐藏处理

来源:互联网 发布:光伏数据采集器品牌 编辑:程序博客网 时间:2024/05/01 02:37

先扔一些高德原有UI的更改占坑.


//更改系统原有定位图标MyLocationStyle myLocationStyle = new MyLocationStyle();myLocationStyle.myLocationIcon(BitmapDescriptorFactory        .fromResource(R.drawable.gps_point));// 设置小蓝点的图标myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));// 设置圆形的边框颜色myLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0));// 设置圆形的填充颜色myLocationStyle.strokeWidth(0f);// 设置圆形的边框粗细aMap.setMyLocationStyle(myLocationStyle);

 //获取高德地图控件设置对象    mUiSettings = aMap.getUiSettings();    mUiSettings.setZoomControlsEnabled(false);//隐藏放大 缩小 按钮    mUiSettings.setMyLocationButtonEnabled(false);//隐藏原有定位按钮mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_CENTER);//高德logo位置的移动

功能一:如何添加marker,添加一个和批量添加

1  添加单个marker

MarkerOptions markerOptions = new MarkerOptions();markerOptions.position(new LatLng(dlat, dlong));//参数为想要添加marker位置的经纬度markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));//参数为想要展示的图标
aMap.addMarker(markerOptions);//将marker添加到地图上

2  批量添加marker

第一步添加marker到地图上:
for (int i = 0; i < dataList.size(); i++) {//此处dataList是存有想要添加marker点的集合        MarkerOptions markerOptions = new MarkerOptions();//初始化 MarkerOptions对象         markerOptions.position(new LatLng(目标点纬度, 目标点经度));    markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));//设置marker图标    markerOptionlist.add(markerOptions);}
//第二个参数是设置是否移动到屏幕中心,FALSE是不移动markerList = aMap.addMarkers(markerOptionlist, false);//添加到地图上,返回所有marker的集合
第二步设置marker监听
//设置market 点击事件aMap.setOnMarkerClickListener(markerClickListener);
// 定义 Marker 点击事件监听    AMap.OnMarkerClickListener markerClickListener = new AMap.OnMarkerClickListener() {        // marker 对象被点击时回调的接口        // 返回 true 则表示接口已响应事件,否则返回false        @Override        public boolean onMarkerClick(Marker marker) {            for (int i = 0; i < markerList.size(); i++) {//markerList即为添加到地图上返回的marker集合                               if (marker.equals(markerList.get(i))) {                  //已找到你所点击的marker,接下来进行你想要的操作                      return true;                }          }
 return false;
    };

功能二:如何添加路线和清除路线(步行路线为例)

  1 绘制路线到地图上 class A implements RouteSearch.OnRouteSearchListener{
//我自己的步行路线封装类                                                                                                                  private void walkRouteSearch() {

mStartPoint = new LatLonPoint(lastLat, lastLon);//路线起点
mEndPoint = new LatLonPoint(lastLat, lastLon);//路线终点  
mRouteSearch = new RouteSearch(activity);       
 mRouteSearch.setRouteSearchListener(this);//类A已实现OnRouteSearchListener        
searchRouteResult(Constant.ROUTE_TYPE_WALK, RouteSearch.WalkDefault);  
  }   
 
/** * 开始搜索路径规划方案 */public void searchRouteResult(int routeType, int mode) {    try {        if (mStartPoint == null) {            Utils.ToastUtils(mContext, "定位中,稍后再试...");            return;        }        if (mEndPoint == null) {            Utils.ToastUtils(mContext, "终点未设置");        }        final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(                mStartPoint, mEndPoint);        if (routeType == Constant.ROUTE_TYPE_WALK) {// 步行路径规划            RouteSearch.WalkRouteQuery query = new RouteSearch.WalkRouteQuery(fromAndTo, mode);            mRouteSearch.calculateWalkRouteAsyn(query);// 异步路径规划步行模式查询        }    } catch (Exception e) {        Utils.LogUtils("1Exception: " + e.toString());    }}
 //RouteOverlay 更改路线颜色 宽度等    RouteOverlay routeOverlay;    public WalkRouteOverlay walkRouteOverlay;    @Override    public void onWalkRouteSearched(WalkRouteResult result, int errorCode) {        if (walkRouteOverlay != null) {            List<Polyline> allPolyLines = walkRouteOverlay.allPolyLines;            for (Polyline polyline : allPolyLines) {                polyline.remove();            }        }        try {            if (errorCode == AMapException.CODE_AMAP_SUCCESS) {                if (result != null && result.getPaths() != null) {                    if (result.getPaths().size() > 0) {                        mWalkRouteResult = result;                        final WalkPath walkPath = mWalkRouteResult.getPaths()                                .get(0);                        walkRouteOverlay = new WalkRouteOverlay(//该对象在移除路线时有大用处                                activity, aMap, walkPath,                                mWalkRouteResult.getStartPos(),                                mWalkRouteResult.getTargetPos());                       
//                        walkRouteOverlay.zoomToSpan();//镜头移动到当前视角//                        walkRouteOverlay.setNodeIconVisibility(false);//去掉沿途标志图标//                        walkRouteOverlay.removeFromMap();//去掉路线上所有markers,包括起点终点图标
walkRouteOverlay.addToMap();  
   } else if (result != null && result.getPaths() == null) {     
                   Utils.ToastUtils(mContext, "no_result");        
            }              
  } else {            
        Utils.ToastUtils(mContext, "no_result");         
       }           
 } else {      
          Utils.ToastUtils(mContext, "errorCode: " + errorCode);          
  }      
  } catch (Exception e) {         
   Utils.LogUtils("2Exception: " + e.toString());     
   }
   }
2 更改路线宽度、颜色以及清除路线
// 更改路线宽度和颜色
//此处用到两个类WalkRouteOverlay 和RouteOverlay
//其中WalkRouteOverlay extends RouteOverlay,是它的子类
点开RouteOverlay类,找到
protected float getRouteWidth() {//修改返回值设置路线宽度      return 5f;}
protected int getWalkColor() {//修改返回值设置路线颜色   return Color.parseColor("#5ac0f3");}
移除路线
上面将路线添加到地图上时:walkRouteOverlay.addToMap();调用WalkRouteOverlay类中的方法:
//此处为WalkRouteOverlay类,类中用不到的方法已省略public class WalkRouteOverlay extends RouteOverlay {    private PolylineOptions mPolylineOptions;    private BitmapDescriptor walkStationDescriptor= null;    private WalkPath walkPath;   
...............此处省略用不到代码.............      /**    * 添加步行路线到地图中。    * @since V2.1.0    */    public void addToMap() {        initPolylineOptions();        try {            List<WalkStep> walkPaths = walkPath.getSteps();            mPolylineOptions.add(startPoint);            for (int i = 0; i < walkPaths.size(); i++) {                WalkStep walkStep = walkPaths.get(i);                LatLng latLng = AMapServicesUtil.convertToLatLng(walkStep                        .getPolyline().get(0));                //          addWalkStationMarkers(walkStep, latLng);//去掉路线上沿途标志点                addWalkPolyLines(walkStep);                           }            mPolylineOptions.add(endPoint);//            addStartAndEndMarker();            showPolyline();//调用下面的showPolyline        } catch (Throwable e) {            e.printStackTrace();        }    }      private void showPolyline() {        addPolyLine(mPolylineOptions);//此处方法调用的是其父类RouteOverlay 的方法    }}
//此处为RouteOverlay类  没有用到的代码已省略
public class RouteOverlay {   
public List<Polyline> allPolyLines = new ArrayList<Polyline>();//用于存储已添加到地图上的路线对象
protected void addPolyLine(PolylineOptions options) {   if(options == null) {      return;   }   Polyline polyline = mAMap.addPolyline(options);//获取所添加路线对象   if(polyline != null) {      allPolyLines.add(polyline);//将路线添加到集合中      }}
}
到这里这样我们就获取到了所有添加到地图上的路线集合allPolyLines,然后通过上面我们添加路线时
得到的walkRouteOverlay(还记得上面注释写有多大用处的么)就可以对已添加路线进行操作,
我的操作是:
if (walkRouteOverlay != null) {
    List<Polyline> allPolyLines = walkRouteOverlay.allPolyLines;    for (Polyline polyline : allPolyLines) {        polyline.remove();    }}
//以上就是移除路线,或许高德API中有更好的方法,但我是这么处理的。。。。。。
注:
/**
   别忘了implements OnMapClickListener
* 高德地图提供 如果点击地图上marker以外的区域回调 
*  @param latLng 
*/
@Overridepublic void onMapClick(LatLng latLng) {  
  //进行你想要进行的处理
}
未完,待续。。。。。
 可加QQ1301989189进行交流

/** * 获取两点之间的距离(单位为米) LatLng start = new LatLng(39.95676, 116.401394); LatLng end = new LatLng(36.63014,114.499574); float distance  = AMapUtils.calculateLineDistance(start, end); */

0 0