JAVA实现附近范围内公交定位问题

编程学思 2018-03-30 15:08:57 ⋅ 106 阅读

接上篇【前端实战篇:通过JS抓取城市所有站点与线路】

前言

上次说过公司在做一个公交定位项目,解决完车站数据问题,这次又一个难题出现了,用户出行要坐车,得知道附近有哪些车站吧?不然上哪坐车去?可是附近距离是个圆形范围啊?地球特么的也是个球啊?怎么搞?作为几何盲的Tony在头晕目眩的状态中(肠胃炎)终于在吐出来之前搞定,特此分享给各位关注IT实战联盟的战友们。

整体思路
  1. 计算2000米距离换算成经度是多少,纬度是多少,用当前坐标经度加上与减去经度差获取2000米内的最大经度与最小经度范围区间,用当前坐标纬度加上减去纬度差获取范围的最大纬度与最小纬度范围区间,然后数据库内匹配经度范围与纬度范围获取数据。

  2. 获取数据库所有站点坐标,然后计算每个站点坐标与当前坐标的距离(用这种方法纯属脑子有坑,放弃)。

思路解析
范围简化

首先,咱们解决圆形范围的问题,为啥附近距离就必须是圆?我为啥不能是方的?附近这种大概性的坐标用方形的也不能说是错的吧?大概就是这样儿的:

我们用绿色正方形代作为范围去计算,这下子难度直接少了多半。

整体计算

先给代码吧,咱们边看边说

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实战联盟”公众号并留言(源码名称+邮箱),小萌看到后会联系作者发送到邮箱,也可以加入交流群和作者互撩哦~~~!



全部评论: 0

    我有话说:

    前端实战篇-聊聊JavaScript

    内存生命周期、分配存、使用分配的内存(读与写操作),当应用程序不再需要时,释放掉已分配的

    精品推荐:Java核心数据结构(List,Map,Set)使用技巧与优化

    JDK提供了一组主要的数据结构实现,如List、Map、Set等常用数据结构。这些数据都继承自 java.util.Collection 接口,并位于 java.util 包

    前端实战篇—在Javascript中,Number类型超长问题详解

    今天给大家分享的是在Javascript中,获取到数字超出长度问题

    Java Web实战篇:发布和运维必备的12条Linux命令

    作为一名Java起步的从业人员,学会一些常用的Linux命令是必须的。

    Java Web实战篇-轻松提高千万级数据库查询效率

    通过优化数据库设计、java后台和数据库优化达到提高千万级数据查询的效率。

    Google发布Java 核心工具库——Guava 28.0

    Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。这个库是为了方便编码,并减少编码错误。这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和

    蚂蚁金服 Java RPC 开源框架—SOFARPC

    SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。

    微信开发神器全能微信Java开发工具包

    必须分享的微信神器 weixin-java-tools

    精品推荐:一览GitHub上最受程序欢迎的5大Java开源项目

    列举了GitHub上一些最流行的Java项目。从Mockitos到Guava,以及 java-design-patterns等供大家学习。

    2017 年度编程语言榜,Java 最流行、JavaScript 最没价值?

    2017 年度编程语言榜,Java 最流行、JavaScript 最没价值?

    GitHub精选:2018年11月份最热门的Java开源项目

    又到了揭晓 11 月份最热门 Java 开源项目排名的时候了,在本月的名单中,出现了几个新面孔,如Java 核心知识库、轻量级容错组件Resilience4j .....

    Google 宣布正式开源 Jib ,帮助 Java 应用快速容器化

    Google 本周宣布开源一款新的 Java 工具 Jib ,旨在让开发者使用他们熟悉的工具更轻松地将 Java 应用程序容器化。

    Java 零注解文档生成工具—smart-doc,看完有替换swagger的冲动

    Tips:喜欢的话可以关注小萌哦~~~今天小萌给大家推荐的一个开源Java Restful API 文档生成

    「开源资讯」Guava 28.2 发布,Google 的 Java 核心工具库

    前言 Guava 28.2 发布了,Guava 是 Google 的一个开源项目,包含许多 Google 核心 Java 常用库,如:集合 [collections] 、缓存 [caching

    Java Web实战篇-代码之美

    代码之美-小小的优化让你的代码Bug更少,执行效率更高

    前端实战篇:通过JS抓取城市所有站点与线路

    公交线路定位,木有数据怎么办?网上抓去~ 手把手教你通过JS实现站点线路数据抓取