【问题标题】:Django & Geopy : all distance listed for each post : how to associated one distance to one postDjango & Geopy:为每个帖子列出的所有距离:如何将一个距离关联到一个帖子
【发布时间】:2020-10-27 14:45:08
【问题描述】:

Django -- Geopy

我正在寻找如何定义两点之间的距离。第一个与帖子本身有关,不会因每个帖子而改变。它表示帖子的位置。第二个将链接到用户的位置。

我想计算 Post 和 User 的距离。

问题:假设我已连接:每个帖子都列出了所有距离

我得到了一篇文章: [459.414, 459.414, 459.414, 0.605, 0.605, 0.605, 0.605, 0.605, 459.414, 0.605] 公里

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')

感谢@tgrandje,我解决了一些从UserProfile 中寻找价值的问题: 问题是我总是为每个帖子获得相同的距离。 有什么建议吗?

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,
    })

【问题讨论】:

  • 谁能帮帮我?
  • 您能发布您的视图的完整代码吗?如果您记录计算出的距离值,您可以在日志/控制台中看到它吗?
  • 嗨@D Malan,这就是我对此的全部看法。我在视图的头部添加了测地线。如果我想计算帖子和帖子用户的距离,则代码在 post/models.py 中工作。结果 = 0,因为本地化后 = 用户本地化。我的主要问题是我想根据 self.request.user 显示结果。如果用户A正在登录,距离需要考虑他的位置。
  • 如果您希望我发布其他内容,我很乐意这样做:)
  • 为什么模型会有self.request?

标签: python django distance geopy


【解决方案1】:

如果您准备好所有纬度/经度,您可以使用 pyproj,它非常有效:

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)

编辑

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,
  })

【讨论】:

  • 为什么投反对票?问题是“如何定义两点之间的距离”,而不是创建关于位置的模型......
  • 嗨@tgrandje 感谢您回答我:) 问题是:我无法获取连接到网站的每个用户配置文件的数据(经度/纬度)。我知道如何用 Geopy 计算距离,但在我看来,我无法得到它。你有什么主意吗?顺便说一句,我不知道 Geod。我去看看,
  • 不好意思,我没听懂你的问题,然后!
  • 如果你在你的上下文中推送 user_lon/lat 和 post_lon/lat ,你能显示它们吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2019-08-25
  • 2019-05-22
相关资源
最近更新 更多