wenzheng.yang
2023-04-27 31e64e0e144815e6176c1b6b81eae8dc68688570
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
var a = 6378.137;
var e = 0.0818192;
var k0 = 0.9996;
var e2 = e * e; //e的平方
var e4 = e2 * e2; //e的4次方
var e6 = e4 * e2; //e的6次方
var E0 = 500;
var N0 = 0;
 
/**经纬度转XY的方法
 *String lon经度
 *String lat纬度 
 */
export function gps2xybiandianzhan(yuandianjd, yuandianwd, lon, lat) {
    // var yuandianjd = Dell_JZGGA.getYuandianjd(); //原点的经度
    // var yuandianwd = Dell_JZGGA.getYuandianwd(); //原点的纬度
    var xy = run_gps2xyurt(yuandianwd, yuandianjd, lat, lon);
    return xy;
}
/**将实时经纬度转为XY坐标输出
 *@param 原点纬度lat0
 * @param 原点经度lon0
 * @param lat 时时纬度
 * @param lon 时时经度
 */
function run_gps2xyurt(lat0, lon0, lat, lon) {
    var realxy = new Array(2).join(',').split(',');
    var xycs = initiize_ublox_zeropoint(lat0, lon0, 0);
    var x0 = xycs[0];
    var y0 = xycs[1];
    var c = xycs[2];
    var s = xycs[3];
 
    var xy = new Array(2).join(',').split(',');
    var x = ubloxraw2xy(lat, lon)[0] - x0;
    var y = ubloxraw2xy(lat, lon)[1] - y0;
    xy[0] = c * x - s * y;
    xy[1] = s * x + c * y;
 
    var x1 = xy[1] * 100;
    var y1 = xy[0] * 100;
 
    realxy[0] = x1;
    realxy[1] = y1;
    return realxy;
}
/**初始化原点位置和方向
 * 输出原点以米为单位的xy坐标, cos值, sin值*/
function initiize_ublox_zeropoint(lat, lon, th) {
    var xycs = new Array(4).join(',').split(',');
    xycs[0] = ubloxraw2xy(lat, lon)[0];
    xycs[1] = ubloxraw2xy(lat, lon)[1];
    var th1 = th * Math.PI / 180; //x轴与正北方向夹角th(单位是度)
    xycs[2] = Math.cos(th1);
    xycs[3] = Math.sin(th1);
    return xycs;
}
/**输入ublox的度分经纬度,输出xy,单位米*/
function ubloxraw2xy(lat, lon) {
    var xy = new Array(3).join(',').split(',');
    var lond = ublox_dm2d(lon);
    var latd = ublox_dm2d(lat);
    var dxy = utm(latd, lond);
    xy[0] = dxy[0] * 1000;
    xy[1] = dxy[1] * 1000;
    xy[2] = dxy[2];
    return xy;
 
}
/**将度分格式数据转为度格式输出*/
function ublox_dm2d(ddmm_dot_m) {
    var d0 = Math.floor(ddmm_dot_m / 100);
    var d = d0 + (ddmm_dot_m - d0 * 100) / 60;
    return d;
}
/**通过经纬度获取XY坐标*/
function utm(lat, lon) {
    var dxy = new Array(3).join(',').split(',');
 
    var zonenum1 = lon / 6;
    //floor是地板的意思,表示向下取整
    if (zonenum1 > 0) {
        zonenum1 = Math.floor(zonenum1);
    } else { //向上取整
        zonenum1 = Math.ceil(zonenum1); //向上取整
    }
 
    var Zonenum = zonenum1 + 31;
 
    var lambda0 = ((Zonenum - 1) * 6 - 180 + 3) * (Math.PI) / 180;
 
    var phi = lat * (Math.PI) / 180;
 
    var lambda = lon * (Math.PI) / 180;
 
    var v = 1 / Math.sqrt((1 - e2 * Math.pow(Math.sin(phi), 2)));
 
    var A = (lambda - lambda0) * Math.cos(phi);
    var A2 = A * A;
    var A3 = A2 * A;
    var A4 = A3 * A;
    var A5 = A4 * A;
    var A6 = A5 * A;
 
    var T = Math.tan(phi) * Math.tan(phi);
    var T2 = T * T;
 
    var C = e2 * Math.cos(phi) * Math.cos(phi) / (1 - e2);
    var C2 = C * C;
 
    var s = (1 - e2 / 4 - 3 * e4 / 64 - 5 * e6 / 256) * phi -
        (3 * e2 / 8 + 3 * e4 / 32 + 45 * e6 / 1024) * Math.sin(2 * phi) +
        (15 * e4 / 256 + 45 * e6 / 1024) * Math.sin(4 * phi) - 35 * e6 / 3072 * Math.sin(6 * phi);
 
    dxy[0] = E0 + k0 * a * v * (A + (1 - T + C) * A3 / 6 + (5 - 18 * T + T2) * A5 / 120);
 
    dxy[1] = N0 + k0 * a * (s + v * Math.tan(phi) * (A2 / 2 + (5 - T + 9 * C + 4 * C2) * A4 / 24 + (61 - 58 * T + T2) *
        A6 / 720));
    dxy[2] = Zonenum;
    return dxy;
}
 
/** 
 * 判断点是否在多边形内 
 * @param point 检测点 
 * @param pts   多边形的顶点集合 
 * @return 点在多边形内返回true,否则返回false 
 */
export function inPoly(point, pts) {
    var N = pts.length;
    var boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true  
    var intersectCount = 0;
    var precision = 2e-10; //浮点类型计算时候与0比较时候的容差  
    var p1, p2;
    var p = point; //当前点  
 
    p1 = pts[0];
    for (var i = 1; i <= N; ++i) {
        if (p == p1) {
            return boundOrVertex;
        }
        p2 = pts[i % N];
        if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) {
            p1 = p2;
            continue;
        }
 
        if (p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)) {
            if (p.y <= Math.max(p1.y, p2.y)) {
                if (p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) {
                    return boundOrVertex;
                }
 
                if (p1.y == p2.y) {
                    if (p1.y == p.y) {
                        return boundOrVertex;
                    } else {
                        ++intersectCount;
                    }
                } else {
                    var xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;
                    if (Math.abs(p.y - xinters) < precision) {
                        return boundOrVertex;
                    }
 
                    if (p.y < xinters) {
                        ++intersectCount;
                    }
                }
            }
        } else {
            if (p.x == p2.x && p.y <= p2.y) {
                var p3 = pts[(i + 1) % N];
                if (p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) {
                    ++intersectCount;
                } else {
                    intersectCount += 2;
                }
            }
        }
        p1 = p2;
    }
 
    if (intersectCount % 2 == 0) {
        return false;
    } else {
        return true;
    }
 
}