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() {
|
|
}
|
|
}
|