Filter out the latitude and longitude closest to the specified location in the latitude and longitude collection

Ideas to realize:

1.先计算两地的距离,然后把计算出来的距离全部放到List<Double> A集合中
2.再把当前正在计算的经纬度存放到 List<Map> B 集合中key值就是两地的距离
3.然后再取 List A的最小值(double),这里也就是取里指定位置最近的经纬度
4.再然后通过循环遍历 B集合,以key取值的形式获取最近的经纬度

Entity class 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;
}

Tool class 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));
    }
}

Guess you like

Origin blog.csdn.net/m0_43413873/article/details/115060092