首页 > 编程语言 >java实现 给定一个地址经纬度,一组地址经纬度,找出在范围内的地址,和最接近的地址

java实现 给定一个地址经纬度,一组地址经纬度,找出在范围内的地址,和最接近的地址

时间:2024-04-15 21:46:49浏览次数:27  
标签:java 经纬度 double 地址 lat1 targetCoords Math

package com.example.demo10;

import java.util.ArrayList;
import java.util.List;

/**
 * java实现 给定一个地址经纬度,一组地址经纬度,找出在范围内的地址,和最接近的地址
 *
 * @author longlinji
 * @date 2024/4/15
 */
public class GeoUtils {
    // 地球半径,单位为公里
    private static final double EARTH_RADIUS = 6371.0;

    // 使用哈弗辛公式计算两点之间的距离
    public static double haversineDistance(double lat1, double lon1, double lat2, double lon2) {
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);
        lat1 = Math.toRadians(lat1);
        lat2 = Math.toRadians(lat2);

        double a = Math.pow(Math.sin(dLat / 2), 2) + Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        return EARTH_RADIUS * c;
    }

    public static void findAddressesWithinRadius(double baseLat, double baseLon,
                                                 List<double[]> targetCoords,
                                                 double radius) {
        List<double[]> withinRadius = new ArrayList<>();
        double[] closestPoint = null;
        double minDistance = Double.MAX_VALUE;

        for (double[] coords : targetCoords) {
            double distance = haversineDistance(baseLat, baseLon, coords[0], coords[1]);

            if (distance <= radius) withinRadius.add(coords);

            if (distance < minDistance) {
                minDistance = distance;
                closestPoint = coords;
            }
        }

        System.out.println("Locations within " + radius + " km radius: ");
        for (double[] coords : withinRadius) System.out.println("Lat: " + coords[0] + ", Lon: " + coords[1]);

        if (closestPoint != null)
            System.out.println("Closest location is at Lat: " + closestPoint[0] + ", Lon: " + closestPoint[1]);
    }

    public static void main(String[] args) {
        double baseLat = 52.5200; // 例如柏林的经纬度
        double baseLon = 13.4050;

        // 一组经纬度坐标点
        List<double[]> targetCoords = new ArrayList<>();
        targetCoords.add(new double[]{52.5201, 13.4051}); // 非常接近的点
        targetCoords.add(new double[]{48.8566, 2.3522});  // 巴黎
        targetCoords.add(new double[]{51.5074, -0.1278}); // 伦敦

        double radius = 500.0; // 500公里范围内

        findAddressesWithinRadius(baseLat, baseLon, targetCoords, radius);
    }
}

 

标签:java,经纬度,double,地址,lat1,targetCoords,Math
From: https://www.cnblogs.com/lljboke/p/18136955

相关文章

  • JAVA语言学习-Day10、11、12
    参考教学视频:秦疆learnJava-JUC1.什么是JUCjava.util工具包、包、分类java.util.concurrentjava.util.concurrent.atomicjava.util.concurrent.locks2.线程和进程举例:开启一个Typora(进程),输入、自动保存(线程)进程:一个程序一个进程往往可以包含多个线程,至少包含一个线程:写......
  • Java进行excel的导入导出操作
    excel表格的导出导入在业务中经常会遇到,下面介绍hutool和easyExcel两种操作excel的工具测试的实体类通过mybatis-plus生成的,用于导出数据的实体类@Getter@Setter@TableName("device_info")@ApiModel(value="DeviceInfo对象",description="")publicclassDeviceInfo......
  • java连接ssmsSqlserver数据库 报错信息:com.microsoft.sqlserver.jdbc.SQLServerExce
    解决办法:将官网下载的驱动文件打开,找到如下路径,并复制,粘贴放到jdk的bin目录下......
  • 根据经纬度判断直线距离
    /***根据门店距离排序*@param$data*@paramstring$longitude经度*@paramstring$latitude纬度*@returnarray*/publicfunctionsortByDistance($longitude,$latitude){//根据距离排序$list=Db::table('benben_store_shop')->where('status',1)-......
  • java基础_05_流程控制
    1、用户交互Scanner(译:扫描器) 1\使用next方法接收,只接收空格以前的packageliuchengkongzhi;importjava.util.Scanner;publicclassScanner01{publicstaticvoidmain(String[]args){//创建一个扫描器对象,用于接收键盘数据ScannerSca......
  • Java使用javacv处理视频文件过程记录
    最近接到一个需求是将.mp4/.m4v文件体积进行压缩,我使用javacv中的FFmpegFrameGrabber、FFmpegFrameFilter、FFmpegFrameRecorder简单的实现视频帧的抓取、过滤、录制与输出。性能暂未验证。文章对这次的过程进行记录。1.jdk的选择mcr.microsoft.com/java/jdk:8u222-zulu-cento......
  • java中接口多个实现类,如何指定实现类,根据子类类型选择实现方法
    问题背景在Java代码中,经常会遇到一个接口有多个实现的情况。而这些实现类的参数又是不同的子类,这时候我们该如何选择正确的实现方法呢?解决方案我们可以通过判断参数的子类类型来选择正确的实现方法。具体实现可以使用Java中的instanceof关键字,它可以判断一个对象是否是某个类的......
  • Java并发编程实战读书笔记
    1.线程池模型    netty实战中讲到的线程池模型可以描述为:1.从线程池中选择一个空间的线程去执行任务,2.任务完成时,把线程归还给线程池。这个模型与连接池类似。    根据jdk源码的研究,具体的实现模型是,线程池ThreadPoolExecutor中有一个静态内部类Worker,使用装饰器模式扩......
  • java基础_03_包机制
    1、包的本质,就是文件夹 2、建包方法: packagecom.baidu.hhb;//这就是包,必须加在整个类的最上边,不能删,删除后下面的类就找不到包importxiaodi_java_base.*;//*通配符,可以导入该目录下所有的类。importxiaodi_java_base.khhhk;//导入类importjava.util.Date;......
  • day06_我的Java学习笔记 (综合应用专题课)
    专题课(综合案例)案例一:买飞机票案例二:找素数上述老师代码有点问题,即:j<i/2;应为j<=i/2;见如下判断:其实出问题的点,只会在i=4时,因为当i=4时,j<i/2:不成立,直接跳过该循环,执行步骤3的操作了。(当范围不是101-200,而是包含了4,则会出现上述的现象,因4不满......