我有两个数据帧,每个数据帧都有一组坐标。 Dataframe 1
是生物量站点列表,坐标列为“lat”和“lng”列。 Dataframe 2
是一个邮政编码坐标列表,链接到销售价格,坐标列为'pc_lat'和'pc_lng'。
我使用this stackoverflow question来计算每个属性最近的生物量站点。这是我正在使用的代码:
def dist(lat1, long1, lat2, long2):
return np.abs((lat1-lat2)+(long1-long2))
def find_site(lat, long):
distances = biomass.apply(
lambda row: dist(lat, long, row['lat'], row['lng']),
axis=1)
return biomass.loc[distances.idxmin(),'Site Name']
hp1995['BiomassSite'] = hp1995.apply(
lambda row: find_site(row['pc_lat'], row['pc_long']),
axis=1)
print(hp1995.head())
这很有效,因为我得到了最近的生物质生成站点的名称,但是我想知道这两个站点之间的距离。
我如何计算距离?
输出距离是多少?我想在生物质场地2公里范围内寻找物业。
答案 0 :(得分:2)
要计算两个全球坐标之间的距离,您应该使用Haversine Formula,基于this页面,我已实施以下方法:
import math
def distanceBetweenCm(lat1, lon1, lat2, lon2):
dLat = math.radians(lat2-lat1)
dLon = math.radians(lon2-lon1)
lat1 = math.radians(lat1)
lat2 = math.radians(lat2)
a = math.sin(dLat/2) * math.sin(dLat/2) + math.sin(dLon/2) * math.sin(dLon/2) * math.cos(lat1) * math.cos(lat2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
return c * 6371 * 100000 #multiply by 100k to get distance in cm
您也可以通过乘以10的不同幂来修改它以返回不同的单位。在示例中,乘以100k会产生以厘米为单位的单位。如果没有乘法,则以km为单位返回距离。如果需要,您可以从那里执行更多的单位转换。
编辑:正如评论中所建议的,一个可能的优化是使用幂运算符而不是常规乘法,如下所示:
a = math.sin(dLat/2)**2 + math.sin(dLon/2)**2 * math.cos(lat1) * math.cos(lat2)
看一下this问题,阅读更多关于python中计算能力的速度复杂性的更多信息。