Spatial4j+ForkJoin 实现经纬度距离计算并排序

maven

<dependency><groupId>com.spatial4j</groupId><artifactId>spatial4j</artifactId><version>0.5</version>
</dependency>

Spatial4j工具类

import com.spatial4j.core.context.SpatialContext;
import com.spatial4j.core.distance.DistanceUtils;
import com.spatial4j.core.shape.Rectangle;/*** java类简单作用描述** @Package: cn.fulong.bjwalk.findhome.util* @Author: yu_du_chen* @CreateDate: 2020/8/29 10:43* @Version: 1.0*/
public class spatial {// 移动设备经纬度private double lon;private double lat;//千米final private static int radius = 16;public spatial() {this(116.311777,40.035986);}public spatial(double lon, double lat) {this.lon = lon;this.lat = lat;System.out.println("配置加载");}/**根据设置的范围 检索*/public void xyRange(){System.out.println(lon);System.out.println(lat);SpatialContext geo = SpatialContext.GEO;Rectangle rectangle = geo.getDistCalc().calcBoxByDistFromPt(geo.makePoint(lon, lat), radius * DistanceUtils.KM_TO_DEG, geo, null);System.out.println(rectangle.getMinX() + "-" + rectangle.getMaxX());// 经度范围System.out.println(rectangle.getMinY() + "-" + rectangle.getMaxY());// 纬度范围}/**商户经纬度和当前经纬度距离,传入商户经纬度*/public double xyDistance(double lon2,double lat2){SpatialContext geo = SpatialContext.GEO;double distance = geo.calcDistance(geo.makePoint(lon, lat), geo.makePoint(lon2, lat2))* DistanceUtils.DEG_TO_KM;return distance;}public static void main(String[] args) {spatial A = new spatial();A.xyRange();A.xyDistance(116.426612,39.905184);//北京站地铁站-A口}
}

ForkJoin工具类

ForkJoin的用法可参考 : ForkJoin

import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.RecursiveTask;/*** ForkJoin 多任务* @ProjectName: utils* @Package: cn.fulong.web.forkjoin* @Author: yu_du_chen* @CreateDate: 2019/9/10 16:26* @Version: 1.0*/
@Component
public class ForkJoin{/*** 单个排序的子任务*/public static class MyTask  extends RecursiveTask<CopyOnWriteArrayList> {private CopyOnWriteArrayList<Map<String, Object>> maps;private spatial A;public MyTask(List<Map<String, Object>> maps,spatial A) {this.maps = new CopyOnWriteArrayList(maps);this.A = A;}/* (non-Javadoc)* @see java.util.concurrent.RecursiveTask#compute()*/@Overrideprotected CopyOnWriteArrayList compute() {int sourceLen = maps.size();if(sourceLen > 1) {int midIndex = sourceLen / 2;// 拆分成两个子任务MyTask task1 = new MyTask(maps.subList(0, midIndex),A);task1.fork();MyTask task2 = new MyTask(maps.subList(midIndex, sourceLen),A);task2.fork();// 结果集合并CopyOnWriteArrayList list1 = task1.join();CopyOnWriteArrayList list2 = task2.join();list1.addAll(list2);return list1;}else {double a = A.xyDistance(Double.parseDouble(maps.get(0).get("position_x").toString()),Double.parseDouble(maps.get(0).get("position_y").toString()));//计算出的距离反存入 listmaps.get(0).put("distance",a);return maps;}}}}

实际用法(impl)

