Java_GPS经纬度转坐标

需求

GPS是常见的定位硬件,当佩戴GPS时会提供经纬度数信息,需要将经纬度数转换成为坐标值来将佩戴GPS的用户或者车辆等投射到一个二维平面上。

方法

常见的经纬度转坐标值有墨卡托算法,米勒投影算法等,那么今天就来说一下这两种方法的实现。
首先还是来引入一下这两种算法吧,详情如下:
墨卡托算法:https://blog.csdn.net/ryfdizuo/article/details/20793669
米勒投影算法:
https://baike.baidu.com/item/%E5%A2%A8%E5%8D%A1%E6%89%98%E6%8A%95%E5%BD%B1/5477927?fr=aladdin

实现

相信大家都对这两种算法有了一个了解,那么接下来就用java代码来实现这两种算法:
墨卡托算法:

public class Coordinate{
	static double M_PI=Math.PI;
	//经纬度转墨卡托
	public static double[] lonLat2Mercator(double lon,double lat) {
		double[] xy = new double[2];
		double x = lon * 20037508.342789 / 180;
		double y = Math.log(Math.tan((90 + lat) * M_PI /360)) / (M_PI / 180);
		y = y * 20037508.34789 / 180;
		xy[0] = x;
		xy[1] = y;
		return xy;
	}
	public static void main(String[] args) {
		double[] num = lonLat2Mercator(120.385222,36.061416);
		System.out.println("("+num[0]+" , "+num[1]+")");
	}
}

米勒投影算法:

public static Map<String, Double> MillierConvertion(double lon, double lat) {

    double L = 6381372 * Math.PI * 2; //地球周长
    double W = L; //平面展开之后X周等于周长
    double H = L / 2; //Y轴等于周长的一半
    double mill = 2.3; //米勒投影的一个常数,范围大约在正负2.3之间
    double x = lon * Math.PI / 180; //将经度从度数转换为弧度
    double y = lat * Math.PI / 180; //将纬度从度数转换为弧度
    y = 1.25 * Math.log(Math.tan(0.25 * Math.PI + 0.4 * y));
    x = (W / 2) + (W / (2 * Math.PI)) * x;
    y = (H / 2) - (H / (2 * mill)) * y;

    //减去原点坐标  左下角
    //x=x-xlng;
    //y=y-ylat;

    Map<String, Double> map = new HashMap<>();
    map.put("x", x);
    map.put("y", y);
    System.out.println(map);
    return map;
}
扩展算法

当然,除了这两种算法之外还有其他算法,如Haversine公式等,大家可以参考:
https://www.jianshu.com/p/94f99d70c71d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

除了Java代码外,再补充上一个js的实现方式(不完全,核心代码):

function METERS_DEGLON(x)
{  
   with (Math)
   {
      var d2r=DEG_TO_RADIANS(x);
      return((111415.13 * cos(d2r))- (94.55 * cos(3.0*d2r)) + (0.12 * cos(5.0*d2r)));
   }
}

function METERS_DEGLAT(x)
{
   with (Math)
   {
      var d2r=DEG_TO_RADIANS(x);
      return(111132.09 - (566.05 * cos(2.0*d2r))+ (1.20 * cos(4.0*d2r)) - (0.002 * cos(6.0*d2r)));
   }
}

上边的js代码是不完全的,如果想要有完整代码可以查看以下链接的审查元素:
https://scienceweb.whoi.edu/marine/ndsf/utility/NDSFutility.html

END

整理不易,如有帮助给个赞鼓励一下🤳

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

new_repo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值