feiyu02
2021-12-30 88ae069fcf657c1790bb04b444e150c06f04e5f6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.flightfeather.uav.lightshare.bean
 
import com.flightfeather.uav.common.utils.MapUtil
import kotlin.math.PI
 
/**
 * 网格化权重分析象限对象
 * 以监测点为网格线的中心的基础上,向外扩散的每一圈网格按照坐标系分为四个象限
 * 每个象限中的网格按照角上的网格作为分界,分成3部分,分别有不同的向外扩散机制
 */
class QuadrantInfo{
 
    val gridsHorizontal = mutableListOf<GridVo>()
    val gridsCorner = mutableListOf<GridVo>()
    val gridsVertical = mutableListOf<GridVo>()
 
    fun new(type: Quadrant, turns: Int, lng: Double, lat: Double, dx: Double, dy: Double) {
        var plusMinusX = 1 // 经度增加或减少
        var plusMinusY = 1 // 纬度增加或减少
        when (type) {
            Quadrant.First -> {
                plusMinusX = 1
                plusMinusY = 1
            }
            Quadrant.Second -> {
                plusMinusX = 1
                plusMinusY = -1
            }
            Quadrant.Third -> {
                plusMinusX = -1
                plusMinusY = -1
            }
            Quadrant.Fourth -> {
                plusMinusX = -1
                plusMinusY = 1
            }
        }
        // 角
        gridsCorner.add(GridVo("$turns-${type.value}-c").apply {
            lb = Pair(lng + turns * dx * plusMinusX, lat + turns * dy * plusMinusY)
            rt = Pair(lb!!.first + dx, lb!!.second + dy)
            ciLongitude = (lb!!.first + dx / 2).toBigDecimal()
            ciLatitude = (lb!!.second + dy / 2).toBigDecimal()
        })
        // 水平方向
        repeat(turns) {
            gridsHorizontal.add(GridVo("$turns-${type.value}-l-$it").apply {
                lb = Pair(lng + it * dx * plusMinusX, lat + turns * dy * plusMinusY)
                rt = Pair(lb!!.first + dx, lb!!.second + dy)
                ciLongitude = (lb!!.first + dx / 2).toBigDecimal()
                ciLatitude = (lb!!.second + dy / 2).toBigDecimal()
            })
        }
        // 垂直方向
        repeat(turns) {
            gridsVertical.add(GridVo("$turns-${type.value}-l-$it").apply {
                lb = Pair(lng + turns * dx * plusMinusX, lat + it * dy * plusMinusY)
                rt = Pair(lb!!.first + dx, lb!!.second + dy)
                ciLongitude = (lb!!.first + dx / 2).toBigDecimal()
                ciLatitude = (lb!!.second + dy / 2).toBigDecimal()
            })
        }
    }
 
    fun next() {
 
    }
}
 
enum class Quadrant(val des: String, val value:Int){
    First("右上象限", 1),
    Second("右下象限", 2),
    Third("左下象限", 3),
    Fourth("左上象限", 4),
}
 
object GridFactory {
 
    // 监测点坐标
    private var lng = .0
    private var lat = .0
    private var dx = .0
    private var dy = .0
 
    /**
     * 设置监测点坐标
     */
    fun setCenter(lng: Double, lat: Double): GridFactory {
        this.lng = lng
        this.lat = lat
        return this
    }
 
    /**
     * 设置网格长度
     * @param len 网格长度(米)
     */
    fun setGridLength(len: Double): GridFactory {
        val center = Pair(lng, lat)
        val p1 = MapUtil.getPointByLen(center, len, PI / 2)//正东方向(90°)的坐标点
        val p2 = MapUtil.getPointByLen(center, len, PI)//正南方向(180°)的坐标点
        this.dx = p1.first - center.first
        this.dy = center.second - p2.second
        return this
    }
 
    /**
     * 新建一圈网格
     * @param turns 圈数(从0开始)
     */
//    fun newGridsByTurns(turns: Int): List<QuadrantInfo> {
//
//    }
}