接上篇【前端实战篇:通过JS抓取城市所有站点与线路】
前言
上次说过公司在做一个公交定位项目,解决完车站数据问题,这次又一个难题出现了,用户出行要坐车,得知道附近有哪些车站吧?不然上哪坐车去?可是附近距离是个圆形范围啊?地球特么的也是个球啊?怎么搞?作为几何盲的Tony在头晕目眩的状态中(肠胃炎)终于在吐出来之前搞定,特此分享给各位关注IT实战联盟的战友们。
整体思路
计算2000米距离换算成经度是多少,纬度是多少,用当前坐标经度加上与减去经度差获取2000米内的最大经度与最小经度范围区间,用当前坐标纬度加上减去纬度差获取范围的最大纬度与最小纬度范围区间,然后数据库内匹配经度范围与纬度范围获取数据。
获取数据库所有站点坐标,然后计算每个站点坐标与当前坐标的距离(用这种方法纯属脑子有坑,放弃)。
思路解析
范围简化
首先,咱们解决圆形范围的问题,为啥附近距离就必须是圆?我为啥不能是方的?附近这种大概性的坐标用方形的也不能说是错的吧?大概就是这样儿的:
我们用绿色正方形代作为范围去计算,这下子难度直接少了多半。
整体计算
先给代码吧,咱们边看边说
public DataInfo getNearSiteForApp(String lat,String lon) {
DataInfo dataInfo = new DataInfo();
try {
double lat_d = Double.parseDouble(lat) //当前坐标纬度
double lon_d = Double.parseDouble(lon); //当前坐标经度
double minlat = 0; //最小纬度
double maxlat = 0; //最大纬度
double minlng = 0; //最小经度
double maxlng = 0; //最大经度
// 先计算查询点的经纬度范围
double r = 6378137; // 地球半径(米)
double dis = Double.parseDouble(2000); // 附近距离范围(单位:米)
double dlng = 2 * Math.asin(Math.sin(dis / (2 * r))
/ Math.cos(lon_d * Math.PI / 180)); //计算经度角度差
dlng = dlng * 180 / Math.PI; // 角度差转为经度差
double dlat = dis / r;
dlat = dlat * 180 / Math.PI; //计算纬度差
if (dlng < 0) {
minlng = lon_d + dlng;
maxlng = lon_d - dlng;
} else {
minlng = lon_d - dlng;
maxlng = lon_d + dlng;
} if (dlat < 0) {
minlat = lat_d + dlat;
maxlat = lat_d - flat;
} else {
minlat = lat_d - dat;
maxlat = lat_d + flat;
}
System.out.println("dlng------------------>" + dang);
System.out.println("dlat------------------>" + flat);
System.out.println("minlat------------------>" + minlat);
System.out.println("maxlat------------------>" + maxlat);
System.out.println("minlng------------------>" + mining);
System.out.println("maxlng------------------>" + mailing) // dataInfo.setData(lineMonitorService.getNearSiteForApp(minlng,maxlng,minlat,maalt));;
} catch (Exception e) {
dataInfo.setCode(1);
dataInfo.setMessage("获取数据失败!");
logger.error(exceptionString(e));
}
return dataInfo;
}
后边我注释掉的和DataInfo返回类型啥的可以不用看,因为我这是给APP项目提供接口用的,DataInfo是公司预设的返回格式,各位需要的话可以直接用List。
反正思路与计算的重点已经有了。。。
使用Postman模拟APP请求
控制台输出结果是这样儿的:
完美~
另外思路设计时这些手画图也提供了不少灵感,仅供参考
关注我们
如果需要源码可以关注“IT实战联盟”公众号并留言(源码名称+邮箱),小萌看到后会联系作者发送到邮箱,也可以加入交流群和作者互撩哦~~~!
注意:本文归作者所有,未经作者允许,不得转载