达内烟台中心 > 达内新闻
JAVA实现附近范围内公交定位问题
- 发布:烟台培训机构
- 来源:互联网
- 时间:2018-03-30 19:35
整体思路
计算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.
反正思路与计算的重点已经有了…
更多烟台培训相关资讯,请扫描下方二维码
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 哈尔滨
- 济南
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 长沙
- 昆明
- 太原
- 无锡
- 石家庄
- 南宁
- 佛山
- 珠海
- 宁波
- 保定
- 呼和浩特
- 洛阳
- 烟台
- 运城
- 潍坊
JAVA实现附近范围内公交定位问题
- 发布:烟台培训机构
- 来源:互联网
- 时间:2018-03-30 19:35
整体思路
计算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.
反正思路与计算的重点已经有了…
更多烟台培训相关资讯,请扫描下方二维码
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 厦门
- 哈尔滨
- 济南
- 福州
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 大连
- 长沙
- 昆明
- 温州
- 太原
- 南昌
- 无锡
- 石家庄
- 南宁
- 中山
- 兰州
- 佛山
- 珠海
- 宁波
- 贵阳
- 保定
- 呼和浩特
- 东莞
- 洛阳
- 潍坊
- 烟台
- 运城