ningshuxia
2025-03-28 ce9752fd657c6689ea64929eb962146e2730624e
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
namespace PBS.WinFrmUI.Hydro
{
    public class AmapBoundsHelper
    {
        public class Coordinate
        {
            public Coordinate(double lat, double lon)
            {
                this.lat = lat;
                this.lon = lon;
            }
 
            /// <summary>
            /// 纬度
            /// </summary>
            public double lat { get; set; }
 
            /// <summary>
            /// 经度
            /// </summary>
            public double lon { get; set; }
 
        }
 
        public static (double Width, double Height) CalcSize(Yw.Model.Map.Point southWest, Yw.Model.Map.Point northEast)
        {
            double lat = northEast.Y;
            double lon = northEast.X;
 
            //右上角坐标
            Coordinate coordinate1 = new Coordinate(lat, lon);
 
            double lat2 = southWest.Y;
            double lon2 = southWest.X;
 
            //左下角坐标
            Coordinate coordinate2 = new Coordinate(lat2, lon2);
 
 
            //右下角坐标
            Coordinate coordinate3 = new Coordinate(coordinate1.lat, coordinate2.lon);
 
            //左上角坐标
            Coordinate coordinate4 = new Coordinate(coordinate2.lat, coordinate1.lon);
    
            double distanceWidth = Distance(coordinate1, coordinate3);
            double distanceHeight = Distance(coordinate1, coordinate4);
 
            return (distanceWidth,distanceHeight);
        }
 
        public static double Distance(Coordinate coordinate1, Coordinate coordinate2)
        {
            var a = coordinate1;
            var lat1 = a.lat;
            var lon1 = a.lon;
            var b = coordinate2;
            var lat2 = b.lat;
            var lon2 = b.lon;
 
            if (lat1 == lat2 && lon1 == lon2)
            {
                return 0;
            }
 
            a.lon = VC(a.lon, -180, 180);
            a.lat = aD(a.lat, -74, 74);
            b.lon = VC(b.lon, -180, 180);
            b.lat = aD(b.lat, -74, 74);
            double ret;
            ret = JF(JK(a.lon), JK(b.lon), JK(a.lat), JK(b.lat));
            return ret;
        }
 
 
        public static double aD(double a, double b, double c)
        {
            if (b != null)
            {
                a = Math.Max(a, b);
            }
            if (b != null)
            {
                a = Math.Min(a, c);
            }
            return a;
        }
        public static double VC(double a, double b, double c)
        {
            if (a > c)
            {
                a -= c - b;
            }
            if (a < b)
            {
                a += c - b;
            }
            return a;
        }
        public static double JK(double a)
        {
            double ret = Math.PI * a / 180.0;
            return ret;
        }
        public static double JF(double a, double b, double c, double e)
        {
            const double Ou = 6370996.81;
            return Ou * Math.Acos(Math.Sin(c) * Math.Sin(e) + Math.Cos(c) * Math.Cos(e) * Math.Cos(b - a));
        }
 
    }
 
}