需求
GPS是常见的定位硬件,当佩戴GPS时会提供经纬度数信息,需要将经纬度数转换成为坐标值来将佩戴GPS的用户或者车辆等投射到一个二维平面上。
方法
常见的经纬度转坐标值有墨卡托算法,米勒投影算法等,那么今天就来说一下这两种方法的实现。
首先还是来引入一下这两种算法吧,详情如下:
墨卡托算法:https://blog.youkuaiyun.com/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
整理不易,如有帮助给个赞鼓励一下🤳