Python距离(以英里为单位)到两个gps坐标之间的欧几里得距离
我正在尝试提出一个函数,其中…Python距离(以英里为单位)到两个gps坐标之间的欧几里得距离,python,gis,Python,Gis,我正在尝试提出一个函数,其中… 输入:以英里或公里为单位的测地距离 输出:任意两个gps点之间的欧几里德距离,即输入距离 我觉得我有一些组件 import numpy as np from numpy import linalg as LA from geopy.distance import geodesic loc1 = np.array([40.099993, -83.166000]) loc2 = np.array([40.148652, -82.903962]) 这是这两点之间的欧
输入:以英里或公里为单位的测地距离
输出:任意两个gps点之间的欧几里德距离,即输入距离 我觉得我有一些组件
import numpy as np
from numpy import linalg as LA
from geopy.distance import geodesic
loc1 = np.array([40.099993, -83.166000])
loc2 = np.array([40.148652, -82.903962])
这是这两点之间的欧几里德距离
LA.norm(loc1-loc2)
#0.2665175636332336
geodesic(loc1,loc2).miles
#14.27909749425243
这是这两点之间的测地距离(以英里为单位)
LA.norm(loc1-loc2)
#0.2665175636332336
geodesic(loc1,loc2).miles
#14.27909749425243
我的脑子现在快没电了,有人知道我该怎么做吗
geodesic_to_euclidean(14.27909749425243)
#0.2665175636332336
如评论中所述,如果你对一个大的圆距离感到满意,那么这应该是可行的。这是哈弗森距离:
def haversine(origin, destination, units='mi'):
# Radian deltas
origin_lat = radians(float(origin[0]))
origin_lon = radians(float(origin[1]))
destination_lat = radians(float(destination[0]))
destination_lon = radians(float(destination[1]))
lat_delta = destination_lat - origin_lat
lon_delta = destination_lon - origin_lon
# Radius of earth in meters
r = 6378127
# Haversine formula
a = sin(lat_delta / 2) ** 2 + cos(origin_lat) * \
cos(destination_lat) * sin(lon_delta / 2) ** 2
c = 2 * asin(sqrt(a))
meters_traveled = c * r
scaling_factors = {
"m:": 1,
"km": 1 / 1000,
"ft": 3.2808, # meters to feet
"mi:": 0.000621371 # meters to miles
}
return meters_traveled * scaling_factors[units]
如果已经有以米为单位的测地线(大圆)距离,并且需要弦长,则可以执行以下操作
def chord(geodesic_distance):
"""
Chord length
C = 2 * r * sin(theta/2)
Arc length; which is geodesic distance in this case
AL = R * theta
therefore
C = 2 * R * sin(AL/(2*R))
"""
r = 6378127 # Radius of earth in meters
return 2 * r * sin(geodesic_distance / (2 * r))
假设地球表面是一个球体,你想知道连接两个地理位置的弧的距离吗?我只看50英里以内的范围,所以我认为假设平坦的表面也是公平的?
LA.norm
无论如何都不会给你正确的值,因为你没有使用笛卡尔坐标系。你需要计算两个位置之间相对于地球中心的角度(弧度),然后乘以地球的半径。所以我使用欧几里德距离作为聚类算法DBSCAN中的一个参数。算法中输入的唯一维度是纬度和经度。所以我不需要欧几里德距离来表示任何真实的东西,只需要任意两个向量之间的2-范数距离。这有问题吗?…我对地理信息系统的东西非常陌生…@Jamalan你越接近极点,就会失去准确性。这也是墨卡托地图投影将南极洲炸得比实际大得多的原因。参考:@Jamalan绝对不是均匀分布的网格。我知道这可能不像你脑子里想的那样,但你所说的是问同一角度的弦和弧之间的长度差。对于小角度(相对于地球半径的小距离),这种差异将是最小的。@Jamalanc
已经是以弧度表示的角度了。只要乘以180/pi@Jamalan请参见以上关于弦长的编辑。Aaron是对的,但对于地球表面的近距离而言,这将是最小的不同,你们这些家伙真是太棒了。这是堆栈溢出的好部分。不愤世嫉俗、乐于助人的人。非常感谢你们两位。我将把你的智慧和代码转换成一个光滑的辅助函数。