Matlab经纬度测距

李, 晓洲 发布于 2023-08-27 1278 次阅读


AI 摘要

摘要:Matlab经纬度测距的功能可以通过输入两组经度和维度来实现。通过计算哈弗正弦公式和中心角,可以计算出两个经纬度点之间的距离。除此之外,文章还提供了完整的测距按键回调的代码,可以对鼠标在窗口内的移动进行测距操作。

        输入两组经度和维度维度运行即可。

lon=[xxx,xxx]; %经度
lat=[xxx,xxx]; %维度
rad=pi/180;              %1弧度
earth_r=6371009;         %地球平均半径

lon1_rad=lon(1)*rad;    lon2_rad=lon(2)*rad;    %经度转弧度制
lat1_rad=lat(1)*rad;    lat2_rad=lat(2)*rad;    %维度转弧度制
lon_abs_differences=abs(( lon2_rad - lon1_rad )) ;    %经度绝对差异
lat_abs_differences=abs(( lat2_rad - lat1_rad )) ;    %维度绝对差异

%哈弗正弦公式计算
hav_lon_absd=(sin(lon_abs_differences/2))^2;
hav_lat_absd=(sin(lat_abs_differences/2))^2;
hav_lat_add=(sin((lat1_rad+lat2_rad)/2))^2;

%计算中心角
central_angle=2*asin(hav_lat_absd+(1-hav_lat_absd-hav_lat_add)*hav_lon_absd)^0.5;

%距离
distance=earth_r*central_angle;

        下面是测距按键回调的完整代码,其中鼠标与窗口的互动是根据Matlab官方文档Figure 属性中的“窗口内按键移动回调”的示例改来的。

function Range_Finding_ButtonPushed(app, event)
global UIAx
rad=pi/180;             %1弧度
earth_r=6371009;        %地球平均半径 6371008.7714

if UIAx.range_finding_t~=1
    delete(UIAx.range_finding)
end

app.UIFigure.WindowButtonDownFcn=@wbdcb;
app.UIFigure.Pointer='crosshair';
ah=app.UIAxes_2D;

UIAx.range_finding_t=1;
t=UIAx.range_finding_t;
i=1;
    function wbdcb(src,~)
        seltype = src.SelectionType;
        switch seltype
            case 'normal'
                cp = ah.CurrentPoint;
                %src.Pointer = 'crosshair';
                if t ==1
                    xinit = cp(1,1);
                    yinit = cp(1,2);
                    UIAx.range_finding(i) = line(app.UIAxes_2D,'XData',xinit,'YData',yinit,...
                        'Marker','+','MarkerSize',24,'color','b');
                    a=i;
                    src.WindowButtonMotionFcn = @wbmcb;
                    src.WindowButtonUpFcn = @wbucb;
                    t=t+1;
                    UIAx.range_finding_t=t;
                    i=i+1;
                else
                    t=1;
                    src.Pointer = 'crosshair';
                    src.WindowButtonMotionFcn = '';
                    src.WindowButtonUpFcn = @wbucb;
                end
            case 'alt'
                src.Pointer = 'arrow';
                src.WindowButtonMotionFcn = '';
                src.WindowButtonUpFcn = '';
                app.UIFigure.WindowButtonDownFcn='';
                return
            case 'extend'
                if t==1
                    delete(UIAx.range_finding)
                end
        end
        
        function wbmcb(~,~)
            cp = ah.CurrentPoint;
            xdat = [xinit,cp(1,1)] ;    %取鼠标位置横坐标(经度)
            ydat = [yinit,cp(1,2)] ;    %取鼠标位置纵坐标(维度)
            UIAx.range_finding(a).XData = xdat;
            UIAx.range_finding(a).YData = ydat;
            app.RangeFinding_CP1Lon.Value=xdat(1);
            app.RangeFinding_CP1Lat.Value=ydat(1);
            app.RangeFinding_CP2Lon.Value=xdat(2);
            app.RangeFinding_CP2Lat.Value=ydat(2);
            drawnow
            range_finding(xdat,ydat)
        end
        
        function wbucb(src,~)
            last_seltype = src.SelectionType;
            if strcmp(last_seltype,'alt')
                src.Pointer = 'arrow';
                src.WindowButtonMotionFcn = '';
                src.WindowButtonUpFcn = '';
                app.UIFigure.WindowButtonDownFcn='';
                return
            else
                return
            end
        end
        
        function range_finding(lon,lat)
            %转弧度制
            lon1_rad=lon(1)*rad;    lon2_rad=lon(2)*rad;    %经度转弧度制
            lat1_rad=lat(1)*rad;    lat2_rad=lat(2)*rad;    %维度转弧度制
            
            %经维度绝对差异
            lon_abs_differences=abs(( lon2_rad - lon1_rad )) ;    %经度绝对差异
            lat_abs_differences=abs(( lat2_rad - lat1_rad )) ;    %维度绝对差异
            
            %哈弗正弦公式计算
            hav_lon_absd=(sin(lon_abs_differences/2))^2;
            hav_lat_absd=(sin(lat_abs_differences/2))^2;
            hav_lat_add=(sin((lat1_rad+lat2_rad)/2))^2;
            
            %中心角计算
            central_angle=2*asin(hav_lat_absd+(1-hav_lat_absd-hav_lat_add)*hav_lon_absd)^0.5;
            
            %距离
            distance=earth_r*central_angle;
            
            app.Range_Finding_Value.Value=distance;
        end
    end
end