2017-10-09 33 views
3

給出一個JSON文件的JSON列表上最近的位置,由於緯度/長,查找基於經/緯

{"BusStopCode": "00481", "RoadName": "Woodlands Rd", "Description": "BT PANJANG TEMP BUS PK", "Latitude": 1.383764, "Longitude": 103.7583}, 
{"BusStopCode": "01012", "RoadName": "Victoria St", "Description": "Hotel Grand Pacific", "Latitude": 1.29684825487647, "Longitude": 103.85253591654006} 

,等等..

的各種

巴士站,我我試圖基於5000個總線的這個名單上找到最近的巴士站與指定緯度/長使用給定的公式任何用戶停止

import math 
R = 6371000 #radius of the Earth in m 
x = (lon2 - lon1) * cos(0.5*(lat2+lat1)) 
y = (lat2 - lat1) 
d = R * sqrt(x*x + y*y) 

我的問題是,對於LAT1和lon1用戶輸入,我會怎樣能夠計算所有的距離在lat1 lon1和lat2 lon2之間(其中lat2 lon2將取json文件中所有5000 lat/lon的值),然後打印最低的5個距離?

我想過使用list.sort,但我不知道如何能夠使用python計算所有5000個距離。

非常感謝。

編輯

與埃裏克Duminil的代碼,下面的代碼工作適合我的需要。

from math import cos, sqrt 
import sys 
import json 
busstops = json.loads(open("stops.json").read()) 
R = 6371000 #radius of the Earth in m 
def distance(lon1, lat1, lon2, lat2): 
    x = (lon2-lon1) * cos(0.5*(lat2+lat1)) 
    y = (lat2-lat1) 
    return R * sqrt(x*x + y*y) 
buslist = sorted(busstops, key= lambda d: distance(d["Longitude"], d["Latitude"], 103.5, 1.2)) 
print(buslist[:5]) 

其中來自buslist的103.5,1.2是示例用戶輸入經度緯度。

+0

只是檢查出https://pypi.python.org /的PyPI/geopy。你可能會找到一種方法來獲得某種方式。另請查看此評論https://stackoverflow.com/a/19412565/6165783 –

+0

謝謝你的鏈接。然而,我並不關心2 lat/lon之間距離的計算,而是 - 用戶給出緯度/經度,我怎樣才能找到最近的5個公交站點,並且有一個5000個巴士站的json文件。 –

+0

道歉,如果我的問題不好措辭 –

回答

2

你可以簡單地定義一個函數來計算距離,並用它來進行排序與​​key參數巴士站:

from math import cos, sqrt 

R = 6371000 #radius of the Earth in m 
def distance(lon1, lat1, lon2, lat2): 
    x = (lon2 - lon1) * cos(0.5*(lat2+lat1)) 
    y = (lat2 - lat1) 
    return R * sqrt(x*x + y*y) 

bustops = [{"BusStopCode": "00481", "RoadName": "Woodlands Rd", "Description": "BT PANJANG TEMP BUS PK", "Latitude": 1.383764, "Longitude": 103.7583}, 
{"BusStopCode": "01012", "RoadName": "Victoria St", "Description": "Hotel Grand Pacific", "Latitude": 1.29684825487647, "Longitude": 103.85253591654006}] 

print(sorted(bustops, key= lambda d: distance(d["Longitude"], d["Latitude"], 103.5, 1.2))) 
# [{'BusStopCode': '01012', 'RoadName': 'Victoria St', 'Description': 'Hotel Grand Pacific', 'Latitude': 1.29684825487647, 'Longitude': 103.85253591654006}, {'BusStopCode': '00481', 'RoadName': 'Woodlands Rd', 'Description': 'BT PANJANG TEMP BUS PK', 'Latitude': 1.383764, 'Longitude': 103.7583}] 

一旦這個列表進行排序,你可以簡單地提取與[:5] 5個最近的公交站。 它應該足夠快,即使有5000個巴士站。

需要注意的是,如果你不關心具體的距離,而是隻想排序公交車站,你可以使用這個功能鍵:

def distance2(lon1, lat1, lon2, lat2): 
    x = (lon2 - lon1) * cos(0.5*(lat2+lat1)) 
    y = (lat2 - lat1) 
    return x*x + y*y 
+0

謝謝,這正是我需要的。然而,當我嘗試[:5]時,我有以下錯誤:'NoneType'對象不是可訂閱的 –

+0

已更改代碼並工作(請參閱問題文章) –