Django&Geopy:每个帖子列出的所有距离:如何将一个距离与一个帖子关联

如何解决Django&Geopy:每个帖子列出的所有距离:如何将一个距离与一个帖子关联

Django-Geopy

我正在寻找如何定义两点之间的距离。第一个与帖子本身相关,并且不会针对每个帖子进行更改。它指示职位的位置。第二个将链接用户的位置。

我要计算帖子和用户间的距离。

问题:假设我已建立联系:每个帖子都列出了所有距离

我得到一个帖子: [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,default='0')

post/models.py
    class Cuisine(models.Model):
         ...
         latitude_user = models.DecimalField(max_digits=9,default='0')
         longitude_user = models.DecimalField(max_digits=9,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,})

解决方法

如果您已准备好所有纬度/经度,则可以使用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,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,})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?