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; } }