arcgis for android: 绘制带流向箭头的线

需求描述

项目中需要绘制如下图所示的线,但arcgis for android中linesymbol只提供了单箭头/颜色/实虚线等简单配置项,无法通过配置更改线型.

思路

既然没法直接配置线型,那我们就把箭头画上去!
利用PictureMarkerSymbol把箭头画到线上,我们需要这些东西:
1.箭头图标
2.每条线上各自需要多少箭头,以及相应的坐标位置
3.由于线的倾斜程度各不相同,我们需要算出每条线上箭头的旋转角度
得到这些东西 我们就可以渲染箭头啦,开整~

实现过程

一.将箭头图标添加到项目中

箭头如下图所示,添加过程略过

二.依据线的起点,终点,和地图当前比例尺来绘制箭头

/***
*添加箭头
*l1:线的起点  l2:线的终点  scale:当前地图比例尺(通过mapview自带接口获得 自行百度) l:线(获取某些信息用,懒得一个个传就直接把线传来了)
*/
private void addarrow(LineGlBean l1,LineGlBean l2,double scale,LineBean l) {//计算两点之间的实际像素Point p1 = new Point(convertToFloat(l1.getX(),10),convertToFloat(l1.getY(),10),SpatialReferences.getWgs84());Point p2 = new Point(convertToFloat(l2.getX(),10),convertToFloat(l2.getY(),10),SpatialReferences.getWgs84());LinearUnit linearUnit = new LinearUnit(LinearUnitId.METERS);//距离单位AngularUnit angularUnit = new AngularUnit(AngularUnitId.DEGREES);//角度单位double pixel = metreToScreenPixel(GeometryEngine.distanceGeodetic(p1,p2,linearUnit, angularUnit, GeodeticCurveType.GEODESIC).getDistance(),scale,getBaseContext())*10E7;//计算总箭头数(这里一直没太弄明白单位,感兴趣的自己研究下)int number = (int)(pixel/13/2);List<PointBean> pointBeanList = new ArrayList<>();for(int i=1;i<number;i++){//计算每个箭头的位置,创建PictureMarkerSymbol,为之设置图片和角度//获取箭头图标生成PictureMarkerSymbolBitmap bitmap = null;String lineType = "";//信息容器,与绘制无关String linecode = l.getGLDM();//信息容器,与绘制无关String assetspath = "";//箭头图标位置容器assetspath = "icon/" + "排水-线形.png";holder = new ViewHolder();convertView = LayoutInflater.from(this).inflate(R.layout.item_bitmip_show, null);holder.iv_bitmap = convertView.findViewById(R.id.iv_bitmap);holder.tv_name = convertView.findViewById(R.id.tv_name);InputStream open = null;try {open = this.getAssets().open(assetspath);bitmap = BitmapFactory.decodeStream(open);} catch (Exception e) {DateUtil.DialogException(getBaseContext(), e);} finally {if (open != null) {try {open.close();} catch (IOException e) {DateUtil.DialogException(getBaseContext(), e);}}}holder.iv_bitmap.setImageBitmap(bitmap);viewMap.put(l.getFEATURECODE()+i, convertView);if (typeMap.containsKey(linecode)) {typeMap.get(linecode).add(convertView);} else {List<View> list = new ArrayList<>();list.add(convertView);typeMap.put(linecode, list);}convertView.setTag(holder);bitmap = DateUtil.getViewBitmap(convertView);BitmapDrawable bitmapDrawable = new BitmapDrawable(null, bitmap);PictureMarkerSymbol campsiteSymbol = new PictureMarkerSymbol(bitmapDrawable);//为PictureMarkerSymbol配置属性campsiteSymbol.setOffsetY(6);//设置y轴方向上的偏移距离//设置箭头角度(_getAngleArrow方法见下文)if(l.getLX().equals("1")){campsiteSymbol.setAngle(Float.parseFloat(_getAngleArrow(l1,l2).toString())+180);}else{campsiteSymbol.setAngle(Float.parseFloat(_getAngleArrow(l1,l2).toString()));}//根据起止点和当前箭头序号计算箭头坐标Point clickPoint = new Point(p1.getX()+(((p2.getX()-p1.getX())/number)*i), p1.getY()+(((p2.getY()-p1.getY())/number)*i));Point mapPoint = (Point) GeometryEngine.project(clickPoint, SpatialReference.create(4326));//为箭头配置相关信息(与绘制无关)Map<String, Object> dotattrs = new HashMap<String, Object>();dotattrs.put("id", l.getFEATURECODE());dotattrs.put("lineType", l.getGLDM());dotattrs.put("name", l.getQDDH() + "-" + l.getZDDH());dotattrs.put("type", "line");Graphic graphic = new Graphic(mapPoint, dotattrs, campsiteSymbol);graphic.setZIndex(1);//将配置好的要素添加进线所在的图层中lineGraphicsOverlay.getGraphics().add(graphic);//后面是添加逻辑,起到防止重复绘制,图层控制等功能,与绘制本身无关if (!idMap.containsKey(l1.getNummber()+String.valueOf(i))) {idMap.put(l1.getNummber()+String.valueOf(i), graphic);}String endlinecode = linecode.split("_")[1];if (lineListMap.containsKey(endlinecode)) {lineListMap.get(endlinecode).add(graphic);}else {List<Graphic> list = new ArrayList<>();list.add(graphic);lineListMap.put(endlinecode, list);}if (MyApplication.numMap == null || MyApplication.numMap.size() == 0) {MyApplication.numMap.put(linecode, l1.getNummber());} else {if (MyApplication.numMap.containsKey(linecode)) {String oldname = MyApplication.numMap.get(linecode);} else {MyApplication.numMap.put(linecode, linecode);}}}}
 /*** 计算箭头角度* start:线的起点 end:线的终点*/public Double _getAngleArrow(LineGlBean start, LineGlBean end) {//获取起点和终点的坐标值double startX = convertToDouble(start.getX(), 10);double startY = convertToDouble(start.getY(), 10);double endX = convertToDouble(end.getX(), 10);double endY = convertToDouble(end.getY(), 10);//根据三角函数计算应旋转的角度double x = Math.abs(startX - endX);double y = Math.abs(startY - endY);double z = Math.sqrt(x * x + y * y);double angle = Math.asin(y / z) / Math.PI * 180;//根据终起在终点的西南,西北,东南,东北方向的这四种可能性设置箭头最终的旋转角度if (convertToDouble(start.getX(), 10) <= convertToDouble(end.getX(), 10)) {if (startY <= endY) {return -angle;} else {return   angle;}} else {if (startY <= endY) {return   180+angle;} else {return   180-angle;}}}

大功告成,成果图如下所示

结束语

以上就是实现的全过程了,小弟不才,没法做出粘贴即用的教程,只是给大家提供个思路,望能帮助到你.

arcgis for android: 绘制带流向箭头的线相关推荐

  1. Android Canvas绘制带箭头的直线

    先看下效果图: 下面我们直接看代码 我自定义了一个View,代码如下: package com.davis.drawtrangle;import android.content.Context; im ...

  2. android 带箭头的按钮,android自定义带箭头对话框

    本文实例为大家分享了android自定义带箭头对话框的具体代码,供大家参考,具体内容如下 import android.content.context; import android.content. ...

  3. android github 评分控件_「开源」Arcgis for Android测量工具更新至V1.9,新增绘制控件...

    开源地址:https://github.com/roomanl/ArcgisTool 封装Arcgis Runtime for Android 100.6.0地图基本操作. 包括:测量工具控件及测量接 ...

  4. arcgis for Android 100.2 绘制点线面(文末有三维地图)

    这是这阶段arcgis for Android 的最后一篇了,前面有三篇.对于我经常使用坐标,进行绘制点线面图形的程序员,这个必须要的.因为在项目中经常用到. arcgis for Android 1 ...

  5. D3.js 绘制带圆角的矩形 + 带箭头的指示线

    目录 1. 添加带箭头的标线 2. 设置单个矩形盒子的宽高.偏移缩放效果 3. 添加 svg 元素,设置首次加载位置 4. 设置每个盒子纵横向的间距 5. 绘制矩形外层 box 6. 绘制矩形内层 b ...

  6. Matlab如何绘制带箭头图形

    Matlab如何绘制带箭头图形 带箭头坐标轴 带箭头曲线 实例演示 例1 带箭头曲线 例2 带箭头曲线+带箭头坐标轴 联系作者 带箭头坐标轴 前段时间推出了绘制箭头坐标轴曲线的方法,许多网友联系我索取 ...

  7. Matlab任意两点之间绘制带箭头的直线

    Matlab任意两点之间绘制带箭头的直线 简单绘制任意两点之间.本来不想自己写的,可是网上的代码用起来不舒服,所以简单看看原理,原来就是个坐标变换而已.索性自己写了一份,分享如下: function ...

  8. Echarts绘制带箭头的线

    Echarts绘制带箭头的线 这个图主要参考echarts官网的关系图绘制的,难点在于去掉其余导向图的箭头,只保留最后一个节点的箭头,以及处理值为null时箭头的指向问题,代码如下: <temp ...

  9. R语言使用rnorm函数生成正太分布数据、使用plot函数可视化折线图、使用arrows函数在可视化图像中绘制箭头曲线、绘制带箭头线段,可以设置箭头角度,有几个箭头(1起点箭头、2终点箭头,3双箭头)

    R语言使用rnorm函数生成正太分布数据.使用plot函数可视化折线图.使用arrows函数在可视化图像中绘制箭头曲线.绘制带箭头线段,可以设置箭头角度,有几个箭头(1起点箭头.2终点箭头,3双箭头) ...

最新文章

  1. Linux命令之Ethtool
  2. sencha touch 组件选择器getCmp和ComponentQuery.query()的效率解析
  3. python处理csv文件案例_python3读取csv文件任意行列代码实例
  4. CodeForces - 1523E Crypto Lights(组合数学+推公式)
  5. 商品评价判别,文本分类——学习笔记
  6. 洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek
  7. python的整数类型_python基本数据类型
  8. Docker container 集装箱说明
  9. linux 下 pip 安装教程
  10. Xshell实现命令快速输入
  11. CF1320E Treeland and Viruses
  12. Linux 管道通信
  13. js 编写一个程序实现统计一串字符串中的英文小写字母个数!
  14. 新一年级家长快查收,小学入学必备物品超强清单!
  15. 99. Recover Binary Search Tree(恢复二叉搜索树)
  16. 矿视界译文:抗ASIC为何难以实现?看看RVN团队怎么说
  17. MATLAB散点密度图的画法三
  18. 经典机器学习算法的数学推导
  19. 高光谱图像分类的发展前景
  20. oracle函数-动态结果输出

热门文章

  1. Photo Album: IT
  2. Ubuntu影音之PPS
  3. 成都欣荣启扬教育:TikTok东南亚市场选品分析
  4. RIM微软效仿苹果 将提供免费MobileMe同类服务
  5. 2023CS双非保研985经验分享(南大、华科、中科大科学岛、国防科大、西交、中南、深圳大学、北邮、中科院等)
  6. 第一篇博客:极光推送以及自定义推送声音
  7. 在OCP集群中安装NSX ALB AKO
  8. 浅谈python中使用C/C++:ctypes
  9. 格式化电脑硬盘后数据能恢复吗?
  10. Android之滚动控件Recycler