经纬度与高斯平面坐标正反算java代码

最新随记App算是正式上线了,这个App里面涉及了很多Android

方面的知识,我个人感觉,当你一个人把一个App实现出来,正对重量级的原生App,如果做的牛叉的话,可以覆盖Android开发的绝大部分知识,达到中级研发工程师的水平基本不在话下。

一不小心说多了,直奔主题吧,如何经纬度转高斯平面坐标,以前学校写的C#的代码,现在用Java代码实现了,如果有需要的同学,请拿走,不谢!如果你觉得好用,请打赏10个糖果,谢谢老板!

package com.zjasm.mapbuild.utils;

import com.esri.core.geometry.Point;

/**

* Created by zjasm on 2019/3/30.

* 自定义高斯投影变换,CGCS2000坐标系为基准

*/

public class GrussCoordinateUitl {

public static final double a =6378137.0;

    public static final double b =6356752.31414;

    public static final double f =1.0 /298.257222101;

    public static final double e =0.0818191910428;

    public static final double e_2 =0.00669438002290;

    public static final double e1 =0.0820944381519;

    public static final double e1_2 =0.00673949677559;

    public static final double p =180 *3600.0 / Math.PI;

    /**

* 高斯正算,获取平面坐标

*

    * @param point    待转换的点

    * @param centerLng 中央经线

    * @param dh 代号

    * @return 返回转换后的XY点

*/

    public static PointgetXYPoint(Point point, double centerLng,int dh) {

double B = point.getY() /180.0 * Math.PI;

        double l = (point.getX() - centerLng) /180.0 * Math.PI;

        double cosB = Math.cos(B);

        double tanB = Math.tan(B);

        double p8 = Math.pow((e1 * cosB), 2);

        double S8 =a *a /b / Math.sqrt(1 + p8);

        double Q8 = l * cosB;

        double O8 = Math.pow(tanB, 2);

        double P8 = Math.pow((e1 * cosB), 2);

        double X1 =a * (

(1 - Math.pow(e, 2) /4.0 - (3 * Math.pow(e, 4)) /64.0 - (5 * Math.pow(e, 6) /256.0)) * B

- ((3 * Math.pow(e, 2)) /8.0 + (3 * Math.pow(e, 4)) /32.0 + (45 * Math.pow(e, 6)) /1024.0) * Math.sin(2 * B)

+ ((15 * Math.pow(e, 4)) /256.0 + (45 * Math.pow(e, 6)) /1024.0) * Math.sin(4 * B)

- (35 * Math.pow(e, 6)) * Math.sin(6 * B) /3072.0

        );

        double x = (X1 + S8 * tanB * (0.5 * Math.pow(Q8, 2) + (5 - O8 +9 * p8 +4 * Math.pow(p8, 2)) * Math.pow(Q8, 4) /24.0) + (61 -58 * O8 + Math.pow(O8, 2) +270 * p8 -330 * O8 * p8) * Math.pow(Q8, 6) /720);

        double y =500000 +1 * S8 * (Q8 + (1 - O8 + P8) * Math.pow(Q8, 3) /6 + (5 -18 * O8 + Math.pow(O8, 2) +14 * P8 -58 * O8 * P8) * Math.pow(Q8, 5) /120);

        System.out.println("**********x:"+x);

        System.out.println("**********y:"+y);

        return new Point(y,x);

    }

/**

* 高斯反算,获取经纬度坐标

*

    * @param point    待转换的点

    * @param centerLng 中央经线

    * @return 返回转换后的经纬度点

*/

    public static PointgetLBPoint(Point point, double centerLng) {

double x=point.getY();

        double y=point.getX();

        double R8=(1-b/a)/(1+b/a);

        double S8=Math.floor(x);

        double T8=S8/(a*(1-Math.pow(e,2)/4-3*Math.pow(e,4)/64-5*Math.pow(e,6)/256.0));

        double U8=T8+(3*R8/2-27*Math.pow(R8, 3)/32)*Math.sin(2*T8)+(21*Math.pow(R8, 2)/16-55*Math.pow(R8, 4)/32)*Math.sin(4*T8)+151*Math.pow(R8, 3)/96*Math.sin(6*T8);

        double V8=Math.pow(e1* Math.cos(U8),2);

        double W8=a*(1-e_2)/Math.pow(1-Math.pow(e*Math.sin(U8),2),2.5);

        double X8=a*a/b/Math.sqrt(1+V8);

        double Y8=Math.pow(Math.tan(U8),2);

        double Z8=(y-500000-Math.floor(y/1000000)*1000000)/(1*X8);

        double lat=(U8-X8*Math.tan(U8)*(Math.pow(Z8,2)/2-(5+3*Y8+V8-9*Y8*V8)*Math.pow(Z8,4)/24+(61+90*Y8+45*Math.pow(Y8,2))*Math.pow(Z8,6)/720)/W8)*360/2/Math.PI;

        double lng=centerLng+((Z8-(1+2*Y8+V8)*Math.pow(Z8,3)/6+(5+28*Y8+6*V8+8*Y8*V8+24*Math.pow(Y8,2))*Math.pow(Z8,5)/120)/Math.cos(U8))*180/Math.PI;

        System.out.println("**********B:"+lat);

        System.out.println("**********L:"+lng);

        return new Point(lng,lat);

    }

}

如果你觉得好用,请打赏10个糖果,谢谢老板!并点个赞。

你可能感兴趣的:(经纬度与高斯平面坐标正反算java代码)