输入两组经度和维度维度运行即可。
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

Comments NOTHING