【问题标题】:Calculating distance between two PointField (s) - Why is my result incorrect?计算两个 PointField (s) 之间的距离 - 为什么我的结果不正确?
【发布时间】:2018-09-27 02:28:47
【问题描述】:

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

我认为它不正确的原因是因为我在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

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

【问题讨论】:

  • FWIW 我刚刚在 Google 地球中输入了您的点,并测量了 282 英尺或 0.0534091 英里之间的直接距离
  • 这意味着另一个网站是正确的,由于某种原因我在代码中的计算是错误的
  • 变量modelEmpInstancePointFieldBLocation 来自哪里? (旁注 - 如果您使用 PEP8 conventions,您的代码对其他人的可读性会更高 - 使用驼峰命名法表示变量是不受欢迎的)。
  • 答案是正确的——以度为单位!我对 GeoDjango 知之甚少,无法给出答案,但要从 PostGIS 获得以米为单位的结果,您要么需要以米为单位的 SRID,要么使用地理而不是几何类型,或者使用 st_distance_sphere。由于您的距离非常小,您最准确的选择可能是使用本地投影。

标签: django geospatial postgis geodjango


【解决方案1】:

您的计算没有错,但结果是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
    

【讨论】:

  • 感谢您解决这个问题。我是新来的。有没有可以告诉我EPSG基于经度纬度的服务?或者有我可以使用的标准 EPSG 吗?
  • 我不知道有哪个网站可以添加一个点并为该位置获取适当的 EPSG。你可以做的是搜索你的点在地图上的位置,然后用谷歌搜索“西雅图 EPSG”之类的东西。从那里我信任spatialreference.orgepsg.io
  • 我读过一些关于 EPSG 的文章。但我有一个问题。您提到我的初始结果是正确的,但以度为单位。有没有办法将其转换为长度单位?我不是在寻找超级准确的结果,但是 +-15 英里的结果会很棒
  • @MistyD 没有标准的方法可以做到这一点。如果您不关心准确性,可以使用EPSG:3857
  • 今天晚些时候我会试一试并标记它
猜你喜欢
  • 2016-07-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2021-01-14
  • 2010-10-30
相关资源
最近更新 更多