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