根据两点的经纬度坐标计算两个坐标点之间的直线距离

时间:2022-08-02 19:52:34

贴代码如下:

package com.qcsd.xulin.util;

import java.awt.*;

/**
 * @author xulin
 * @date create in 9:06 2018/11/1
 * Description 根据提供的两个国标经纬度,计算两个点之间的距离
 */
public class DistanceConsider {
    // 地球半径
    private static double EARTH_RADIUS = 6378.137;

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * @author xulin
     * date 9:09 2018/11/1
     * Description 计算距离
     * 参数传入:所在位置的坐标  目标位置的坐标
     * 一个参数的经纬之前要求使用","英文的逗号进行分隔
     * 返回: 输入的两个坐标点之间的距离  精确到小数点后两位
     */
    public static double getDistance(String location, String target) {
        int locationCount = location.indexOf(",");
        // 源地点的经度
        double lngLocation = Double.parseDouble(location.substring(0, locationCount));
        // 源地点的维度
        double latLocation = Double.parseDouble(location.substring(locationCount + 1, location.length()));
        int targetCount = target.indexOf(",");
        // 目标地点的经度
        double lngTarget = Double.parseDouble(target.substring(0, targetCount));
        // 目标地点的维度
        double latTarget = Double.parseDouble(target.substring(targetCount + 1, target.length()));

        double lat1 = rad(latLocation);
        double lat2 = rad(latTarget);
        double lat = lat1 - lat2;
        double lng = rad(lngLocation) - rad(lngTarget);
        double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(lat / 2), 2)
                + Math.cos(lat1) * Math.cos(lat2)
                * Math.pow(Math.sin(lng / 2), 2)));
        distance = distance * EARTH_RADIUS;
        distance = Math.round(distance * 10000d) / 10000d;
        distance = distance * 1000;
        return distance;
    }

    public static void main(String args[]) {
        String location = "116.368904, 39.923423";
        String target = "116.387271, 39.922501";
        System.out.println(getDistance(location, target));
    }
}

刚开始一直计算错误,是自己没有区分经纬度,地理是硬伤,谷歌的公式是对的,网上的大部分方法也是对的, 如果计算之后发现了较大的误差,记得查看经纬度是否计算反了,避免低级错误~~~~