[6.5.0][Feat]新增行程总览功能
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user