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