xieb
2024-04-01 891ac00aaae4434027de3544356b94f6012b3f3e
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.dji.sample.patches.utils;
 
import com.dji.sample.patches.model.entity.LotInfo;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
 
import java.util.*;
 
/**
 * @PROJECT_NAME: drone
 * @DESCRIPTION:
 * @USER: aix
 * @DATE: 2024/3/25 10:35
 */
public class GeoToolsUtil {
 
    /**
     * 获取中心点位置
     *
     * @param geometry Geometry
     * @return
     */
    public static Coordinate getCentro(Geometry geometry) {
        return geometry.getCentroid().getCoordinate();
    }
 
    /**
     * 获取4个点的经纬度
     *
     * @param geometry Geometry
     * @return
     */
    public static List<Coordinate> getExtremePoints(Geometry geometry) {
        List<Coordinate> extremePoints = new ArrayList<>();
 
        Envelope envelope = geometry.getEnvelopeInternal();
 
        // 获取4个点经纬度
        extremePoints.add(new Coordinate(envelope.getMinX(), envelope.getMaxY()));
        extremePoints.add(new Coordinate(envelope.getMinX(), envelope.getMinY()));
        extremePoints.add(new Coordinate(envelope.getMaxX(), envelope.getMinY()));
        extremePoints.add(new Coordinate(envelope.getMaxX(), envelope.getMaxY()));
 
        return extremePoints;
    }
 
    /**
     * 航线点排序
     *
     * @return
     */
    public static Coordinate [] getRoutePointOrder(List<LotInfo> list) {
        List<Coordinate> centros = new ArrayList<>();
        List<List<Coordinate>> extremePoints = new ArrayList<>();
        Map<Coordinate,List<Coordinate>> points = new HashMap<>();
        list.forEach(patche -> {
            String wkt = patche.getDkfw();
            // 解析WKT字符串为多边形
            WKTReader wktReader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
            Geometry polygon = null;
            try {
                polygon = wktReader.read(wkt);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
 
            // 开始封装中心点坐标
            Coordinate coordinateCentro = getCentro(polygon);
            centros.add(coordinateCentro);
 
            // 开始封装图斑4个航线
            List<Coordinate> coordinatePointList = getExtremePoints(polygon);
            extremePoints.add(coordinatePointList);
            points.put(coordinateCentro,coordinatePointList);
 
        });
 
        // 开始排序
        // 机场经纬度
        double airportLat = 28.624514734; // 机场纬度
        double airportLon = 115.856725497; // 机场经度
        Coordinate [] coordinates = new Coordinate[centros.size() + 1];
        List<Coordinate> coordinateList = new ArrayList<>();
        coordinates[0] = new Coordinate(airportLon, airportLat); //第一个为机场经纬度
        coordinateList.add(new Coordinate(airportLon, airportLat)); //第一个为机场经纬度)
        for (int i = 1; i < centros.size() + 1; i++) {
            coordinates[i] = centros.get(i-1);
            coordinateList.add(centros.get(i-1));
        }
 
        // 对中心坐标数组进行排序
        Coordinate[] retCoordinate = new Coordinate[coordinateList.size()];
        Coordinate[] sortedCoordinates = DistanceCalculator.sortByDistance(coordinateList, airportLat, airportLon, 0,retCoordinate);
 
        // 开始拼接图斑点位--按中心坐标数组排序顺序
        // 长度-3第一个起点只有一个点位
        Coordinate[] retc = new Coordinate[sortedCoordinates.length * 4 - 3];
        // 赋值起点
        retc[0] = sortedCoordinates[0];
        int i = 0;
        for (Coordinate num : sortedCoordinates) {
            List<Coordinate> coordinatePoints = points.get(num);
            if (null != coordinatePoints) {
                for (int j = 0; j < coordinatePoints.size(); j++) {
                    // 开始拼接
                    retc[i * coordinatePoints.size() + j - 3] = coordinatePoints.get(j);
                }
            }
 
            i++;
        }
 
        return retc;
 
 
    }
 
 
    public static void main(String[] args) {
        //测试
        List<LotInfo> list = new ArrayList<>();
        list.add(LotInfo.builder().dkfw("POLYGON((115.866465564947 28.6344502965542, 115.86425430209 28.6357383285408, 115.864551734716 28.633120921433, 115.866977149064 28.6338435339976, 115.866465564947 28.6344502965542))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.864006690605 28.6202713913694, 115.86002109342 28.6162025130492, 115.866374254306 28.6142037658042, 115.865912044006 28.6172001020759, 115.864006690605 28.6202713913694))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.839366933455 28.6161999317332, 115.841288489469 28.6160843601496, 115.840931570318 28.6181544912247, 115.838147600941 28.618654178036, 115.839366933455 28.6161999317332))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.857499052697 28.6784702230642, 115.859109158101 28.6762273976226, 115.863677723232 28.6766081113836, 115.862154868188 28.6790827508297, 115.857499052697 28.6784702230642))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.834974056705 28.6659171428962, 115.833760531592 28.6634960413229, 115.832422084777 28.6624550271329, 115.829745191145 28.6631986086972, 115.831232354274 28.6608191476914, 115.833314382654 28.6603729987527, 115.835545127347 28.6618601618814, 115.837032290475 28.6639421902615, 115.834974056705 28.6659171428962))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.885622116006 28.5766308429787, 115.883936664461 28.5771582901683, 115.883365593819 28.5752547213636, 115.883555950699 28.5740174016407, 115.88365112914 28.5724945465969, 115.885364341064 28.5721138328361, 115.886696839227 28.5725897250371, 115.887458266749 28.5736366878797, 115.886792017668 28.5753498998039, 115.885622116006 28.5766308429787))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.857644341395 28.5750890964568, 115.857572957565 28.5729475815515, 115.858429563527 28.5728761977213, 115.859072017998 28.5738041875136, 115.859072017998 28.5748035611361, 115.857644341395 28.5750890964568))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.912181587649 28.6231542087745, 115.912181587649 28.6215123806805, 115.915893546818 28.6212268453598, 115.916036314478 28.6231542087745, 115.912181587649 28.6231542087745))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.842039042965 28.6314426646115, 115.840992080122 28.631252307731, 115.842324578286 28.6305860586493, 115.843181184248 28.6305860586493, 115.84403779021 28.6304908802091, 115.84394261177 28.6317281999322, 115.842039042965 28.6314426646115))").build());
        list.add(LotInfo.builder().dkfw("POLYGON((115.807011889796 28.623935465138, 115.805869748513 28.6224126100944, 115.810247956764 28.6220318963334, 115.809581707682 28.623935465138, 115.807011889796 28.623935465138))").build());
 
        getRoutePointOrder(list);
    }
 
}