百度地图 返回坐标 java,百度地图坐标间距离 通过java计算

原因:前端用的百度地图,数据库存的百度地图坐标,需要在后台(java)计算两点坐标的直线距离,网上的一些通用方法计算出来的和使用百度js api得到的结果不一样,无奈只有阅读源码,再用java写一遍。

先看百度js api得到的结果:

//这是百度api获取距离的方法

var range=map.getDistance(new BMap.Point(116.404, 39.915),new BMap.Point(116.399814, 39.908209));

console.log(range)

//得到的结果为 835.2724351592902 ,单位是米

然后分析源码:

//这里只列出关联的js方法

mP: 6370996.81,

getDistance: function(a, b) {

if (a && b) {

if (a.nb(b)) return 0;

var c = 0,

c = S.Xo(a, b);

if (c === p || c === j) c = 0;

return c

}

}

nb: function(a) {

return ! (a instanceof db) || this.xj() ? q: this.ve().nb(a.ve()) && this.nf().nb(a.nf())

}

Xo: function(a, b) {

if (!a || !b) return 0;

a.lng = this.OD(a.lng, -180, 180);

a.lat = this.SD(a.lat, -74, 74);

b.lng = this.OD(b.lng, -180, 180);

b.lat = this.SD(b.lat, -74, 74);

return this.Te(this.Uk(a.lng), this.Uk(b.lng), this.Uk(a.lat), this.Uk(b.lat))

}

OD: function(a, b, c) {

for (; a > c;) a -= c - b;

for (; a < b;) a += c - b;

return a

}

SD: function(a, b, c) {

b != p && (a = Math.max(a, b));

c != p && (a = Math.min(a, c));

return a

}

Te: function(a, b, c, d) {

return this.mP * Math.acos(Math.sin(c) * Math.sin(d) + Math.cos(c) * Math.cos(d) * Math.cos(b - a))

}

Uk: function(a) {

return Math.PI * a / 180

}

java代码:

public class BaiduLocationUtils {

public static Double getDistance(Point a, Point b) {

if (a!=null && b!=null) {

return XO(a, b);

}else {

return 0d;

}

}

private static Double XO(Point a, Point b) {

a.setLng(OD(a.getLng(), -180d, 180d));

a.setLat(SD(a.getLat(), -74d, 74d));

b.setLng(OD(b.getLng(), -180d, 180d));

b.setLat(SD(b.getLat(), -74d, 74d));

return Te(Uk(a.getLng()), Uk(b.getLng()), Uk(a.getLat()), Uk(b.getLat()));

}

private static Double OD(Double a, Double b, Double c) {

for (; a > c;) a -= c - b;

for (; a < b;) a += c - b;

return a;

}

private static Double SD(Double a, Double b, Double c) {

return a;

}

private static Double Te(Double a, Double b, Double c, Double d) {

return 6370996.81 * Math.acos(Math.sin(c) * Math.sin(d) + Math.cos(c) * Math.cos(d) * Math.cos(b - a));

}

private static Double Uk(Double a) {

return Math.PI * a / 180;

}

public static void main(String[] args) {

System.out.println(getDistance(new Point(116.404, 39.915),new Point(116.399814, 39.908209)));

}

}

class Point{

/**

* 经度

*/

private Double lng;

/**

* 纬度

*/

private Double lat;

public Point() {};

public Point(Double lng, Double lat) {this.lng=lng;this.lat = lat;}

public Double getLng() {

return lng;

}

public void setLng(Double lng) {

this.lng = lng;

}

public Double getLat() {

return lat;

}

public void setLat(Double lat) {

this.lat = lat;

};

}

结果一致,省略了一些代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值