Найти вторую ближайшую точку в наборе данных - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть 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?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вы можете сделать это так, используя эту функцию клавиш с 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}]
0 голосов
/ 19 ноября 2018

На самом деле, вы можете попробовать просто заменить мин на отсортированные

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...