pflaenz.li/pflaenzli/pflaenzli/utils/distance.py
Jannis Portmann b9fa20e4d6
All checks were successful
continuous-integration/drone/push Build is passing
Overhaul PLZ
2023-10-15 00:29:21 +02:00

36 lines
918 B
Python

from geopy.distance import distance
import os
from pandas import read_pickle
from django.db.models import F, Func
from pflaenzli.models import Plz
path = os.path.dirname(os.path.abspath(__file__))
df = read_pickle(os.path.join(path, 'plz.pkl'))
def calculate_distance(plz_1: Plz, plz_2: Plz):
if plz_1 == plz_2:
return 0
dist = round(distance((plz_1.lat, plz_1.lon), (plz_2.lat, plz_2.lon)).kilometers)
return None if dist > 400 else dist
def filter_by_distance(qs, filter_zipcode, max_dist):
filtered_offers = []
try:
filter_plz = Plz.objects.get(plz=filter_zipcode)
except Plz.DoesNotExist:
return filtered_offers
for offer in qs:
offer_plz = Plz.objects.get(plz=offer.zipcode)
d = calculate_distance(offer_plz, filter_plz)
if d is not None and d <= max_dist:
filtered_offers.append(offer)
return filtered_offers