技术标签: 个人经验 路线绘制 清除 多个marker添加 高德地图 Android
先扔一些高德原有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是不移动 //添加到地图上,返回所有marker的集合 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) { //markerList即为添加到地图上返回的marker集合 for (int i = 0; i < markerList.size(); i++) { 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() { //此处方法调用的是其父类RouteOverlay 的方法 addPolyLine(mPolylineOptions); } } //此处为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(); } }
注: /** 别忘了implements OnMapClickListener * 高德地图提供 如果点击地图上marker以外的区域回调 * @param latLng */ @Overridepublic void onMapClick(LatLng latLng) { //进行你想要进行的处理 } 未完,待续。。。。。
注: /** 别忘了implements OnMapClickListener * 高德地图提供 如果点击地图上marker以外的区域回调 * @param latLng */ @Overridepublic void onMapClick(LatLng latLng) { //进行你想要进行的处理 }这里有一个添加路线,移除路线的demo: Demo地址 点击打开
未完,待续。。。。。
/** * 获取两点之间的距离(单位为米) LatLng start = new LatLng(39.95676, 116.401394); LatLng end = new LatLng(36.63014,114.499574); float distance = AMapUtils.calculateLineDistance(start, end); */
文章浏览阅读841次。 什么是虚拟化3.0时代? 微软公司的云计算服务有哪些? 云计算IDC服务都包括什么? 什么是云计算? 向私有云过渡的步骤有哪些?一直舍不得丢掉的东西:“一(个)白云、三(个)兔子...” 和“...早日发账”(写于2011年12月10日00:17 北京)今天这个话题比较有感觉,就晒一晒我舍不得的两件东西:“一(个)白云、三(个)兔子...” 和“
文章浏览阅读2w次,点赞17次,收藏97次。一、滚轮控制视角缩放 /// &amp;lt;summary&amp;gt; /// 滚轮控制相机视角缩放 /// &amp;lt;/summary&amp;gt; public void CameraFOV() { //获取鼠标滚轮的滑动量 float wheel = Input.GetAxis(&quot;Mouse ScrollWheel&am_unity 相机 平移 拖拽 缩放
文章浏览阅读280次,点赞6次,收藏4次。目录1、题目2、思路13、代码14、思路25、代码21、题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2的元素数量分别为 m 和n。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]_力扣22 c++
文章浏览阅读139次。《一个很不错的CSS改写的大表单文本框和搜索按钮组》要点:本文介绍了一个很不错的CSS改写的大表单文本框和搜索按钮组,希望对您有用。如果有疑问,可以联系我们。先看效果图:HTML代码部分:开始爬取CSS部分:/*大搜索框*/.searchInputBox{height:62px;width:810px;margin:0auto;border-radius:6px;background-..._css 好看 文本框
文章浏览阅读3.4k次。描述:通过你好来判断hello是否启用和禁止html:<li> <span class="xin">*</span><label>你好</label> <select id="dimAcc"> <option >类似</option> ..._select下拉框启用和禁止
文章浏览阅读988次,点赞29次,收藏21次。前言之前面试遇到这样一个题目。关于async/await、promise和setTimeout的执行顺序,当时没做对。后来查了查是非常经典的题目。也给大家解疑答惑一下,说出自己的理解。题目是看代码写结果。async function async1() { console.log('async1 start'); await async2(); console.log('asnyc1 end');}async function async2() { console.log('async2_js执行顺序console.log('script start') async function async1() { await async2
文章浏览阅读912次。一、前言上一节我们介绍了:vs code工具的一些特殊使用,使用vs code默认集成的Git工具快速提交代码,详细可参考博文:原创Vue笔记整理,11.项目-使用vs code默认集成的Git工具快速提交代码这篇我们将介绍项目-完成tabbar的小图标设置二、完成tabbar的小图标设置更新中。。。..._tab-bar设置图标
文章浏览阅读109次。第一节 Make与MakefileMake简介Make将只编译改动的代码文件,而不用完全编译Make使用Makefile1:Make只能读取Makefile文件2:Makefile功能包含’由谁生成’可执行文件,‘怎么生成可执行文件’.‘生成什么可执行文件’Makefile格式生成什么:由谁生成 <table> commandMakefile隐含规则第二节 创建与使用变量Make变量(变量必须大写)去""的字符串Make变量为了便_d4文件
文章浏览阅读702次。MVVM的大名相信做手机开发的肯定不会陌生,我第一次听到它是从做IOS开发的同学那里听到的,我们的项目之前应用了MVP,要说服大家从MVP到MVVM,肯定得说说为啥,他优秀在那里? 首先我们看看正常MVP的依赖关系图: 这是个经典的MVP依赖关系,View 层和Presenter,Presenter和Model层彼此依..._android mvvm image src
文章浏览阅读4.8k次。PostgreSQL有3种日志,分别是pg_log(数据库运行日志)、pg_xlog(WAL 日志,即重做日志)、pg_clog(事务提交日志,记录的是事务的元数据)pg_log默认是关闭的,需要设置参数启用此日志。pg_xlog和pg_clog都是强制打开的,无法关闭。1.启用pg_log并配置日志参数log_destination = 'csvlog'logging_collector = o..._pg修改log_connections
文章浏览阅读62次。有个网友写信给我谈到关于PHP计算工资问题。我以前一篇文章中谈到过一种计算工资的方法,不过是偷巧,利用现有的表达式的工具,现在既然有人想要,我就给出一个逆波兰的算法。 我们的目标是实现如下的计算公式: 假设有一个计算公式如下: $expression = "(F1*F12+10.34)"; 其中的变量值如下: $expression_value = Array('F1'=>10, 'F12'..._php 逆波兰算法 函数
文章浏览阅读57次。16.12编写你自己版本的Blob和BlobPtr模板,包含书中未定义的多个const成员。Blob.h(注意,成员函数的声明和定义要放在一个头文件中)/*记住,模板的头文件中通常既包括声明也包括定义。函数模板和类模板成员函数的定义通常放在头文件中,不能分开放。。。。谨记*/#ifndef BLOB_H#define BLOB_H#include<iostream&g..._blobptr