计算两个PointField之间的距离-为什么我的结果不正确?

时间:2018-09-27 02:28:48

标签: django geospatial postgis geodjango

我正在尝试计算以英里为单位的两个位置之间的距离,但是我得到的结果不正确。

我认为它不正确的原因是因为我在此website上放置了位置(经度和纬度),并且得到的距离以英里为单位0.055。这是我的代码中的详细信息

PointField A : (-122.1772784, 47.7001663)
PointField B : (-122.1761632, 47.700408)
Distance : 0.001141091551967795

但是,根据网站,距离应该是

Distance: 0.055 miles

这是我计算距离的方式。

这是我的模特

class modelEmp(models.Model):
       user                = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
       location            = models.PointField(srid=4326,max_length=40, blank=True, null=True)  
       objects             = GeoManager() 

这就是我计算距离的方式

 result = modelEmpInstance.location.distance(PointFieldBLocation)
   where result = 0.001141091551967795

关于我在这里可能做错了什么以及为什么我的结果与网站不同的任何建议吗?

1 个答案:

答案 0 :(得分:2)

您的计算没错,但是结果以EPSG:4326的单位为degrees为单位。为了计算所需单位的距离,我们需要执行以下操作:

  1. 将这些点转换为meter个单位的EPSG。

    • 如果您不太在意计算的准确性,则可以使用EPSG:3857(但结果将是0.08104046068988752mi)。
    • 如果您愿意关心计算的准确性,则需要找到带有适合您所在位置的仪表单位的EPSG。由于您的地点位于西雅图地区附近,因此合适的EPSG为32148
  2. 创建一个Distance对象,其距离计算单位为米

  3. 最后,将其转换为miles

    from django.contrib.gis.measure import Distance
    
    result = Distance(
        m = modelEmpInstance.location.transform(
            32148, clone=True
        ).distance(PointFieldBLocation.transform(32148, clone=True)
    )
    print(
        'Raw calculation: {}\nRounded calculation: {}'
        .format(result.mi, round(result.mi, 2)
    )
    

    这将打印:

    Raw calculation: 0.0546237743898667 
    Rounded calculation: 0.055