[英]Calculating geographic distance between a list of coordinates (lat, lng)
我正在編寫一個燒瓶應用程序,使用從GPS傳感器中提取的一些數據。 我能夠在地圖上繪制路線,我想計算GPS傳感器行進的距離。 一種方法是獲得開始和結束坐標,但是由於傳感器行進的方式,這是非常不准確的。 因此,我對每50個傳感器樣本進行采樣。 如果實際傳感器樣本大小為1000,我現在將有20個樣本(通過提取每50個樣本)。
現在我希望能夠通過函數放置我的樣本列表來計算距離。 到目前為止,我已經能夠使用包的geopy,但是當我采用大型gps樣本集時,我確實會收到“請求太多”的錯誤,更不用說處理請求會有額外的處理時間,這不是我的意思。想。
有沒有更好的方法來計算包含緯度和經度坐標的列表元素的累積距離?
positions = [(lat_1, lng_1), (lat_2, lng_2), ..., (lat_n, lng_n)]
我找到了許多不同數學方法的方法,只用2個坐標(lat1,lng1和lat2和lng2)計算距離,但沒有一個支持坐標列表。
這是我使用geopy的當前代碼:
from geopy.distance import vincenty
def calculate_distances(trips):
temp = {}
distance = 0
for trip in trips:
positions = trip['positions']
for i in range(1, len(positions)):
distance += ((vincenty(positions[i-1], positions[i]).meters) / 1000)
if i == len(positions):
temp = {'distance': distance}
trip.update(temp)
distance = 0
trips
是含有約一個行程的信息的鍵-值對(持續時間,距離,啟動和停止的坐標等)的字典的列表元素和位置對象內部行程是元組的坐標的列表如上述可視化。
trips = [{data_1}, {data_2}, ..., {data_n}]
我建議將你的(x,y)坐標轉換成復數,因為計算距離更容易計算。 因此,以下功能應該起作用:
def calculate_distances(trips):
for trip in trips:
positions = trip['positions']
c_pos = [complex(c[0],c[1]) for c in positions]
distance = 0
for i in range(1, len(c_pos)):
distance += abs(c_pos[i] - c_pos[i-1])
trip.update({'distance': distance})
我正在做的是將每個(lat_1, lng_1)
touple轉換為單個復數c1 = lat_1 + j*lng_1
,並創建一個由[c1, c2, ... , cn]
組成的列表。
總的來說,復數是一個二維數,因此,如果你有二維坐標,你就可以做到這一點,這對於地理定位來說是完美的,但對於三維空間坐標是不可能的。
一旦你得到了這個,你就可以很容易地計算出兩個復數c1
和c2
之間的距離,因為dist12 = abs(c2 - c1)
。 遞歸地執行此操作可獲得總距離。
希望這有幫助!
這是我最終使用的解決方案。 如果你想查找它為自己做的事情,它被稱為Haversine(距離)功能。
我也改變了一點方法。 我的輸入( positions
)是元組坐標列表:
def calculate_distance(positions):
results = []
for i in range(1, len(positions)):
loc1 = positions[i - 1]
loc2 = positions[i]
lat1 = loc1[0]
lng1 = loc1[1]
lat2 = loc2[0]
lng2 = loc2[1]
degreesToRadians = (math.pi / 180)
latrad1 = lat1 * degreesToRadians
latrad2 = lat2 * degreesToRadians
dlat = (lat2 - lat1) * degreesToRadians
dlng = (lng2 - lng1) * degreesToRadians
a = math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(latrad1) * \
math.cos(latrad2) * math.sin(dlng / 2) * math.sin(dlng / 2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
r = 6371000
results.append(r * c)
return (sum(results) / 1000) # Converting from m to km
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.