google map 地图轨迹点以画带箭头的直线连接,直观轨迹记录。

2023-10-10 15:20

本文主要是介绍google map 地图轨迹点以画带箭头的直线连接,直观轨迹记录。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!




       一般我们在做地图定位或轨迹查询的时候,需要在地图上绘画各个轨迹点的marker,然后记录各marker点的经纬度坐标,通过drawLine或drawPath可以把各个点连接起来,以实现轨迹记录。

       但是我们想如果这条线能从起始点的marker到中途以及最后点的marker能有一条带箭头的直线连接起来,这样用户看起来更直观一点,一眼就能看懂起始点和终点的线路。这样就需要我们判断直线所画的方向和中途marker点的位置,然后延伸画两条小线,以实现箭头的效果。

	class LineOverlay extends Overlay {/*** according two GeoPoint, draw a line.(use in track)* must have frontGeopoint and backGeopoint  */private GeoPoint front;private GeoPoint back;Paint paint;public LineOverlay() {}public LineOverlay(GeoPoint front, GeoPoint back) {this.front = front;this.back = back;}public void draw(Canvas canvas, MapView mapview, boolean shadow) {super.draw(canvas, mapview, shadow);paint = new Paint();paint.setColor(Color.BLUE);paint.setStyle(Paint.Style.FILL_AND_STROKE);paint.setStrokeWidth(2);paint.setAntiAlias(true);Point point_f = new Point();Point point_b = new Point();//Path path = new Path();mapview.getProjection().toPixels(front, point_f);mapview.getProjection().toPixels(back, point_b);// begin//path.moveTo(point_b.x, point_b.y);// end//path.lineTo(point_f.x, point_f.y);//canvas.drawPath(path, paint);//JudgeDrawArrow(canvas, point_b.x, point_b.y, point_f.x, point_f.y);JudgeDrawArrow(canvas, point_f.x, point_f.y, point_b.x, point_b.y);}/** x1 is the first geopoint marker point X,y1 is that Y;* x2 is the second geopoint marker point X,y2 is that Y;* judge and draw arrow line*/public void JudgeDrawArrow(Canvas canvas, int x1, int y1, int x2, int y2) {double arrow_height = 10; // 箭头高度  double arrow_btomline = 7; // 底边的一半  int x3 = 0;  int y3 = 0;  int x4 = 0;  int y4 = 0;double arctangent = Math.atan(arrow_btomline / arrow_height); // 箭头角度  double arrow_len = Math.sqrt(arrow_btomline * arrow_btomline + arrow_height * arrow_height); // 箭头的长度  double[] endPoint_1 = rotateVec(x2 - x1, y2 - y1, arctangent, true,  arrow_len);double[] endPoint_2 = rotateVec(x2 - x1, y2 - y1, -arctangent, true,  arrow_len);double x_3 = x2 - endPoint_1[0]; // (x_3,y_3)是第一端点  double y_3 = y2 - endPoint_1[1];  double x_4 = x2 - endPoint_2[0]; // (x_4,y_4)是第二端点  double y_4 = y2 - endPoint_2[1];  Double X3 = new Double(x_3);x3 = X3.intValue();  Double Y3 = new Double(y_3);  y3 = Y3.intValue();  Double X4 = new Double(x_4);  x4 = X4.intValue();  Double Y4 = new Double(y_4);  y4 = Y4.intValue();  // 画线  canvas.drawLine(x1, y1, x2, y2,paint);  // 画箭头的一半  canvas.drawLine(x2, y2, x3, y3,paint);  // 画箭头的另一半  canvas.drawLine(x2, y2, x4, y4,paint);  }  public double[] rotateVec(int px, int py, double ang, boolean isChlen,double newLen) {  double rotateResult[] = new double[2];  // 矢量旋转函数,参数含义分别是x分量、y分量、旋转角、是否改变长度、新长度  double vx = px * Math.cos(ang) - py * Math.sin(ang);  double vy = px * Math.sin(ang) + py * Math.cos(ang);  if (isChlen) {  double d = Math.sqrt(vx * vx + vy * vy);  vx = vx / d * newLen;  vy = vy / d * newLen;  rotateResult[0] = vx;  rotateResult[1] = vy;  }  return rotateResult;  }}

构造器的两个参数分别为GeoPoint对象,(geopoint1,geopoint2)

point_f.X,Y为marker点1的屏幕坐标点,point_b.X,Y为marker点2的屏幕坐标点。

(效果图)

这篇关于google map 地图轨迹点以画带箭头的直线连接,直观轨迹记录。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/181298

相关文章

Java Map排序如何按照值按照键排序

《JavaMap排序如何按照值按照键排序》该文章主要介绍Java中三种Map(HashMap、LinkedHashMap、TreeMap)的默认排序行为及实现按键排序和按值排序的方法,每种方法结合实... 目录一、先理清 3 种 Map 的默认排序行为二、按「键」排序的实现方式1. 方式 1:用 TreeM

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Python利用GeoPandas打造一个交互式中国地图选择器

《Python利用GeoPandas打造一个交互式中国地图选择器》在数据分析和可视化领域,地图是展示地理信息的强大工具,被将使用Python、wxPython和GeoPandas构建的交互式中国地图行... 目录技术栈概览代码结构分析1. __init__ 方法:初始化与状态管理2. init_ui 方法: