900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > WGS84地理坐标系和CGCS2000坐标相互转换

WGS84地理坐标系和CGCS2000坐标相互转换

时间:2022-02-01 10:26:00

相关推荐

WGS84地理坐标系和CGCS2000坐标相互转换

1.以下位代码直接调用就可以,中央子午线需要查看网址经纬度中央子午线对照表。需要geotools和opengis和kotlin需要的jar包。下载链接:/s/1AZnt3YHk9CyofYdvgLRaHQ提取码:ak47

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/package org.fh.controller.fhoa;import cn.hutool.core.lang.Tuple;import org.apache.shiro.authz.annotation.RequiresPermissions;import org.geotools.geometry.jts.JTS;import org.geotools.referencing.CRS;import org.geotools.referencing.crs.DefaultGeographicCRS;import org.junit.Test;import org.opengis.geometry.MismatchedDimensionException;import org.opengis.referencing.FactoryException;import org.opengis.referencing.crs.CoordinateReferenceSystem;import org.opengis.referencing.operation.MathTransform;import org.opengis.referencing.operation.TransformException;import kotlin.jvm.internal.Intrinsics;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import javax.validation.constraints.NotNull;import java.awt.geom.Point2D;import java.util.Date;/*** @Description 84坐标转china2000* @Author 未知人员* @Date /8/27 11:21 * @Param * @return **/@Controller@RequestMapping(value="/Geo")public class Geo {private double p = 206264.80624709636D;/**WGS84地理坐标系转换成CGCS2000坐标* @throws Exception*/@RequestMapping(value="/list")@ResponseBodypublic double [] xytolatlon() {double lat ,lon;double Y=612508.8925;//平面坐标Ydouble X=4998860.4083;//平面坐标Xdouble L0=123D;//中央子午线,结合这个网址进行查找,目前用的EPSG:4532中的123D。/view/e219e246e3bd960590c69ec3d5bbfd0a7856d530.htmlY-=500000;double [] result = new double[2];double iPI = 0.0174532925199433;//pi/180double a = 6378137.0; //长半轴 mdouble b = 6356752.31414; //短半轴 mdouble f = 1/298.257222101;//扁率 a-b/adouble e = 0.0818191910428; //第一偏心率 Math.sqrt(5)double ee = Math.sqrt(a*a-b*b)/b; //第二偏心率double bf = 0; //底点纬度double a0 = 1+(3*e*e/4) + (45*e*e*e*e/64) + (175*e*e*e*e*e*e/256) + (11025*e*e*e*e*e*e*e*e/16384) + (43659*e*e*e*e*e*e*e*e*e*e/65536);double b0 = X/(a*(1-e*e)*a0);double c1 = 3*e*e/8 +3*e*e*e*e/16 + 213*e*e*e*e*e*e/2048 + 255*e*e*e*e*e*e*e*e/4096;double c2 = 21*e*e*e*e/256 + 21*e*e*e*e*e*e/256 + 533*e*e*e*e*e*e*e*e/8192;double c3 = 151*e*e*e*e*e*e*e*e/6144 + 151*e*e*e*e*e*e*e*e/4096;double c4 = 1097*e*e*e*e*e*e*e*e/131072;bf = b0 + c1*Math.sin(2*b0) + c2*Math.sin(4*b0) +c3*Math.sin(6*b0) + c4*Math.sin(8*b0); // bf =b0+c1*sin2b0 + c2*sin4b0 + c3*sin6b0 +c4*sin8b0 +...double tf = Math.tan(bf);double n2 = ee*ee*Math.cos(bf)*Math.cos(bf); //第二偏心率平方成bf余弦平方double c = a*a/b;double v=Math.sqrt(1+ ee*ee*Math.cos(bf)*Math.cos(bf));double mf = c/(v*v*v); //子午圈半径double nf = c/v;//卯酉圈半径//纬度计算lat=bf-(tf/(2*mf)*Y)*(Y/nf) * (1-1/12*(5+3*tf*tf+n2-9*n2*tf*tf)*(Y*Y/(nf*nf))+1/360*(61+90*tf*tf+45*tf*tf*tf*tf)*(Y*Y*Y*Y/(nf*nf*nf*nf)));//经度偏差lon=1/(nf*Math.cos(bf))*Y -(1/(6*nf*nf*nf*Math.cos(bf)))*(1+2*tf*tf +n2)*Y*Y*Y + (1/(120*nf*nf*nf*nf*nf*Math.cos(bf)))*(5+28*tf*tf+24*tf*tf*tf*tf)*Y*Y*Y*Y*Y;result[0] =retain6(lat/iPI);result[1] =retain6(L0+lon/iPI);System.out.println(result[1]+","+result[0]);//GetXY(result[0],result[1],6.0D);return result;}private double retain6(double num) {String result = String.format("%.10f", num);//小数点后面保留10位小数return Double.valueOf(result);}/*** CGCS2000坐标转换成WGS84地理坐标系* @param x纬度* @param y经度*/public void xyTowgs84(double x,double y) {double L0 = gaussLongToDegreen(x, y, 6);double a = 6378137.0D;double efang = 0.0066943799901413D;double e2fang = 0.0067394967422764D;y = y - (double)500000;double m0 = 0.0D;double m2 = 0.0D;double m4 = 0.0D;double m6 = 0.0D;double m8 = 0.0D;m0 = a * ((double)1 - efang);m2 = 1.5D * efang * m0;m4 = efang * m2 * 5.0D / 4.0D;m6 = efang * m4 * 7.0D / 6.0D;m8 = efang * m6 * 9.0D / 8.0D;double a0 = 0.0D;double a2 = 0.0D;double a4 = 0.0D;double a6 = 0.0D;double a8 = 0.0D;a0 = m0 + m2 / 2.0D + m4 * 3.0D / 8.0D + m6 * 5.0D / 16.0D + m8 * 35.0D / 128.0D;a2 = m2 / 2.0D + m4 / 2.0D + m6 * 15.0D / 32.0D + m8 * 7.0D / 16.0D;a4 = m4 / 8.0D + m6 * 3.0D / 16.0D + m8 * 7.0D / 32.0D;a6 = m6 / 32.0D + m8 / 16.0D;a8 = m8 / 128.0D;double FBf = 0.0D;double Bf0 = x / a0;for(double Bf1 = 0.0D; Bf0 - Bf1 >= 1.0E-4D; Bf0 = (x - FBf) / a0) {Bf1 = Bf0;FBf = -a2 * Math.sin((double)2 * Bf0) / (double)2 + a4 * Math.sin((double)4 * Bf0) / (double)4 - a6 * Math.sin((double)6 * Bf0) / (double)6 + a8 * Math.sin((double)8 * Bf0) / (double)8;}double Wf = Math.sqrt((double)1 - efang * Math.sin(Bf0) * Math.sin(Bf0));double Nf = a / Wf;double Mf = a * ((double)1 - efang) / Math.pow(Wf, 3.0D);double nffang = e2fang * Math.cos(Bf0) * Math.cos(Bf0);double tf = Math.tan(Bf0);double B = Bf0 - tf * y * y / ((double)2 * Mf * Nf) + tf * ((double)5 + (double)3 * tf * tf + nffang - (double)9 * nffang * tf * tf) * Math.pow(y, 4.0D) / ((double)24 * Mf * Math.pow(Nf, 3.0D)) - tf * ((double)61 + (double)90 * tf * tf + (double)45 * Math.pow(tf, 4.0D)) * Math.pow(y, 6.0D) / ((double)720 * Mf * Math.pow(Nf, 5.0D));double l = y / (Nf * Math.cos(Bf0)) - ((double)1 + (double)2 * tf * tf + nffang) * Math.pow(y, 3.0D) / ((double)6 * Math.pow(Nf, 3.0D) * Math.cos(Bf0)) + ((double)5 + (double)28 * tf * tf + (double)24 * Math.pow(tf, 4.0D)) * Math.pow(y, 5.0D) / ((double)120 * Math.pow(Nf, 5.0D) * Math.cos(Bf0));double L = l + L0;double[] array_B = this.rad2dms(B);double[] array_L = this.rad2dms(L);double Bdec = this.dms2dec(array_B);double Ldec = this.dms2dec(array_L);System.out.println(Bdec+":"+Ldec);//return new Tuple(Bdec, Ldec);}public double gaussLongToDegreen(double B, double L, int N) {double L00 = (double)Math.round(L / (double)3) * (double)3;return L00 / (double)180 * 3.1415926D;}public double[] rad2dms(double rad) {double[] a = new double[]{0.0D, 0.0D, 0.0D};double dms = rad * p;a[0] = Math.floor(dms / 3600.0D);a[1] = Math.floor((dms - a[0] * (double)3600) / 60.0D);a[2] = (double)((int)Math.floor(dms - a[0] * (double)3600)) - a[1] * (double)60;return a;}public double dms2dec( double[] dms) {Intrinsics.checkNotNullParameter(dms, "dms");double dec = 0.0D;dec = dms[0] + dms[1] / 60.0D + dms[2] / 3600.0D;return dec;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。