[6.5.0][Feat]新增行程总览功能

This commit is contained in:
chenfufeng
2024-07-05 15:10:49 +08:00
parent 3bcacb2ca4
commit febcc2e5df
21 changed files with 1117 additions and 18 deletions

View File

@@ -1,25 +1,28 @@
package com.mogo.eagle.core.utilcode.util;
import android.util.Pair;
public class LocationUtils {
/**
* 地球半径
*/
private static double EARTH_RADIUS = 6378.137;
private static double rad( double d ) {
private static double rad(double d) {
return d * Math.PI / 180.0;
}
/**
* 计算两点间距离( 单位:米 )
*
* @param lat1
* @param lng1
* @param lat2
* @param lng2
* @return
*/
public static double getDistance( double lat1, double lng1, double lat2, double lng2 ) {
double radLat1 = rad( lat1 );
public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
@@ -35,7 +38,8 @@ public class LocationUtils {
/**
* 点到直线的最短距离的判断 点x0,y0 到由两点组成的线段x1,y1 ,( x2,y2 ) <br>
* ( 单位:米 )
* ( 单位:米 )
*
* @param x1
* @param y1
* @param x2
@@ -44,7 +48,7 @@ public class LocationUtils {
* @param y0
* @return
*/
public static double pointToLine( double x1, double y1, double x2, double y2, double x0, double y0 ) {
public static double pointToLine(double x1, double y1, double x2, double y2, double x0, double y0) {
double space;
double a, b, c;
a = getDistance(y1, x1, y2, x2);// 线段的长度
@@ -73,4 +77,103 @@ public class LocationUtils {
space = 2 * s / a;// 返回点到线的距离(利用三角形面积公式求高)
return space;
}
/**
* 计算向量的点积
*
* @param xa
* @param ya
* @param xb
* @param yb
* @return
*/
private static double dotProduct(double xa, double ya, double xb, double yb) {
return xa * xb + ya * yb;
}
/**
* 计算向量的模长
* @param xa
* @param ya
* @return
*/
private static double magnitude(double xa, double ya) {
return Math.sqrt(xa * xa + ya * ya);
}
/**
* 计算点p到点a和点b组成的线段的垂足
*
* @param xp
* @param yp
* @param xa
* @param ya
* @param xb
* @param yb
* @return 垂足
*/
public static Pair<Double, Double> footPoint(double xp, double yp, double xa, double ya, double xb, double yb) {
// 计算线段的向量v,即b - a
double xv = xb - xa;
double yv = yb - ya;
// 计算点p相对于线段起点a的向量w,即p - a
double xw = xp - xa;
double yw = yp - ya;
double c1 = dotProduct(xw, yw, xv, yv);
double c2 = dotProduct(xv, yv, xv, yv);
double t = c1 / c2;
if (t < 0) {
t = 0;
} else if (t > 1) {
t = 1;
}
return new Pair<>(xa + t * xv, ya + t * yv);
}
/**
* 计算a-b线段和c-d线段之间的夹角
* @param xa
* @param ya
* @param xb
* @param yb
* @param xc
* @param yc
* @param xd
* @param yd
* @return
*/
public static double angleBetweenLineSegments(double xa, double ya, double xb, double yb, double xc, double yc, double xd, double yd) {
double xv = xb - xa;
double yv = yb - ya;
double xw = xd - xc;
double yw = yd - yc;
double dot = dotProduct(xv, yv, xw, yw);
double mag1 = magnitude(xv, yv);
double mag2 = magnitude(xw, yw);
double cosTheta = dot / (mag1 * mag2);
// 由于反余弦函数的取值范围,需要对结果进行调整
if (cosTheta > 1) {
cosTheta = 1;
} else if (cosTheta < -1) {
cosTheta = -1;
}
double angleInRadians = Math.acos(cosTheta);
return Math.toDegrees(angleInRadians);
}
/**
* 逆时针旋转到90度(和地图坐标系正北为0顺指针的方向相反)
* @param angle
* @return
*/
public static double rotateTo90(double angle) {
double difference = angle - 90;
if (difference < 0) {
difference += 360;
}
return difference;
}
}