[英]Find the nearest point in distance for all the points in the dataset - Python
[英]Find the second nearest point in a dataset
我有2套緯度和經度。
A = [{'lat' :40.2877, 'lon' : -94.7913}, {'lat' :40.7171, 'lon' : -73.9664}, {'lat' :32.7052, 'lon' : -117.1897}, {'lat' :33.2388, 'lon' : -115.5045}, .... ]
B = [{'lat' :47.7351, 'lon' : -117.3705}, {'lat' :41.6422, 'lon' : -71.1706}]
我需要找到B
最近點,第二最近點和第三最近點。 為了找到最接近的值,我使用了:
from math import cos, asin, sqrt
def distance(lat1, lon1, lat2, lon2):
p = 0.017453292519943295
a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
return 12742 * asin(sqrt(a))
def closest(data, B):
return min(data, key=lambda p:distance(B['lat'],B['lon'],p['lat'],p['lon']))
for item in B:
print(closest(A, item))
如何找到B
每個項目的第二最接近點和第三最接近點?
實際上,您可以嘗試將min替換為sort
def second_nearst(data, B):
return sorted(
data, key=lambda p: distance(B['lat'], B['lon'], p['lat'], p['lon']))[1]
for item in B:
print(second_nearst(A, B))
def third_nearst(data, B):
return sorted(
data, key=lambda p: distance(B['lat'], B['lon'], p['lat'], p['lon']))[2]
for item in B:
print(third_nearst(A, B))
您可以這樣操作,將那個鍵函數與sorted()
而不是min()
:
from math import cos, asin, sqrt
from pprint import pformat
from textwrap import indent
A = [{'lat': 40.2877, 'lon': -94.7913},
{'lat': 40.7171, 'lon': -73.9664},
{'lat': 32.7052, 'lon': -117.1897},
{'lat': 33.2388, 'lon': -115.5045}]
B = [{'lat' :47.7351, 'lon' : -117.3705},
{'lat' :41.6422, 'lon' : -71.1706}]
def distance(lat1, lon1, lat2, lon2):
p = 0.017453292519943295 # Pi / 180
a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
return 12742 * asin(sqrt(a))
def nearest(N, data, pt2):
""" Return the nearest N points in data to pt2. """
return sorted(data, key=
lambda pt1: distance(pt2['lat'], pt2['lon'], pt1['lat'], pt1['lon']))[:N]
for item in B:
print(item, '->')
print(indent(pformat(nearest(3, A, item)), ' '))
輸出:
{'lat': 47.7351, 'lon': -117.3705} ->
[{'lat': 33.2388, 'lon': -115.5045},
{'lat': 32.7052, 'lon': -117.1897},
{'lat': 40.2877, 'lon': -94.7913}]
{'lat': 41.6422, 'lon': -71.1706} ->
[{'lat': 40.7171, 'lon': -73.9664},
{'lat': 40.2877, 'lon': -94.7913},
{'lat': 33.2388, 'lon': -115.5045}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.