From 1436df91f0312682a8f182fbc7127a038cdb71f7 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 25 Apr 2023 17:40:18 +0800 Subject: [PATCH] =?UTF-8?q?[charter]=20[3.2.0]=20[=E6=9B=B4=E7=B2=BE?= =?UTF-8?q?=E7=A1=AE=E7=9A=84=E7=AE=97=E8=A7=92=E5=BA=A6]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/CoordinateCalculateRouteUtil.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java index df36d2f672..8e6fec362b 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java @@ -14,6 +14,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import kotlin.Triple; import mogo.telematics.pad.MessagePad; /** @@ -340,4 +341,56 @@ public class CoordinateCalculateRouteUtil { //弧度转角度制 return (int) (180 * radian / Math.PI); } + + + private static Triple ball2xyz(Double thera,Double fie,Double r){ + double x = r * Math.cos(thera) * Math.cos(fie); + double y = r * Math.cos(thera) * Math.sin(fie); + double z = r * Math.sin(thera); + return new Triple(x,y,z); + } + + /** + * https://blog.csdn.net/reborn_lee/article/details/82497577 + * 将地理经纬度转换成笛卡尔坐标系 + */ + private static Triple geo2xyz(double lat,double lng){ + double thera = (Math.PI * lat) / 180; + double fie = (Math.PI * lng) / 180; + return ball2xyz(thera, fie,6400.0); + } + + /** + * 计算3个地理坐标点之间的夹角 + * @param l1 顶点坐标 + * @param l2 + * @param l3 + * @return l1为顶点的角度 精度没有angleOflocation高 + */ + public static double getDegree(LatLng l2,LatLng l1,LatLng l3) { + Triple p1 = geo2xyz(l1.latitude,l1.longitude); + Triple p2 = geo2xyz(l2.latitude,l2.longitude); + Triple p3 = geo2xyz(l3.latitude,l3.longitude); + + double x1 = p1.getFirst(); + double y1 = p1.getSecond(); + double z1 = p1.getThird(); + + double x2 = p2.getFirst(); + double y2 = p2.getSecond(); + double z2 = p2.getThird(); + + double x3 = p3.getFirst(); + double y3 = p3.getSecond(); + double z3 = p3.getThird(); + + // 计算向量 P2P1 和 P2P3 的夹角 https://www.zybang.com/question/3379a30c0dd3041b3ef966803f0bf758.html + double p1P2 = Math.sqrt(Math.pow(x2 - x1,2.0) + Math.pow(y2 - y1,2.0) + Math.pow(z2 - z1,2.0)); + double p2p3 = Math.sqrt(Math.pow(x3 - x2,2.0) + Math.pow(y3 - y2,2.0) + Math.pow(z3 - z2,2.0)); + + double p = (x1 - x2) * (x3 - x2) + (y1 - y2) * (y3 - y2) + (z1 - z2) * (z3 - z2); //P2P1*P2P3 + + return (Math.acos(p / (p1P2 * p2p3)) / Math.PI) * 180; + } + }