如题,直接上代码吧,需要的拿走。
# haversine公式计算两经纬度点距离
import math
import os
from DebugInfo.DebugInfo import *
_earthR: int = 6371393
class __距离类:
__m: float
def __init__(self,
m: float = 0):
self.__m = m
@property
def km(self) -> float:
return self.__m * 0.001
@km.setter
def km(self, 值: float):
self.__m = 值 * 1000
@property
def m(self) -> float:
return self.__m
@m.setter
def m(self, 值: float):
self.__m = 值
@property
def inch(self) -> float:
return self.__m * 39.3700787402
@inch.setter
def inch(self, 值: float):
self.__m = 值 / 39.3700787402
@property
def feet(self) -> float:
return self.__m * 3.280839895
@feet.setter
def feet(self, 值: float):
self.__m = 值 / 3.280839895
@property
def mi(self) -> float:
return self.__m * 0.00062137119224
@mi.setter
def mi(self, 值: float):
self.__m = 值 / 0.00062137119224
def __float__(self) -> float:
return self.__m
# 定义GPS距离解算函数
@秒表
def 球面距离m(基点纬度: float, 基点经度: float, 矢点纬度: float, 矢点经度: float) -> __距离类:
"""
haversine公式计算两个经纬度坐标点的球面距离, 单位m
https://blog.csdn.net/spatial_coder/article/details/116605509
:param 基点纬度: float
:param 基点经度: float
:param 矢点纬度: float
:param 矢点经度: float
:return: 距离类对象
"""
基点纬度 = math.radians(基点纬度)
矢点纬度 = math.radians(矢点纬度)
基点经度 = math.radians(基点经度)
矢点经度 = math.radians(矢点经度)
经度差 = math.fabs(基点经度 - 矢点经度)
纬度差 = math.fabs(基点纬度 - 矢点纬度)
def _hav(角差: float) -> float:
s = math.sin(角差 / 2)
return s * s
h = _hav(纬度差) + math.cos(基点纬度) * math.cos(矢点纬度) * _hav(经度差)
return __距离类(2 * _earthR * math.asin(math.sqrt(h)))
if __name__ == '__main__':
画板 = 调试模板()
上海坐标 = (121.48, 31.20)
北京坐标 = (116.40, 39.91)
画板.添加一行('上海坐标', 上海坐标)
画板.添加一行('北京坐标', 北京坐标)
画板.添加一行('两地距离/球面距离m', 球面距离m(上海坐标[1], 上海坐标[0], 北京坐标[1], 北京坐标[0]).km)
画板.添加一行('百度地图实测距离为:', '1070.30km').修饰行(黄字)
画板.分隔线.总长度(os.get_terminal_size().columns - len(画板.缩进字符) - len(画板.打印头)).修饰(黄字).展示()
画板.展示表格()
以上脚本运行如下:
偏差说明
以上计算所用的GPS数据彩集自 高德开放API, 距离测量来自百度地图,由于不在一个平台上拾取的坐标点,这可能是导致GPS距离计算结果为 1071km, 而距离测试结果为1070km,存在1km的偏差。