实现的思路:
1.先计算两地的距离,然后把计算出来的距离全部放到List<Double> A集合中
2.再把当前正在计算的经纬度存放到 List<Map> B 集合中key值就是两地的距离
3.然后再取 List A的最小值(double),这里也就是取里指定位置最近的经纬度
4.再然后通过循环遍历 B集合,以key取值的形式获取最近的经纬度
实体类dto
package com.nscw.dcxt.common.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* Copyright (C), 2019-2020,www.sionma.com
* FileName: LnogLat
* Author: SixJR
* Email: [email protected]
* Date: 2021年03月22日 1:02
* Description: 经纬度dto
* History:
* <author> <time> <version> <desc>
*/
@Data
@ApiModel(description = "经纬度dto")
public class LnogLat {
@ApiModelProperty(value = "经度")
private double lng;
@ApiModelProperty(value = "纬度")
private double lat;
}
工具类 GeoUtils.java
package com.nscw.dcxt.common.utils;
import com.alibaba.fastjson.JSON;
import com.nscw.dcxt.common.dto.LnogLat;
import java.util.*;
/**
* Copyright (C), 2019-2020,www.sionma.com
* FileName: GeoUtils
* Author: SixJR
* Email: [email protected]
* Date: 2021年03月22日 0:54
* Description: 计算地理坐标之间的距离
* History:
* <author> <time> <version> <desc>
*/
public class GeoUtils {
/**
* 根据两个位置的经纬度,来计算两地的距离(单位为KM)
* @param lng1 经度
* @param lat1 纬度
* @param lng2
* @param lat2
* @return
*/
public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
double patm = 2;
double radLat1 = (lat1 * Math.PI / 180.0);
double radLat2 = (lat2 * Math.PI / 180.0);
double difference = radLat1 - radLat2;
double mdifference = (lng1 * Math.PI / 180.0) - (lng2 * Math.PI / 180.0);
double distance = patm * Math.asin(Math.sqrt(Math.pow(Math.sin(difference / patm), patm)
+ Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(mdifference / patm), patm)));
distance = distance * 6378.137;//6378.137是赤道的半径
return distance;
}
/**
* 根据指定位置,在经纬度集中筛选出离指定位置最近的经纬度
*
* @return
*/
public static String getLately(double lng1, double lat1, List<LnogLat> lnogLats) {
List<Double> doubles = new ArrayList<>();
List<Map> lnogLatMapList = new ArrayList<>();
//依次计算距离
for (LnogLat lnogLat : lnogLats) {
Map lnogLatMap = new HashMap();
double result = getDistance(lng1, lat1, lnogLat.getLng(), lnogLat.getLat());
doubles.add(result);
LnogLat longlatRes = new LnogLat();
longlatRes.setLat(lnogLat.getLat());
longlatRes.setLng(lnogLat.getLng());
lnogLatMap.put(result, longlatRes);
lnogLatMapList.add(lnogLatMap);
}
//取距离的最小值
Double minVal = Collections.min(doubles);
//根据最小值获取离指定位置最近的距离
for (int i = 0; i < lnogLatMapList.size(); i++) {
if (lnogLatMapList.get(i).get(minVal) != null) {
return JSON.toJSONString(lnogLatMapList.get(i).get(minVal));//返回最近的经纬度
}
}
return null;
}
//测试
public static void main(String[] args) {
List<LnogLat> lnogLatList = new ArrayList<>();
LnogLat lnogLat1 = new LnogLat();
lnogLat1.setLng(111.209203);
lnogLat1.setLat(28.042163);
lnogLatList.add(lnogLat1);
LnogLat lnogLat4 = new LnogLat();
lnogLat4.setLng(111.334182);
lnogLat4.setLat(27.331331);
lnogLatList.add(lnogLat4);
System.out.println(getLately(121.348453, 27.823152, lnogLatList));
}
}