package com.hxzkappboot.util; import java.text.DecimalFormat; import static java.util.Locale.US; public class GnssToXY { 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; // static String floor="0"; static double lat_a =0;//原点的纬度 static double lon_a =0;//原点的经度 static double lon_b=0;//B点经度 static double lat_b=0;//B点纬度 static double xa=0; //A点X坐标 static double ya=0;//A点Y坐标 static double xb=0;//B点X坐标 static double yb=0;//B点Y坐标 static int k=0; static int sizes=2; // static double[] xycs=null; // static double utme0; // static double utmn0; // static double c; // static double s; // static double t; // static double f; static DecimalFormat df = new DecimalFormat("0.0000000"); static int baoxu=1; static { //Map_Dell.get_foor_xycs(); // String ya1=Map_Dell.getAjwxy(); // String yb1=Map_Dell.getBjwxy(); // if(ya1 !=null && yb1 !=null) { // String[] A=ya1.split(";"); // String[] B=yb1.split(";"); // lon_a=Double.parseDouble(A[0]);//经度 // lat_a=Double.parseDouble(A[1]);//纬度 // sizes=A.length; // if(A.length==4) { // xa=Double.parseDouble(A[2]); // ya=Double.parseDouble(A[3]); // }else if(A.length==2){ // xa=0; // ya=0; // } // // if(B.length==4) { // lon_b=Double.parseDouble(B[0]);//经度 // lat_b=Double.parseDouble(B[1]);//纬度 // xb=Double.parseDouble(B[2]); // yb=Double.parseDouble(B[3]); // xycs=initiize_ublox_AB(lat_a, lon_a,lat_b, lon_b,xb,yb); // if(sizes==4) { // xycs=initiize_ublox_AB2(lat_a, lon_a,lat_b, lon_b,xa,ya,xb,yb); // utme0=xycs[0]; // utmn0=xycs[1]; // c=xycs[2]; // s=xycs[3]; // t=xycs[4]; // f=xycs[5]; // } // // }else { // ShowMessage.zidingyi_24("B点经纬度正确"); // } // }else { // ShowMessage.zidingyi_24("tb_mab字段baoliu1和boaliu2不能为null"); // } // } /**通过经纬度获取XY坐标*/ public static double[] utm(double lat,double lon) { double[] dxy=new double[3]; 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)); dxy[2]=Zonenum; return dxy; } /** * 将度分格式数据转为度格式输出 * @param ddmm_dot_m 度分格式经纬度数据 * @return 度格式数据 */ 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; } /**将度分格式数据转为度格式输出*/ public static String ublox_dm2dstr(double ddmm_dot_m) { double d0=Math.floor(ddmm_dot_m/100); double d=d0+(ddmm_dot_m-d0*100)/60; String a=df.format(d); return a; } /**初始化原点位置和方向 * 输出原点以米为单位的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; } public static double[] initiize_ublox_AB( double lat0, double lon0, double latB, double lonB, double xB, double yB){ double[] xycstf=new double[6]; double[] a = ubloxraw2xy(lat0, lon0); double[] b = ubloxraw2xy(latB, lonB); double[] ab=new double[2]; ab[0] = b[0] - a[0]; ab[1] = b[1] - a[1]; double the=Math.atan2(ab[0], ab[1]); double thp=Math.atan2(yB, xB); double th=the-thp; double c=Math.cos(th); double s=Math.sin(th); double th_deg=th*180/Math.PI; xycstf[0]=a[0]; xycstf[1]=a[1]; xycstf[2]=c; xycstf[3]=s; xycstf[4]=th_deg; xycstf[5]=a[2]; return xycstf; } public static double[] initiize_ublox_AB2( double lat0, double lon0, double latB, double lonB, double xA1, double yA1, double xB1, double yB1){ double xA=xA1/100; double yA=yA1/100; double xB=xB1/100; double yB=yB1/100; double[] xycstf=new double[6]; double[] a = ubloxraw2xy(lat0, lon0); double[] b = ubloxraw2xy(latB, lonB); double[] ab=new double[2]; ab[0] = b[0] - a[0]; ab[1] = b[1] - a[1]; double[] AB=new double[2]; AB[0] = xB -xA; AB[1] = yB- yA; double the=Math.atan2(ab[0], ab[1]); double thp=Math.atan2(AB[1], AB[0]); double th=the-thp; double c=Math.cos(th); double s=Math.sin(th); double th_deg=th*180/Math.PI; double xap= c*yA + s*xA; double yap=-s*yA + c*xA; xycstf[0]=a[0]-xap; xycstf[1]=a[1]-yap; xycstf[2]=c; xycstf[3]=s; xycstf[4]=th_deg; xycstf[5]=a[2]; return xycstf; } /**输入ublox的度分经纬度,输出xy,单位米*/ public static double[] ubloxraw2xy(double lat, double lon) { double[] xy=new double[3]; double[] dxy = utm(lat, lon); xy[0]= dxy[0]* 1000; xy[1]= dxy[1]* 1000; xy[2]= dxy[2]; return xy; } public static double stringToDouble(String a){ double b = Double.valueOf(a); DecimalFormat df = new DecimalFormat("#.0");//此为保留1位小数,若想保留2位小数,则填写#.00 ,以此类推 String temp = df.format(b); b = Double.valueOf(temp); return b; } /** * 经纬度转XY坐标 * @param A A[0]经度,A[1]纬度,A[2]x,A[3]y * @param B B[0]经度,B[1]纬度,B[2]x,B[3]y * @param jd1 经度 * @param wd1 维度 * @return */ public static int[] gps_xy( String[] A, String[] B, String jd1, String wd1) { double lon_a1=Double.parseDouble(A[0]);//经度 double lat_a1=Double.parseDouble(A[1]);//纬度 double xa1=0; double ya1=0; int size2=A.length; if(size2==4) { xa1=Double.parseDouble(A[2]); ya1=Double.parseDouble(A[3]); } double lon_b1=Double.parseDouble(B[0]);//经度 double lat_b1=Double.parseDouble(B[1]);//纬度 double xb1=Double.parseDouble(B[2]); double yb1=Double.parseDouble(B[3]); double lat=Double.parseDouble(wd1); double lon=Double.parseDouble(jd1); int[] realxy=new int[2]; double[] xycs=initiize_ublox_AB(lat_a1, lon_a1,lat_b1, lon_b1,xb1,yb1); if(size2==4) { xycs=initiize_ublox_AB2(lat_a1, lon_a1,lat_b1, lon_b1,xa1,ya1,xb1,yb1); } 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; } /**计算2个经纬度之间的距离*/ public static int distance(String jd0,String wd0,String jd1,String wd1) { int dis=0; double lat_x0 =Double.parseDouble(wd0); //原点的经度 double lon_y0 =Double.parseDouble(jd0); if (jd1==null||wd1==null){ return 999999999; } double lat=Double.parseDouble(wd1); double lon=Double.parseDouble(jd1); double[] xycs=initiize_ublox_zeropoint(lat_x0, lon_y0,0); 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 disd=Math.sqrt(xy[0]*xy[0]+xy[1]*xy[1])*100; dis=(int)disd; return dis; } /**计算2个经纬度之间的距离*/ public static int distance2(double lon_y0,double lat_x0,double lon,double lat) { int dis=0; double[] xycs=initiize_ublox_zeropoint(lat_x0, lon_y0,0); 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 disd=Math.sqrt(xy[0]*xy[0]+xy[1]*xy[1])*100; dis=(int)disd; return dis; } /**URT模式下经纬度转XY*/ public static int[] run_gps2xyurt( double lat0, double lon0, double lat, double lon) { int[] realxy=new int[2]; double[] xycs=initiize_ublox_zeropoint(lat0, lon0,0); 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; } /**计算2个经纬度的距离*/ public static double disab(String jwd) { String[] bb=jwd.split(";"); double jd0=Double.parseDouble(bb[1]); double wd0=Double.parseDouble(bb[0]); double jd1=Double.parseDouble(bb[3]); double wd1=Double.parseDouble(bb[2]); int[] a=run_gps2xyurt(wd0,jd0,wd1,jd1); double disa=a[0]*a[0]+a[1]*a[1]; double dis=Math.sqrt(disa); // System.out.println(jwd+"的距离是:"+dis); return dis; } /**将度分秒格式转为度格式*/ public static String todufen(String Du,String Fen,String Miao){ Float strDu = Float.valueOf(Du); Float strFen = Float.valueOf(Fen) / 60; Float strMiao = Float.valueOf(Miao) / 60; Float dufenmiao = strDu+strFen+strMiao; String format = String .format(US,"%.6f", dufenmiao); return format; } /**变电站模式下经纬度转XY,绘制围栏第一个点做为坐标原点 *String weidu经度 *String jingdu, *String gps_state 经度状态*/ /**变电站模式下确定原点经纬度 * gao 围栏开始绘制时候的高度*/ public static double getLat_a() { return lat_a; } public static void setLat_a(double lat_a) { GnssToXY.lat_a = lat_a; } public static double getLon_a() { return lon_a; } public static void setLon_a(double lon_a) { GnssToXY.lon_a = lon_a; } public static double getLon_b() { return lon_b; } public static void setLon_b(double lon_b) { GnssToXY.lon_b = lon_b; } public static double getLat_b() { return lat_b; } public static void setLat_b(double lat_b) { GnssToXY.lat_b = lat_b; } public static double getXa() { return xa; } public static void setXa(double xa) { GnssToXY.xa = xa; } public static double getYa() { return ya; } public static void setYa(double ya) { GnssToXY.ya = ya; } public static double getXb() { return xb; } public static void setXb(double xb) { GnssToXY.xb = xb; } public static double getYb() { return yb; } public static void setYb(double yb) { GnssToXY.yb = yb; } // public static double getUtme0() { // return utme0; // } // // // public static double getC() { // return c; // } // // // public static double getS() { // return s; // } // // // public static double getT() { // return t; // } // // // public static double getF() { // return f; // } // // // public static double getUtmn0() { // return utmn0; // } }