java经纬度计算工具类(含测试方法)

发布时间:2024年01月22日

文章目录

代码

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.math3.util.FastMath;

import java.util.*;

public class DistanceCalculator {

 public static void main(String[] args) {
        List<Activity> activities = Arrays.asList(
                new Activity("目标地址", 22.543903,113.911223) 
        );
        // 当前用户地址
        double userLat = 22.5859635925293; 
        double userLng = 113.86769104003906; 
        List<Activity> sortedActivities = sortActivitiesByDistance(activities, userLat, userLng);
        Map<String,String> seatMap = new HashMap<String,String>();

        for (Activity activity : sortedActivities) {
            double km = DistanceCalculator.calculateDistance(userLat, userLng, activity.getLat(), activity.getLng());
            double m = km * 1000;
            String s = convertToFriendlyUnit(m);
            seatMap.put(activity.getName(),s);
//            System.out.println("Activity: " + activity.getName() + ", Distance: " + DistanceCalculator.calculateDistance(userLat, userLng, activity.getLat(), activity.getLng()) + " km");
        }

        System.out.println(seatMap);


    }


    public static String getDistance(String userPoi,String targetPoi){
        if(StringUtils.isBlank(userPoi)){
            return "附近";
        }else if(StringUtils.isNotBlank(targetPoi)){
            String[] split = targetPoi.split(",");
            if(split.length == 2){
                double lat = Double.parseDouble(split[0]);
                double lng = Double.parseDouble(split[1]);
                String[] userLaction = userPoi.split(",");
                if(userLaction.length == 2){
                    double userLat = Double.parseDouble(userLaction[0]);
                    double userLng = Double.parseDouble(userLaction[1]);
                    return (DistanceCalculator.convertToFriendlyUnit(
                            DistanceCalculator.calculateDistance(userLat,userLng,lat,lng) * 1000
                    ));
                }else{
                    return "附近";
                }
            }else{
                return "附近";
            }
        }else{
            return "附近";
        }
    }

   
    public static String convertToFriendlyUnit(double meters) {
        if (meters >= 1000) {
            return String.format("%.1fkm", meters / 1000);
        } else {
            return String.format("%.1fm", meters);
        }
    }

    public static List<Activity> sortActivitiesByDistance(List<Activity> activities, double userLat, double userLng) {
        Comparator<Activity> distanceComparator = new Comparator<Activity>() {
            @Override
            public int compare(Activity activity1, Activity activity2) {
                double distance1 = DistanceCalculator.calculateDistance(userLat, userLng, activity1.getLat(), activity1.getLng());
                double distance2 = DistanceCalculator.calculateDistance(userLat, userLng, activity2.getLat(), activity2.getLng());
                return Double.compare(distance1, distance2);
            }
        };
        Collections.sort(activities, distanceComparator);
        return activities;
    }

    private static final double R = 6371;

    public static double calculateDistance(double userLat, double userLng, double eventLat, double eventLng) {
        double dLat = toRadians(eventLat - userLat);  
        double dLng = toRadians(eventLng - userLng);  
        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(toRadians(userLat)) * Math.cos(toRadians(eventLat)) * Math.sin(dLng / 2) * Math.sin(dLng / 2);  
        double c = 2 * FastMath.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        return R * c; // R is the radius of the Earth (approximate value is 6371 km)  
    }  
  
    private static double toRadians(double degrees) {  
        return degrees * FastMath.PI / 180;  
    }

    public static Double getDistanceMi(String userPoi, String targetPoi) {
        if(StringUtils.isBlank(userPoi)){
            return 9999d;
        }else if(StringUtils.isNotBlank(targetPoi)){
            String[] split = targetPoi.split(",");
            if(split.length == 2){
                double lat = Double.parseDouble(split[0]);
                double lng = Double.parseDouble(split[1]);
                String[] userLaction = userPoi.split(",");
                if(userLaction.length == 2){
                    double userLat = Double.parseDouble(userLaction[0]);
                    double userLng = Double.parseDouble(userLaction[1]);
                    return DistanceCalculator.calculateDistance(userLat,userLng,lat,lng);
                }else{
                    return 9999d;
                }
            }else{
                return 9999d;
            }
        }else{
            return 9999d;
        }
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    static class Activity {
        private String name;
        private double lat; // 活动地点的纬度
        private double lng; // 活动地点的经度
        // 构造函数、getter和setter方法...
    }
}
文章来源:https://blog.csdn.net/u014131617/article/details/135744767
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。