yzt
2023-05-05 4c558c77a6a9d23f057f094c4dc3e315eabef497
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
package com.hxzkoa.udp;
 
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
 
import com.hxzkoa.json.tb_system;
import com.hxzkoa.util.Config;
import com.hxzkoa.util.HttpUtil;
 
import net.sf.json.JSONObject;
 
public class GnssToxy {
    
    static String postUrl = Config.getPostUrl();
    static String url_sysSetting_bw = postUrl + "sysSetting_bw.do";
    
        static  double a=6378.137;//地球半径
        static  double e=0.0818192;//地球曲率
        static  double k0=0.9996; 
        static double e2=e*e;//e的平方
        static double e4=e2*e2;//e的4次方
        static double e6=e4*e2;//e的6次方
        static double E0=500;
        static double N0=0; 
 
        /**通过经纬度获取XY坐标*/
        public static double[] utm(double lat,double lon) {
            double[] dxy=new double[2];
 
            double zonenum1=lon/6;      
            //floor是地板的意思,表示向下取整
            if(zonenum1>0) {
                zonenum1=Math.floor(zonenum1);
            }else {//向上取整
                zonenum1=Math.ceil(zonenum1);//向上取整
            }
 
            double Zonenum=zonenum1+31;
 
            double lambda0=((Zonenum-1)*6-180+3)*(Math.PI)/180;
 
            double phi=lat*(Math.PI)/180;
 
            double lambda=lon*(Math.PI)/180;
 
            double v=1/Math.sqrt((1-e2*Math.pow(Math.sin(phi),2)));
 
            double A=(lambda-lambda0)* Math.cos(phi); 
            double A2=A*A;
            double A3=A2*A;
            double A4=A3*A;
            double A5=A4*A; 
            double A6=A5*A; 
 
            double T=Math.tan(phi)* Math.tan(phi); 
            double T2=T*T;
 
            double C=e2* Math.cos(phi)* Math.cos(phi)/(1-e2); 
            double C2=C*C; 
 
            double 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));
 
            return dxy;     
        }
 
 
        /**将度分格式数据转为度格式输出*/
        public static double ublox_dm2d(double ddmm_dot_m) {
            double d0=Math.floor(ddmm_dot_m/100);
            double d=d0+(ddmm_dot_m-d0*100)/60;
            return d;
        }
        
 
        /**初始化原点位置和方向
         * 输出原点以米为单位的xy坐标, cos值, sin值*/
        public static double[] initiize_ublox_zeropoint(double lat, double lon, double th){
            double[] xycs=new double[4];
            xycs[0]=ubloxraw2xy(lat,lon)[0];
            xycs[1]=ubloxraw2xy(lat,lon)[1];
            double th1=th*Math.PI/180;//x轴与正北方向夹角th(单位是度)
            xycs[2]=Math.cos(th1);
            xycs[3]=Math.sin(th1);      
            return xycs;
        }
        
        
        
        /**输入ublox的度分经纬度,输出xy,单位米*/
        public static double[] ubloxraw2xy(double lat, double lon) {
            double[] xy=new double[2];
            double lond = ublox_dm2d(lon);
            double latd = ublox_dm2d(lat);
            double[] dxy = utm(latd, lond); 
            xy[0]= dxy[0]* 1000;
            xy[1]= dxy[1]* 1000;
            return xy;
            
        }
        
        /**将实时经纬度转为XY坐标输出
         * @param lat 纬度
         * @param lon 经度
         * @param 原点纬度X0
         * @param 原点经度y0*/
        public int[] run_gps2xy(String tagid,double lat, double lon, double xzb, double yzb, double jia) {      
            
            int[] realxy=new int[2];
            double[] xycs=initiize_ublox_zeropoint(xzb, yzb, jia);
            
            double x0=xycs[0];
            double y0=xycs[1];
            double c=xycs[2];
            double s=xycs[3];
            
            double[] xy=new double[2];
            double x= ubloxraw2xy(lat,lon)[0]-x0;
            double y=ubloxraw2xy(lat,lon)[1]-y0;
            xy[0] =c*x - s*y;
            xy[1] =s*x + c*y;
            
            double x1=xy[1]*100;
            double y1=xy[0]*100;
            
            realxy[0]=(int)x1;
            realxy[1]=(int)y1;
                     
            return realxy;      
        }
}