用java写:求地球上任意两个点之间的距离,知道这两个点的经纬度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java写:求地球上任意两个点之间的距离,知道这两个点的经纬度相关的知识,希望对你有一定的参考价值。

北京 116.407288 39.904549
北京市;东城区;台基厂头条东160米;中国太平洋经济合作全国委员会;中国军控与裁军协会;

陕西 108.952736 34.264648
陕西省;西安市;新城区;新城国际(西安)东南110米;ATM(中国银行)西南110米;陕西三力工贸公司公共安全工程部东南90米;
你看看这两个点的距离是多少???
下边是我查到的东西。。。我算出来的和awnhdy给的公式算出来的差距挺大。。。。
北京西到西安铁路距离1200公里。
2 北京火车站---西安火车站地图直线距离929.1公里。

3 公路距离(北京火车站---西安火车站):
总距离962.04公里

double radius=6371000;
double distance=radius*Math.acos((Math.cos(lat2)*Math.cos(lat2)*Math.cos(lon1-lon2)+Math.sin(lat1)*Math.sin(lat2)));
这是我的计算公式,在java里,结果是5995217.512567182m

距离可以用r*arccos[cos(y1)*cos(y2)*cos(x1x2)+sin(y1)*sin(y2)]来算
r是地球半径6370km,x是经度,y是纬度

注意角度单位的转换。Math类里的sin和cos函数的参数是以弧度为单位的角度,所以x1、x2、y1、y2要用弧度表示,但一般经纬度都是用角度表示(如X1=120 东经120度)就要化成弧度(x1*Pi/180)
而acos函数返回值正好是以弧度为单位的,刚好符合要求

如果你的代码里的lat1、lat2、lon1、lon2单位是角度,可以这么改
double radius=6371000;
double distance=radius*Math.acos((Math.cos(lat2*Math.PI/180)*Math.cos(lat2*Math.PI/180)*Math.cos(lon1*Math.PI/180-lon2*Math.PI/180)+Math.sin(lat1*Math.PI/180)*Math.sin(lat2*Math.PI/180)));

我算出来是903.9千米
参考技术A 北京 116.407288 39.904549
北京市;东城区;台基厂头条东160米;中国太平洋经济合作全国委员会;中国军控与裁军协会;

陕西 108.952736 34.264648
陕西省;西安市;新城区;新城国际(西安)东南110米;ATM(中国银行)西南110米;陕西三力工贸公司公共安全工程部东南90米;
你看看这两个点的距离是多少???
下边是我查到的东西。。。我算出来的和awnhdy给的公式算出来的差距挺大。。。。
北京西到西安铁路距离1200公里。
2 北京火车站---西安火车站地图直线距离929.1公里。

3 公路距离(北京火车站---西安火车站):
总距离962.04公里
参考技术B 如果是同一纬度的话:纬度差.111.cos纬度数
否者没有纬度算不了

Python 优雅地利用两点经纬度计算地理空间距离

一、基本原理

处理地理数据时,经常需要用到两个地理位置间的距离。比如 A 点经纬度(30.553949,114.357399),B点经纬度(129.1344,25.5465),求 AB 两点之间的距离。

已知地球上任意两点(lng1,lat1),(lng2, lat2)的经纬度坐标,求两点间的距离可以利用 haversine 公式:

  • 首先先将经纬度坐标的角度化成弧度(rlng1,rlat1),(rlng2,rlat2)

  • 利用如下公式:

  • 其中 a 表示两点维度的差值,即 a = rlat1 - rlat2, b表示两点经度的差值,即 b = rlng1 - rlng2;其中 r 表示地球的半径

网址:https://map.baidu.com/search/%E5%85%A8%E5%9B%BD/

利用百度地图测距可知,清华大学与北京大学距离大约为1.8km,如下所示:

二、获取地点的经纬度

主要利用高德地图地理编码 / 逆地理编码 API 来获取北京大学和清华大学的经纬度,Python实现如下:

# -*- coding: UTF-8 -*-
"""
@Author  :叶庭云
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import requests
import json
from pprint import pprint

url = 'https://restapi.amap.com/v3/geocode/geo'       # 输入API问号前固定不变的部分
params = {'key': '换成您的key',                       # 注册高德地图,创建应用获得的key
          'address': '清华大学'}                      # 将两个参数放入字典
res = requests.get(url, params)

# pprint(json.loads(res.text))
results = json.loads(res.text)
# 打印结果
print(results["geocodes"][0]["formatted_address"] + ":" + results["geocodes"][0]["location"])

结果如下:

  • 北京市海淀区北京大学经纬度:116.308264,39.995304
  • 北京市海淀区清华大学经纬度:116.326759,40.003304

三、手写 haversine 公式计算

Python代码如下:

from math import sin, asin, cos, radians, fabs, sqrt

EARTH_RADIUS = 6371      # 地球平均半径大约6371km


def hav(theta):
    s = sin(theta / 2)
    return s * s


def get_distance_hav(lat0, lng0, lat1, lng1):
    # 用haversine公式计算球面两点间的距离
    # 经纬度转换成弧度
    lat0 = radians(lat0)
    lat1 = radians(lat1)
    lng0 = radians(lng0)
    lng1 = radians(lng1)
    dlng = fabs(lng0 - lng1)
    dlat = fabs(lat0 - lat1)
    h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng)
    distance = 2 * EARTH_RADIUS * asin(sqrt(h))      # km
    return distance

result = get_distance_hav(39.995304, 116.308264, 40.003304, 116.326759)
print("距离:{:.2f}km".format(result))

结果如下:

四、利用 geopy 库

geopy是一个关于地理编码的 Python 库。主要有以下几个功能:

  • 地理编码:将字符串转换为地理位置
  • 逆地理编码:用于将地理坐标转换为具体地址
  • 计算两个点的距离:经纬度距离和球面距离

pip install安装上即可

pip install geopy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

Python代码如下:

from geopy.distance import geodesic


distance = geodesic((39.995304, 116.308264), (40.003304, 116.326759)).km  
print("距离:{:.3f}km".format(distance))

对比结果如下:

手写 haversine 公式计算距离为:1.809km,而直接调用 geopy 库的 geodesic 方法计算距离为:1.812km,二者计算结果相差很小。

更多有关 geopy 的使用可以学习官方文档: https://www.osgeo.cn/geopy/

五、利用 haversine 库

pypi地址:https://pypi.org/project/haversine/

Calculate the distance (in various units) between two points on Earth using their latitude and longitude.

用经纬度计算地球上两点之间的距离(以不同单位表示),pip install安装即可:

Python代码如下:

import haversine

print(tuple(haversine.Unit))   # 查看所有可用的单位
from haversine import haversine, Unit

# 两点的经纬度
point1 = (39.995304, 116.308264)
point2 = (40.003304, 116.326759)
result1 = haversine(point1, point2, unit=Unit.KILOMETERS)    # km
result2 = haversine(point1, point2, unit=Unit.METERS)        # m
# 打印计算结果
print("距离:{:.3f}km".format(result1))
print("距离:{:.3f}m".format(result2))

结果如下:

利用 haversine 库计算距离的结果与手写 haversine 计算的结果一致!

以上是关于用java写:求地球上任意两个点之间的距离,知道这两个点的经纬度的主要内容,如果未能解决你的问题,请参考以下文章

Python 优雅地利用两点经纬度计算地理空间距离

经纬度计算距离公式

计算两个经纬度之间的距离

Java 计算经纬度是否在某个范围之内

求java实现矩阵图上任意两点的最短路径源码

java求两点距离