Geopy:计算GPS航向/方位

时间:2013-07-12 21:29:59

标签: python python-3.x gps geo geopy

这里的第一次海报。

我正在为桥梁检查ROV octorotor收集的GPS数据进行一些数据分析。我们使用3D扫描激光雷达,立体视觉,INS和其他一些技术,在ROS上运行octorotor。我目前在ublox LEA-6T设置的类似设置中使用Doug Weibel's来收集原始GPS数据,如载波相位,多普勒频移和卫星星历。然后我使用开源项目RTKLIB对本地NOAA CORS站点进行DGPS后处理,以获得cm精度,以便在重建桥梁的3D点云时更好地进行姿态估计。

无论如何,我使用大部分scipy来统计验证我的测试结果 特别是对于这部分,我只是使用:

我一直在研究我的位置协方差,使用geopy的便捷距离函数来抵消我测得的地面实况。通过很少按摩参数,我可以找到矩阵中每个标准偏差元素所描绘的每个方向的距离;北,东,向和三个方向之间。

然而,这些距离是绝对的,不描述方向 说:正面,负面将分别与北向或南向相关。

我可以简单地使用纬度和经度来检测方向的极性,
但我希望能够找到所描述距离的精确点对点轴承,
我相信全局标题的值可能对我目前的其他应用程序有用。

我发现其他人提出了类似的问题 但它似乎假设一个大圆近似
我希望至少使用WGS-84椭球模型,或任何可用于地形的相同模型:
Jump to Calculating distances

任何建议都表示赞赏,
-ruffsl

有兴趣的消息来源:

3 个答案:

答案 0 :(得分:8)

使用geographiclib包进行python。这可以计算椭圆体上的距离和方位等等。 (您可以插入路径,测量区域等)例如,在

之后
>>> from geographiclib.geodesic import Geodesic
>>> Geodesic.WGS84.Inverse(-41.32, 174.81, 40.96, -5.50)
{'lat1': -41.32, 'a12': 179.6197069334283, 's12': 19959679.26735382, 'lat2': 40.96, 'azi2': 18.825195123248392, 'azi1': 161.06766998615882, 'lon1': 174.81, 'lon2': -5.5}

你可以做到

$(document).ready(function() {
    $('#add-btn').click(function(){
        var newHtml = '<div>Items: ' + $("#items").val() + ', Quantity: ' + $("#quantity").val() + ', In Order: ' + $("#in-order").val() + ' <div class="btn btn-danger deleteBtn">Delete</div></div>' ;
        
        $("#persisted-items").append(newHtml);
        $("#items").val('');
        $("#quantity").val('');
    });
    
    $(document).on('click', '.deleteBtn', function() {
    	$(this).parent('div').remove();
    });
});

计算从新西兰惠灵顿(41.32S 174.81E)到西班牙萨拉曼卡(40.96N 5.50W)的测地线。距离由s12(19959679米)给出,初始方位角(方位)由azi1(从北方顺时针方向161.067 ...度)给出。

答案 1 :(得分:4)

两个纬度/经度坐标之间的轴承:(lat1,lon1),(lat2,lon2)

在下面的代码中,lat1,lon1,lat2,lon2以弧度为单位。
之前从度数转换为弧度。

dLon = lon2 - lon1;
y = Math.sin(dLon) * Math.cos(lat2);
x = Math.cos(lat1)*Math.sin(lat2) -
        Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
brng = Math.atan2(y, x).toDeg();

轴承现在在-180/180范围内。

标准化为罗盘轴承(0-360)

if brng < 0: brng+= 360

答案 2 :(得分:0)

@AlexWien在Python中的答案

import math, numpy as np

def get_bearing(lat1,lon1,lat2,lon2):
    dLon = lon2 - lon1;
    y = math.sin(dLon) * math.cos(lat2);
    x = math.cos(lat1)*math.sin(lat2) - math.sin(lat1)*math.cos(lat2)*math.cos(dLon);
    brng = np.rad2deg(math.atan2(y, x));
    if brng < 0: brng+= 360
    return brng