最新随记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个糖果,谢谢老板!并点个赞。
网友评论