feiyu02
2025-01-08 cf4a07510de9b954c3f7393d54206eece7d6ad4a
1. 新增卫星遥测正方形网格顶点计算逻辑
已修改1个文件
已添加1个文件
131 ■■■■■ 文件已修改
src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/common/utils/MapUtil.kt 66 ●●●●● 补丁 | 查看 | 原始文档 | 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;
        }
    }
}