 /*per 分页、school查询参数、x/y移动设备当前经纬度、sortFlag升序/降序*/@Overridepublic Map<String, Object> getCloudClassList(Integer per, School school, Double x, Double y, boolean sortFlag) {//MyBatis-Plus的查询用法IPage<School> iPage = new Page<>(Optional.ofNullable(per).orElse(0), FindConstants.SchollList);IPage<Map<String, Object>> list = schoolMapper.selectMapsPage(iPage,Wrappers.<School>lambdaQuery().like(IsNotNull.get(school.getSchoolName()),School::getSchoolName, school.getSchoolName()).eq(IsNotNull.get(school.getId()),School::getId, school.getId()).eq(true,School::getFlag, "1"));System.out.println("总页数:" + list.getPages());System.out.println("总数:" + list.getTotal());System.out.println("页数:" + list.getSize());System.out.println("页码:" + list.getCurrent());//业务需求 前端需要这些参数 放入map中//list.getRecords() 查询出的所有学校数据Map<String, Object> map = new LinkedHashMap();map.put("pages",list.getPages());map.put("total",list.getTotal());map.put("size",list.getSize());map.put("current",list.getCurrent());//IsNotNull 自封装的判空方法 后面会给出文章链接if(IsNotNull.get(list.getRecords())){/*开启任务*//*方法实现的是:通过spatial4j计算出 list每条数据距离当前移动设备的距离(distance)反存入list,并且按照distance排序*/ForkJoinPool pool = new ForkJoinPool();ForkJoin.MyTask task = new ForkJoin.MyTask(list.getRecords(),new spatial(x,y));ForkJoinTask<CopyOnWriteArrayList> index = pool.submit(task);try {CopyOnWriteArrayList<Map<String, Object>> m = index.get();//通过distance排序  具体用法 参考java1.8 stream().sorted 这里不做过多解释List<Map<String, Object>> nameList = m.stream().sorted((a,b)  -> getCollect(sortFlag,a,b)).collect(Collectors.toList());Map<String, Object> map1 = new LinkedHashMap();map1.put("data",nameList);map1.put("ipage",map);return map1;} catch (Exception  e) {e.printStackTrace(System.out);}}return null;}private int getCollect(boolean sortFlag, Map<String, Object> a, Map<String, Object> b){if(sortFlag){if (b.get("distance").toString().equals(a.get("distance").toString())) {return b.get("id").toString().compareTo(a.get("id").toString());}else {return new BigDecimal(b.get("distance").toString()).compareTo(new BigDecimal(a.get("distance").toString()));}}else{if (a.get("distance").toString().equals(b.get("distance").toString())) {return a.get("id").toString().compareTo(b.get("id").toString());}else {return new BigDecimal(a.get("distance").toString()).compareTo(new BigDecimal(b.get("distance").toString()));}}}

JAVA经纬度距离计算并排序-Spatial4j+ForkJoin相关推荐

  1. java 经纬度距离计算

    导入依赖 <dependency><groupId>org.gavaghan</groupId><artifactId>geodesy</arti ...

  2. GIS-Spatial4j经纬度距离计算(三)

    Spatial4j距离计算 借助于sptaial4j提供的接口,实现经纬度距离计算:并介绍度,弧度,距离(KM)之间的换算 spatial4j支持的距离计算三个公式: Law of Cosines(余 ...

  3. 基于GPS与经纬度距离计算

    基于GPS与经纬度距离计算 # -*- coding:utf-8 -*- # /usr/bin/pythonimport warnings warnings.filterwarnings(" ...

  4. 给定经纬度计算距离_通过经纬度坐标计算距离的方法(经纬度距离计算)ZZ

    通过经纬度坐标计算距离的方法(经纬度距离计算) 最近在网上搜索"通过经纬度坐标计算距离的方法",发现网上大部分都是如下的代码: #define PI 3.14159265 stat ...

  5. mysql 经纬度距离计算

    经纬度距离计算 函数计算方法 两点距离(单位m) mysql 5.6 添加 两点球面距离(单位m)MySQL 5.7.6添加 函数计算方法 CREATE DEFINER=`root`@`%` FUNC ...

  6. 通过经纬度坐标计算距离的方法(经纬度距离计算)

    通过经纬度坐标计算距离的方法(经纬度距离计算) 最近在网上搜索"通过经纬度坐标计算距离的方法",发现网上大部分都是如下的代码: #define PI 3.14159265 stat ...

  7. mysql 下 计算 两点 经纬度 之间的距离 计算结果排序

    根据经纬度计算距离公式 公式 对上面的公式解释如下: Lung1 Lat1表示A点经纬度, Lung2 Lat2表示B点经纬度: a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung ...

  8. mysql 单精度和双经度_mysql 下 计算 两点 经纬度 之间的距离 计算结果排序

    根据经纬度计算距离公式 公式 对上面的公式解释如下: Lung1 Lat1表示A点经纬度, Lung2 Lat2表示B点经纬度: a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung ...

  9. mysql经纬度距离计算 按距离排序

    mysql距离计算,单位km/m,以及按照距离排序 方法一:计算出来的结果单位为m -- 纬度:31.182592 store_locy 经度:121.431744 store_locxSELECT ...

  10. java gps 距离计算_Java教程之地图中计算两个GPS坐标点的距离

    原标题:Java教程之地图中计算两个GPS坐标点的距离 在日常开发中,我们难免要计算两个左边之间的距离,但是地图软件api的接口普遍要求我们必须要先将坐标点传递到他们服务器,然后计算出一个距离返还给我 ...

最新文章

  1. 使用Leangoo玩转故事地图
  2. CircleLoss
  3. AngularJS HTML DOM
  4. Apache Dubbo 被曝出“高危”远程代码执行漏洞
  5. 函数传参字典_Python 函数中的 4 种参数类型
  6. MySQL查询结果条数编号示例 mysql 查找结果中自动加序号列
  7. 值不值 | 三分钟搞定jpa?值不值!
  8. Community Server架构:博客业务详细分析(转)
  9. 适用于树莓派Raspberry Pi的嵌入式QT平台(二) -- 在Windows下用Qt Creator开发编译Raspberry Qt 5应用程序...
  10. swift扩展_Swift扩展
  11. sublime Text 2使用小技巧
  12. oracle用UNION-ALL 替换UNION ( 如果有可能的话)
  13. 在windows下把txt文件改为utf8格式
  14. MagicDraw建模显示中文问题
  15. 域计算机策略软件安装方法,windows域软件下发策略
  16. android模拟qq进场动画,Android用ViewPager仿QQ实现多页面滑动及动画效果
  17. wps云盘和zotero的结合(一)
  18. linux没有cpufreq目录,Linux系统的Cpufreq
  19. next主题搭建相册(无需安装插件,代码即可实现)
  20. 齐岳合成黄光磷光材料Ir(CzPPya)3|Eu(TAA)3(apt)Ho(TAA)3(apt)

热门文章

  1. 网上购物html5 sqlserver,网上购物商城系统的设计与实现(SQLServer)
  2. viper4android 6.0脉冲,【详解】v4a音效脉冲样本
  3. C语言课程设计|职工工资管理系统
  4. js导出excel文件
  5. 有没有什么好用的pdf编辑软件?3款App轻松编辑所有PDF文件
  6. zend studio php调试,Zend Studio中如何配置和使用xdebug断点调试工具?
  7. 婴幼儿体重在线计算机,宝宝身高体重标准计算器
  8. Word如何快速绘制你需要的作文稿纸
  9. VsCode下载,使用国内镜像秒下载
  10. 如何使用puttygen密钥远程登录服务器