【问题标题】:calculating a gps coordinate given a point, bearing and distance在给定点、方位角和距离的情况下计算 gps 坐标
【发布时间】:2011-05-30 16:16:57
【问题描述】:

我有一个问题让我在某个项目中退缩了一段时间。

我基本上是在寻找使用我编写的一些脚本绘制的 x、y 点来捕获多边形。 lat, lon 是多边形的中心 GPS 线,我正在寻找它周围的多边形。

这是我在 python 中的代码的一部分:

def getcords(lat, lon, dr, bearing):
    lat2=asin(sin(lat)*cos(dr)+cos(lat)*sin(dr)*cos(bearing))
    lon2=lon+atan2(sin(bearing)*sin(dr)*cos(lat),cos(dr)-sin(lat)*sin(lat2))
    return [lat2,lon2]

我的输入是这样的:

  • lat、lon - 以十进制度数给出。
  • dr - 是通过将距离(以英里为单位)除以地球的半径(=3958.82)计算得出的角度
  • 轴承 - 0-360 度之间。

但是对于输入:

getcorsds1(42.189275, -76.85823, 0.5/3958.82, 30)

我得到输出:[-1.3485899508698462, -76.8576637627568],但[42.2516666666667, -76.8097222222222] 是正确答案。

至于角距离,我只是用距离(英里)除以地球半径(=3958.82)来计算。

有人吗?

【问题讨论】:

    标签: python gps coordinates bearing


    【解决方案1】:

    geopy v2.0.0(+ 公里而不是英里)

    from geopy import Point                                                                                                                                                                       
    from geopy.distance import geodesic                                                                                                                                                           
                                                                                                                                                                                                  
    distKm = 1                                                                                                                                                                                    
    lat1 = 35.68096477080332                                                                                                                                                                      
    lon1 = 139.76720809936523                                                                                                                                                                     
                                                                                                                                                                                                  
    print('center', lat1, lon1)                                                                                                                                                                   
    print('north', geodesic(kilometers=distKm).destination(Point(lat1, lon1), 0).format_decimal())                                                                                                
    print('east', geodesic(kilometers=distKm).destination(Point(lat1, lon1), 90).format_decimal())                                                                                                
    print('south', geodesic(kilometers=distKm).destination(Point(lat1, lon1), 180).format_decimal())                                                                                              
    print('west', geodesic(kilometers=distKm).destination(Point(lat1, lon1), 270).format_decimal()) 
    

    结果是

    center 35.6809647708 139.767208099
    north 35.6899775841, 139.767208099
    east 35.680964264, 139.778254714
    south 35.6719519439, 139.767208099
    west 35.680964264, 139.756161485
    

    【讨论】:

    • 不要使用geopy它不再维护,have become problematic
    • @not2qubit 该问题已解决。是否有进一步的证据表明我们应该远离它?
    • 为了更好地理解,请参阅this answer
    • geopy 六周前有一个release,去年有八个。似乎在@not2qubit 发表评论之后的某个时间,有人拿起了它。
    • 我很高兴有人尝试维护自己的代码库,但不幸的是,回购中仍然缺少一些最基本的信息/文档。结果是普通用户不知道他们在计算什么以及如何计算。
    【解决方案2】:

    你为什么不用nice libraries

    from geopy import Point
    from geopy.distance import distance, VincentyDistance
    
    # given: lat1, lon1, bearing, distMiles
    lat2, lon2 = VincentyDistance(miles=distMiles).destination(Point(lat1, lon1), bearing)
    

    对于 lat1、lon1、distMiles、bearing = 42.189275,-76.85823, 0.5, 30 它返回 42.1955489, -76.853359。

    【讨论】:

    • 我尝试在 QGIS 中将此解决方案应用于 EPSG:4326 中的点,但结果不正确,似乎轴承有问题,例如当我尝试轴承 = 0 时新点位于 ~90º 关于潜在问题的任何线索?我正在使用 PyQGIS 创建图层
    • 不要使用geopy它不再维护,have become problematic
    • 没有维护吗?自此答案以来的许多新版本。此语法不适用于当前版本 (1.20.0)。不再需要点,不推荐使用 Vincenty,并返回具有 lat、long 和高度的元组 这有效:lat2,lon2,_ = distance(miles=distMiles).destination((lat1, lon1), bearing)
    • 我们可以为“轴承”使用默认值吗?
    • @Brendan - 使用默认方位是没有意义的,因为你会得到纬度/经度坐标在任意方向上的偏移;这就像站在地球上的某一点,走一段距离,然后告诉我你的新位置,而不指出你应该走的方向。这个答案在每个 N/S/E/W 轴上都有轴承:stackoverflow.com/a/40645383/181509
    【解决方案3】:

    sin 和 cos 函数期望它们的参数以 弧度 为单位,而不是度数。 asin 和 atan2 函数以弧度而不是度数生成结果。通常,需要使用math.radians() 将输入角度(lat1、lon1 和方位角)从度数转换为弧度,并使用math.degrees() 将输出角度(lat2 和 lon2)从弧度转换为度数。

    请注意,您的代码还有另外两个问题:

    (1) 不允许穿越经度180度子午线;你需要限制你的答案,使得 -180

    (2) 如果您打算广泛使用此函数,您可能希望删除冗余计算:sin(lat1)、cos(dr)、cos(lat1) 和 sin(dr) 分别计算两次。

    【讨论】:

      【解决方案4】:

      eumiro 你的代码
      结果是Too many values to unpack
      如何解决这个问题

      from geopy import Point
      from geopy.distance import distance, VincentyDistance
      
      # given: lat1, lon1, bearing, distMiles
      lat2, lon2 = VincentyDistance(miles=9.32057).destination(Point(52.20444, 0.3605$
      print lat2, lon2
      

      【讨论】:

      • 需要添加 .format_decimal() 我更新了接受的答案。
      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多