Как сортировать и вывести в список места по возрастанию смотря на дистанцию от геопозиции пользователя на python с помощью geopy?
У меня есть словарь в котором координаты различных мест:
STORES: Tuple[dict, ...] = (
{'title': 'Besh Yogʻoch Savdo',
'lons': '41.304679',
'lats': '69.247453',
'address': 'Oziq-ovqat'},
{'title': 'Бахт: колбасы и деликатесы',
'lons': '41.293083',
'lats': '69.212116',
'address': 'Oziq-ovqat'},
{'title': 'Eco - mini market?',
'lons': '41.305242',
'lats': '69.235547',
'address': 'Oziq-ovqat'},
)
И обработчик принятого местоположения от пользователя телеграм:
def uz_shop_view(message: telebot.types.Message):
if message.location is not None:
lon: float = message.location.longitude
lat: float = message.location.latitude
distance: List[...] = []
for loc in STORES:
result: float = geodesic(
(loc['lons'], loc['lats']), (lon, lat)).meters
distance.append(result)
index = distance.index(min(distance))
bot.send_venue(message.chat.id,
STORES[index]['lons'],
STORES[index]['lats'],
STORES[index]['title'],
STORES[index]['address'])
elif message.location is None:
bot.reply_to(message, "Отправь местоположение!")
И вот вопрос:
Как сделать так чтобы тг бот после получения геопозиции отправил в ответ все места списком из словаря отсортировав его в порядке возрастания смотря на расстояние от него?
библиотека: telebot, geopy
Ответы (1 шт):
Автор решения: BlueScreen
→ Ссылка
Расстояние я планирую оценивать по формуле a = sin(Deltalat/2)**2 + cos(lat1) * cos(lat2) * sin(Deltalon/2)**2
lon1: float = message.location.longitude
lat1: float = message.location.latitude
result = []
for shop in stories:
lat2 = shop["lats"]
lon2 = shop["lons"]
dlon = lon2 - lon1
dlat = lat2 - lat1
alpha = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 #Угол между точками
distance = 2 * asin(sqrt(alpha))
result.append(
{'title': shop["title"],
'lons': shop["lons"],
'lats': shop["lats"],
'address': shop["address"],
'distance': distance
}
Теперь мы получили массив словариков result. Отсортируем его при помощи lambda функции
result = sorted(result, key=lambda k: k['distance'])
Теперь отправим его пользователю
bot.send_venue(message.chat.id,
result['lons'],
result['lats'],
result['title'],
result['address'],
)