Django & Geopy : all distance listed for each post : how to associated one distance to one post

Viewed 330

Django -- Geopy

I am looking for how to define a distance between two points. The first one is related to the post itself and does not change for each post. It indicates the position of the post. The second would be linked to the user's position.

I want to calculate distance btw Post and User.

ISSUE : Assume I get connected : all distance are listed for each post

I got for one post: [459.414, 459.414, 459.414, 0.605, 0.605, 0.605, 0.605, 0.605, 459.414, 0.605] km

user/models.py
        class UserProfile(models.Model):
            ...
            latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')
            longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')

post/models.py
    class Cuisine(models.Model):
         ...
         latitude_user = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')
         longitude_user = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')

Thanks to @tgrandje I've solved some issue to find value from UserProfile: The issue is I always get the same distance for each post. Any advice?

def Homemainpage(request):
    
    post = Cuisine.objects.filter(status=0).order_by('-publishing_date').all() #All cuisine
    
   if request.user.is_authenticated:
    if request.user.userprofile.full_address:
        distance = []
        for p in post:
            post_lon = p.longitude_user
            post_lat = p.latitude_user
        
            post_situation = (post_lon, post_lat)
        
            user_lon = UserProfile.objects.filter(user=request.user)[0].longitude
            user_lat = UserProfile.objects.filter(user=request.user)[0].latitude
            
            user_situation = (user_lon, user_lat)
        
            distance.append(round(geodesic(post_situation, user_situation).km, 3))
    
    # Pre commande pour demain
    #post = Cuisine.objects.filter(status=0).filter(start_date=now().date() + timedelta(days=1)).order_by('-publishing_date').all()
    # En commande pour aujourd'hui
    #post = Cuisine.objects.filter(status=0).filter(start_date=now().date()).order_by('-publishing_date').all()
    
    paginator = Paginator(post, 3)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    listaliments = ListAliments.objects.filter(status=1).all()
    typerepas = Typerepas.objects.filter(status=1).all()
    sperepas = Sperepas.objects.filter(status=1).all()
    
    return render(request, 'index.html', {
        'post': post,
        'listaliments': listaliments,
        'typerepas': typerepas,
        'sperepas': sperepas,
        'page_obj': page_obj,
        'today' : now().date(),
        'tomorrow': now().date() + timedelta(days=1),
        'distance': distance,
    })
1 Answers

If you have all latitudes/longitudes ready, you could use pyproj which is really efficient :

from pyproj import Geod
...
user_lon = UserProfile.objects.filter(user=self.request.user).get(self.longitude)
user_lat = UserProfile.objects.filter(user=self.request.user).get(self.latitude)

post_lon = Cuisine.objects.filter(slug=slug).get(self.longitude_user)
post_lat = Cuisine.objects.filter(slug=slug).get(self.latitude_user)

wgs84_geod = Geod(ellps='WGS84')
*_args, dist_meters = wgs84_geod.inv(user_lon,user_lat,post_lon,post_lat)
print(dist_meters)

EDIT

def Homemainpage(request):

  post = Cuisine.objects.filter(status=0).order_by('-publishing_date').all() #All cuisine

  ...
  user_lon = UserProfile.objects.filter(user=request.user)[0].longitude
  user_lat = UserProfile.objects.filter(user=request.user)[0].latitude

  wgs84_geod = Geod(ellps='WGS84')
  kitchen_distance_dict = dict()
  for kitchen in Cuisine.objects.all():
    post_lon = kitchen.longitude
    post_lat = kitchen.latitude
    *_args, dist_meters = wgs84_geod.inv(user_lon,user_lat,post_lon,post_lat)

    kitchen_distance_dict[kitchen.pk] = dist_meters / 1000

  return render(request, 'index.html', {
    'post': post,
    'listaliments': listaliments,
    'typerepas': typerepas,
    'sperepas': sperepas,
    'page_obj': page_obj,
    'distance': kitchen_distance_dict,
  })
Related