java SpringBoot实现根据经纬度算经纬度之间的距离。

该篇文章介绍了如何在Java中使用Haversine公式计算基于二维数组表示的点之间的经纬度距离,通过遍历并累加每个点对之间的距离,最后返回总距离,单位为米。
摘要由CSDN通过智能技术生成

项目中有个需求是需求是根据点与点之间的经纬度的数据,算出总距离。数据结构是二维数组。其实就是使用半正矢(Haversine)公式去做的计算。

 


import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

/**
 * <p>
 * 根据经纬度计算总距离
 * </p>
 *
 * @author Lch
 * @dateTime 2024/2/18 13:03
 */
public class HaversineDistance {

    /**
     * 地球的平均半径
     */
    private static final double EARTH_RADIUS = 6371.0;

    /**
     * 计算距离
     * @param points 数据
     * @return 米
     */
    public String haversineDistance(List<List<Double>> points) {
        BigDecimal totalDistance = BigDecimal.ZERO;
        for (int i = 0; i < points.size() - 1; i++) {
            List<Double> point1 = points.get(i);
            List<Double> point2 = points.get(i + 1);
            double lat1 = point1.get(0);
            double lon1 = point1.get(1);
            double lat2 = point2.get(0);
            double lon2 = point2.get(1);

            // 将经纬度转换为弧度
            double lat1Rad = Math.toRadians(lat1);
            double lon1Rad = Math.toRadians(lon1);
            double lat2Rad = Math.toRadians(lat2);
            double lon2Rad = Math.toRadians(lon2);

            // 计算经纬度差
            double dLat = lat2Rad - lat1Rad;
            double dLon = lon2Rad - lon1Rad;

            // 使用 Haversine 公式计算距离
            double a = Math.pow(Math.sin(dLat / 2), 2) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.pow(Math.sin(dLon / 2), 2);
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
            double distanceBetweenPoints = EARTH_RADIUS * c;

            // 计算距离并累加
            totalDistance = totalDistance.add(BigDecimal.valueOf(distanceBetweenPoints));
        }
        // 转换为米并保留两位小数
        return totalDistance.multiply(BigDecimal.valueOf(1000)).setScale(2, RoundingMode.UP).toString();
    }
}

测试:结果单位是米。 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目一Spark离线处理本项目来源于企业级电商网站的大数据统计分析平台,该平台以 Spark 框架为核心,对电商网站的日志进行离线和实时分析。 该大数据分析平台对电商网站的各种用户行为(访问行为、购物行为、广告点击行为等)进行分析,根据平台统计出来的数据,辅助公司中的 PM(产品经理)、数据分析师以及管理人员分析现有产品的情况,并根据用户行为分析结果持续改进产品的设计,以及调整公司的战略和业务。最终达到用大数据技术来帮助提升公司的业绩、营业额以及市场占有率的目标。 本项目使用了 Spark 技术生态栈中最常用的三个技术框架,Spark Core、Spark SQL 和 Spark Streaming,进行离线计算和实时计算业务模块的开发。实现了包括用户访问 session 分析、页面单跳转化率统计、热门商品离线统计、广告流量实时统计 4 个业务模块。通过合理的将实际业务模块进行技术整合与改造,该项目几乎完全涵盖了 Spark Core、Spark SQL 和 Spark Streaming 这三个技术框架中大部分的功能点、知识点,学员对于 Spark 技术框架的理解将会在本项目中得到很大的提高。 项目二Spark实时处理项目简介对于实时性要求高的应用,如用户即时详单查询,业务量监控等,需要应用实时处理架构项目场景对于实时要求高的应用、有对数据进行实时展示和查询需求时项目技术分别使用canal和kafka搭建各自针对业务数据库和用户行为数据的实时数据采集系统,使用SparkStreaming搭建高吞吐的数据实时处理模块,选用ES作为最终的实时数据处理结果的存储位置,并从中获取数据进行展示,进一步降低响应时间。 
可以使用Java API获取经纬度信息,具体实现步骤如下: 1.引入相关的依赖包,如SpringBoot-starter-web和geotools等。 2.编写一个Controller,提供RESTful接口。 3.在Controller中注入一个GeocodingService,该服务用于将地址转换为经纬度。 4.编写一个简单的前端页面,用于获取用户输入的地址信息。 5.在前端页面中,使用AJAX技术将用户输入的地址信息传递到Controller中,然后调用GeocodingService将地址转换为经纬度信息,并返回给前端页面展示。 下面是一个简单的实现代码: 1.引入相关的依赖包: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-epsg-hsql</artifactId> <version>22.1</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-geojson</artifactId> <version>22.1</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-geocaching</artifactId> <version>22.1</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-epsg-wkt</artifactId> <version>22.1</version> </dependency> ``` 2.编写一个Controller: ```java @RestController public class GeocodeController { @Autowired private GeocodingService geocodingService; @GetMapping(value = "/geocode") public ResponseEntity<?> getGeocode(@RequestParam String address) { try { Point2D.Double point = geocodingService.geocode(address); Map<String, Object> response = new HashMap<>(); response.put("latitude", point.y); response.put("longitude", point.x); return ResponseEntity.ok(response); } catch (Exception e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); } } } ``` 3.注入GeocodingService: ```java @Service public class GeocodingService { public Point2D.Double geocode(String address) throws Exception { Geocoder geocoder = new Geocoder(); GeocoderRequest geocoderRequest = new GeocoderRequestBuilder() .setAddress(address) .setLanguage("zh-CN") .getGeocoderRequest(); GeocodeResponse geocoderResponse = geocoder.geocode(geocoderRequest); GeocoderResult result = geocoderResponse.getResults().get(0); LatLng location = result.getGeometry().getLocation(); return new Point2D.Double(location.getLng().doubleValue(), location.getLat().doubleValue()); } } ``` 4.编写前端页面: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>获取经纬度</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> </head> <body> <form> <label>地址:</label> <input type="text" id="address" name="address"> <br> <button type="button" onclick="getGeocode()">获取经纬度</button> </form> <br> <div id="result"></div> <script> function getGeocode() { let address = $('#address').val().trim(); if(!address){ alert('请输入地址!'); return; } $.ajax({ url: '/geocode?address='+encodeURI(address), type: 'GET', contentType: "application/json", success: function (data) { console.log(data); $('#result').empty().html('经度:'+data.longitude+' 纬度:'+data.latitude); }, error: function (xhr, textStatus, errorThrown) { console.log(xhr); console.log(textStatus); console.log(errorThrown); $('#result').empty().html(xhr.responseJSON); } }); } </script> </body> </html> ``` 以上就是一个简单的获取经纬度实现,当用户在前端页面中输入地址后,点击“获取经纬度”按钮即可向后端发送请求,后端将地址转换成经纬度并返回给前端,最终在页面上展示出经纬度信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值