Python 使用geopy将英里转换为纬度和经度 背景

Python 使用geopy将英里转换为纬度和经度 背景,python,geometry,geolocation,geography,geopy,Python,Geometry,Geolocation,Geography,Geopy,我想添加一个模型管理器函数,该函数根据与坐标的接近程度过滤查询集。我发现这些代码正是我想要的 代码 下面的代码段似乎使用了后来被删除的函数。它通过限制纬度和经度的范围粗略地缩小查询集 # Prune down the set of all locations to something we can quickly check precisely rough_distance = geopy.distance.arc_degrees(arcminutes=geopy.distanc

我想添加一个模型管理器函数,该函数根据与坐标的接近程度过滤查询集。我发现这些代码正是我想要的

代码 下面的代码段似乎使用了后来被删除的函数。它通过限制纬度和经度的范围粗略地缩小查询集

    # Prune down the set of all locations to something we can quickly check precisely
    rough_distance = geopy.distance.arc_degrees(arcminutes=geopy.distance.nm(miles=distance)) * 2
    queryset = queryset.filter(
        latitude__range=(latitude - rough_distance, latitude + rough_distance), 
        longitude__range=(longitude - rough_distance, longitude + rough_distance)
    )
问题 由于一些使用过的geopy函数已被删除/移动,我正试图重写这一节。然而,我不懂计算——几何学勉强及格,我的研究让我困惑,而不是实际帮助了我


有人能帮忙吗?我将不胜感激。

以英里为单位的
距离
似乎正在转换为海里,每英里等于一分弧度,每分弧度为一弧度的1/60。然后将该值加倍,然后从给定的纬度和经度中加减。这四个值可用于围绕坐标形成边界框


您可以在上查找任何所需的转换因子。这里还有一篇相关的文章,题目是讨论经度和纬度定位的利弊,避免了它们的复杂性。换句话说,关于在计算中用另一个水平位置表示替换纬度和经度所涉及的考虑。

看起来距离以英里为单位被转换为海里,每英里等于一分弧度,每分弧度为一个弧度的1/60。然后将该值加倍,然后从给定的纬度和经度中加减。这四个值可用于围绕坐标形成边界框


您可以在上查找任何所需的转换因子。这里还有一篇相关的文章,题目是讨论经度和纬度定位的利弊,避免了它们的复杂性。换句话说,关于在计算中用另一个水平位置表示代替纬度和经度所涉及的考虑。

地球不是一个球体,只是大致如此。如果需要更精确的计算,请使用。然后,您可以根据参考椭球体(例如WGS84)计算位置。

地球不是球体,只是大致如此。如果需要更精确的计算,请使用。然后,您可以基于参考椭球体(例如WGS84)计算位置。

根据片段的实际功能,martineau的答案是正确的,但需要注意的是,1分钟的圆弧表示的距离因位置而异。在赤道处,查询覆盖最小轴对齐的边界框,该边界框包含一个直径
距离
的圆,但在赤道以外,边界框不完全包含该圆

就片段的实际功能而言,martineau的答案是正确的,但需要注意的是,1分钟的弧表示非常不同的距离,这取决于位置。在赤道处,查询覆盖最小轴对齐的边界框,该边界框包含一个直径
距离
的圆,但在赤道以外,边界框不完全包含该圆

博客中的这段代码太草率了:

  def near(self, latitude=None, longitude=None, distance=None):
    if not (latitude and longitude and distance):
      return []
如果纬度==0(赤道)或经度==0(格林威治子午线),它将立即返回。如果纬度为零或经度为零,则应为

@MacGuy的答案是一个进步,但是:

(a) “边界框”的整体思想是避免SQL或类似查询计算到所有满足查询的点的距离。使用适当的索引,查询将执行得更快。这样做的代价是让客户端(1)计算边界框的坐标(2)计算并检查查询返回的每个结果的精确距离

如果省略步骤2,即使在赤道上也会出现错误。例如,“查找半径为5英里的所有比萨饼店”意味着您可以在距离盒子角落7.07英里(即sqrt(5*2+5*2))的地方找到答案

请注意,您显示的代码似乎是半径的任意倍。这意味着你可以在14.1英里外获得积分

(b) 正如@MacGuy所说,远离赤道,情况会变得更糟。这样计算的边界框并不包括您感兴趣的所有点——当然,除非您通过将半径加倍而造成过度破坏

(c) 如果兴趣圈包括北极或南极,那么计算结果极不准确,需要调整。如果兴趣圈与180度子午线(即没有之字形的国际日期线)相交,则结果毫无意义;您需要检测这种情况并应用两部分查询(子午线两侧各一部分)


有关问题(b)和(c)的解决方案,请参阅。

此博客中的代码过于草率:

  def near(self, latitude=None, longitude=None, distance=None):
    if not (latitude and longitude and distance):
      return []
如果纬度==0(赤道)或经度==0(格林威治子午线),它将立即返回。如果纬度为零或经度为零,则应为

@MacGuy的答案是一个进步,但是:

(a) “边界框”的整体思想是避免SQL或类似查询计算到所有满足查询的点的距离。使用适当的索引,查询将执行得更快。这样做的代价是让客户端(1)计算边界框的坐标(2)计算并检查查询返回的每个结果的精确距离

如果省略步骤2,即使在赤道上也会出现错误。例如,“查找半径为5英里的所有比萨饼店”意味着您可以在距离盒子角落7.07英里(即sqrt(5*2+5*2))的地方找到答案

请注意,您显示的代码似乎是半径的任意倍。这个wo