Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 计算两点域之间的距离-为什么我的结果不正确?_Django_Geospatial_Postgis_Geodjango - Fatal编程技术网

Django 计算两点域之间的距离-为什么我的结果不正确?

Django 计算两点域之间的距离-为什么我的结果不正确?,django,geospatial,postgis,geodjango,Django,Geospatial,Postgis,Geodjango,我试图计算两个位置之间的距离(以英里为单位),但得到的结果不正确 我认为它不正确的原因是,我在上面加了位置(纬度和经度),得到的距离以英里为单位,为0.055。下面是我代码中的详细信息 PointField A : (-122.1772784, 47.7001663) PointField B : (-122.1761632, 47.700408) Distance : 0.001141091551967795 然而,根据网站的说法,距离应该是 Distance: 0.055 miles 下

我试图计算两个位置之间的距离(以英里为单位),但得到的结果不正确

我认为它不正确的原因是,我在上面加了位置(纬度和经度),得到的距离以英里为单位,为
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

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

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

  • 将点转换为具有
    单位的EPSG

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

  • 最后,将其转换为
    英里

    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
    

  • FWIW我刚刚在Google Earth中输入了你的点,测量了282英尺或0.0534091英里之间的直接距离,这意味着其他网站是正确的,出于某种原因,我在代码中的计算是错误的变量
    modelEmpInstance
    PointFieldBLocation
    来自哪里?(旁注-如果你使用camelcase作为变量,你的代码将更容易被其他人阅读。答案是正确的-只是以度为单位!我对GeoDjango了解不够,无法给出答案,但要从PostGIS获得米数结果,您要么需要米数SRID,要么使用地理类型而不是几何类型,要么使用st_distance_sphere。由于您的距离很小,您最准确的选择可能是使用局部投影。可能是重复的感谢您清除此问题。我是新来的。有没有一个服务可以告诉我什么是基于经纬度的EPSG?或者有一个标准的EPSG我可以使用吗?我不知道有一个网站,你可以添加一个点,并获得适当的EPSG的地方。但你可以做的是搜索你的点在地图上的位置,然后用谷歌搜索类似“西雅图EPSG”的东西。从那以后,我相信了,我一直在读一些关于EPSG的书。但我有一个问题。你提到我最初的结果是正确的,但以度为单位。有没有办法把它转换成长度单位?我不是在寻找一个超级精确的结果,但应该是+-15英里great@MistyD没有一种标准的方法可以做到这一点。如果你不在乎准确性,你可以使用
    EPSG:3857
    。今天晚些时候我将尝试一下并标记它