src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/common/utils/MapUtil.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,65 @@ package com.flightfeather.uav.biz.satellite import com.flightfeather.uav.common.utils.MapUtil import kotlin.math.sqrt /** * 嫿饿µç½æ ¼ç®¡ç * æ ¹æ®ç½æ ¼ä¸å¿ç¹è®¡ç®4个顶ç¹åæ * æ ¹æ®å·²æç½æ ¼è¿è¡ç»åç½æ ¼è®¡ç® * @date 2025/1/8 * @author feiyu02 */ class SatelliteGridManage { /** * æ ¹æ®æ£æ¹å½¢ç½æ ¼ä¸å¿ç¹åæ ï¼è®¡ç®4个顶ç¹åæ */ fun calGridVertex(points:List<Pair<Double, Double>>):List<Array<Pair<Double, Double>>> { if (points.size < 2) return emptyList() val p1 = points[0]; val p2 = points[1]; // 两ä¸å¿ç¹é´çè§åº¦ val angle = MapUtil.getAngle(p1.first, p1.second, p2.first, p2.second); // 两ä¸å¿ç¹é´çè·ç¦» val dis = MapUtil.getDistance(p1.first, p1.second, p2.first, p2.second); // ç½æ ¼æ£æ¹å½¢å¯¹è§çº¿çä¸åé¿åº¦ val halfDiagonal = sqrt((dis / 2) * (dis / 2) * 2); // 计ç®é¦ä¸ªæ£æ¹å½¢åé¡¶ç¹ç¸å¯¹äºä¸å¿ç¹çè§åº¦ï¼å¾å°æ£æ¹å½¢åé¡¶ç¹çåæ val angle1 = MapUtil.plusAngle(angle, 45.0); val gp1 = MapUtil.getPointByLen(p1, halfDiagonal, angle1); val angle2 = MapUtil.plusAngle(angle1, 90.0); val gp2 = MapUtil.getPointByLen(p1, halfDiagonal, angle2); val angle3 = MapUtil.plusAngle(angle2, 90.0); val gp3 = MapUtil.getPointByLen(p1, halfDiagonal, angle3); val angle4 = MapUtil.plusAngle(angle3, 90.0); val gp4 = MapUtil.getPointByLen(p1, halfDiagonal, angle4); // 计ç®4个顶ç¹åå«ä¸ä¸å¿ç¹çç»çº¬åº¦å·®å¼ val dx1 = gp1.first - p1.first val dy1 = gp1.second - p1.second val dx2 = gp2.first - p1.first val dy2 = gp2.second - p1.second val dx3 = gp3.first - p1.first val dy3 = gp3.second - p1.second val dx4 = gp4.first - p1.first val dy4 = gp4.second - p1.second // å¾å°æææ£æ¹å½¢ç½æ ¼ç4个顶ç¹ä¿¡æ¯ return points.map { p-> arrayOf( p.first + dx1 to p.second + dy1, p.first + dx2 to p.second + dy2, p.first + dx3 to p.second + dy3, p.first + dx4 to p.second + dy4, ) } } /** * æåç½æ ¼ */ fun splitGrid() { } } src/main/kotlin/com/flightfeather/uav/common/utils/MapUtil.kt
@@ -1,6 +1,7 @@ package com.flightfeather.uav.common.utils import kotlin.math.PI import kotlin.math.asin import kotlin.math.cos import kotlin.math.sin @@ -24,4 +25,69 @@ val lat = (dy / ec + pos.second * PI / 180.0) * 180.0 / PI return Pair(lng, lat) } /** * è·å两个ç»çº¬åº¦ä¹é´çè§åº¦ï¼0度-360åº¦ï¼ */ fun getAngle(lngA: Double, latA: Double, lngB: Double, latB: Double): Double { val a = ((90 - latB) * Math.PI) / 180; val b = ((90 - latA) * Math.PI) / 180; val AOC_BOC = ((lngB - lngA) * Math.PI) / 180; val cosc = cos(a) * Math.cos(b) + Math.sin(a) * Math.sin(b) * Math.cos(AOC_BOC); val sinc = Math.sqrt(1 - cosc * cosc); val sinA = (Math.sin(a) * Math.sin(AOC_BOC)) / sinc; val A = (Math.asin(sinA) * 180) / Math.PI; var res = 0.0; if (lngB > lngA && latB > latA) res = A; else if (lngB > lngA && latB < latA) res = 180 - A; else if (lngB < lngA && latB < latA) res = 180 - A; else if (lngB < lngA && latB > latA) res = 360 + A; else if (lngB > lngA && latB == latA) res = 90.0; else if (lngB < lngA && latB == latA) res = 270.0; else if (lngB == lngA && latB > latA) res = 0.0; else if (lngB == lngA && latB < latA) res = 180.0; return res; } /** * è·å两ç»çº¬åº¦é´çè·ç¦» */ fun getDistance(lng1: Double, lat1: Double, lng2: Double, lat2: Double): Double { // lat1 = lat1 || 0; // lng1 = lng1 || 0; // lat2 = lat2 || 0; // lng2 = lng2 || 0; val rad1 = (lat1 * Math.PI) / 180.0; val rad2 = (lat2 * Math.PI) / 180.0; val a = rad1 - rad2; val b = (lng1 * Math.PI) / 180.0 - (lng2 * Math.PI) / 180.0; val distance = Ea * 2 * asin( Math.sqrt( Math.pow( Math.sin(a / 2), 2.0 ) + Math.cos(rad1) * Math.cos(rad2) * Math.pow(Math.sin(b / 2), 2.0) ) ); return distance; } /** * è§åº¦å¢åï¼ç¡®ä¿è§åº¦å¤äº0 - 360度ä¹é´ * @param angle åè§åº¦ * @param offset åç§»é */ fun plusAngle(angle: Double, offset: Double): Double { val result = angle + offset; return if (result > 360) { result - 360; } else if (result < 0) { result + 360; } else { result; } } }