zoukankan      html  css  js  c++  java
  • 路径选择

    一、

    二、计算坐标

    clear all
    %% 
    %输入值
    d1=5;
    d2=100;
    d3=30;
    d4=30;
    thiet=125;
    %% 
    %系统值
    lon=110*cos(3.14*29.8/180);
    lat=110;
    x0=122.4189;y0=29.8824;%经纬度
    %% 
    %计算第一个坐标
    x1=x0+d1*cos((90-thiet)/180)/lon;
    y1=y0+d1*sin((90-thiet)/180)/lat;
    %计算第二个坐标
    x2=x1+d2*cos((90-thiet)/180)/lon;
    y2=y1+d2*sin((90-thiet)/180)/lat;
    %第三个坐标
    thiet_3=thiet-30;
    x3=x2+d3*cos((90-thiet_3)/180)/lon;
    y3=y2+d3*sin((90-thiet_3)/180)/lat;
    %第四个坐标
    thiet_4=thiet+30;
    x4=x2+d4*cos((90-thiet_4)/180)/lon;
    y4=y2+d4*sin((90-thiet_4)/180)/lat;
    %% 
    %展示
    X_1=[x0,x1,x2,x3];
    Y_1=[y0,y1,y2,y3];
    X_2=[x0,x1,x2,x4];
    Y_2=[y0,y1,y2,y4];
    plot(X_1,Y_1,'o-',X_2,Y_2,'o-')
    grid on
    
    disp(['第一个点经度为lon=',num2str(x1),',纬度为lat=',num2str(y1)]);
    disp(['第二个点经度为lon=',num2str(x2),',纬度为lat=',num2str(y2)]);
    disp(['第三个点经度为lon=',num2str(x3),',纬度为lat=',num2str(y3)]);
    disp(['第四个点经度为lon=',num2str(x4),',纬度为lat=',num2str(y4)]);
    

     

    改成函数形式

    function [X,Y]=ROAD(d1,d2,d3,d4,thiet)
    %% 
    %输入值
    % d1=5;
    % d2=100;
    % d3=30;
    % d4=30;
    % thiet=125;
    %% 
    %系统值
    lon=110*cos(3.14*29.8/180);
    lat=110;
    x0=122.4189;y0=29.8824;%经纬度
    %% 
    %计算第一个坐标
    x1=x0+d1*cos((90-thiet)/180)/lon;
    y1=y0+d1*sin((90-thiet)/180)/lat;
    %计算第二个坐标
    x2=x1+d2*cos((90-thiet)/180)/lon;
    y2=y1+d2*sin((90-thiet)/180)/lat;
    %第三个坐标
    thiet_3=thiet-30;
    x3=x2+d3*cos((90-thiet_3)/180)/lon;
    y3=y2+d3*sin((90-thiet_3)/180)/lat;
    %第四个坐标
    thiet_4=thiet+30;
    x4=x2+d4*cos((90-thiet_4)/180)/lon;
    y4=y2+d4*sin((90-thiet_4)/180)/lat;
    
    %% 
    %展示
    X_1=[x0,x1,x2,x3];
    Y_1=[y0,y1,y2,y3];
    X_2=[x0,x1,x2,x4];
    Y_2=[y0,y1,y2,y4];
    plot(X_1,Y_1,'o-',X_2,Y_2,'o-')
    grid on
    
    X=[x1,x2,x3,x4]
    Y=[y1,y2,y3,y4]
    
    disp(['第一个点经度为lon=',num2str(x1),',纬度为lat=',num2str(y1)]);
    disp(['第二个点经度为lon=',num2str(x2),',纬度为lat=',num2str(y2)]);
    disp(['第三个点经度为lon=',num2str(x3),',纬度为lat=',num2str(y3)]);
    disp(['第四个点经度为lon=',num2str(x4),',纬度为lat=',num2str(y4)]);
    

    三、地图显示

    (1)  

    clear all
    ax=worldmap([29 31],[120 125]);%载入地图
    geoshow(ax,'mapsou2_4p.shp','FaceColor','G')%将边界线载入地图中
    

    clear all
    ax=worldmap([29.6 30],[122 123]);%载入地图
    geoshow(ax,'mapsou2_4p.shp','FaceColor','G')%将边界线载入地图中
    

     

    (2)利用M_map库来生成地图

    低精度的海岸线

    clear all
    m_proj('albers equal-area','lat',[29 31],'long',[120 125],'rect','on');%方形,扇形
    m_coast('patch',[0 1 0]);%填充
    m_grid('linewidth',2,'tickdir','out');

    (3)安装高精度数据

    How to install GSHHS:

      1. Go to http://www.ngdc.noaa.gov/mgg/shorelines/data/gshhs/.
      2. Get and uncompress any or all of the files gshhs_c.b.gz, gshhs_l.b.gz, gshhs_i.b.gz and/or gshhs_h.b.gz in a convenient directory. One useful place is in m_map/private. GSHHS data format has changed between v1.2 and 1.3, and again for v2.0, but m_map should be able to figure this out.
      3. If the database files are not in subdirectory m_map/private , you must edit the FILNAME settings in m_gshhs_c.m, m_gshhs_l.m, m_gshhs_i.m, m_gshhs_h.m and/or m_gshhs_f.m to point to the appropriate files.

    1、下载数据

    https://www.ngdc.noaa.gov/mgg/shorelines/data/gshhg/oldversions/

    选择版本一定是1.0的,否则不能用(翻译里的内容是个坑)

    解压后如下图

    而2.0的解压后后缀名变了,如下

    而程序中只认*.b的后缀名。

    2、将gshhs数据解压安装在路径D:MATLAB oolboxm_mapprivategshhs中

    在MATLAB中将该文件添加路径

    3、接下来更该m_map文件夹下程序中路径名,如下图。所有都要更改

     

    以上将gshhs数据包安装完毕。

    (4)高精度数据显示

    clear all
    
    m_proj('albers equal-area','lat',[29 31],'long',[120 125],'rect','on');
    m_gshhs_h('patch',[0.9 .86 .6]);
    m_grid('linewidth',2,'tickdir','out');
    

    clear all
    
    m_proj('albers equal-area','lat',[29.6 30],'long',[122 123],'rect','on');
    m_gshhs_h('patch',[0.9 .86 .6]);
    m_grid('linewidth',2,'tickdir','out');

    明显精度提高了许多

    (5)优化

    clear all
    m_proj('albers equal-area','lat',[29 31],'long',[120 125],'rect','on');%方形,扇形
    m_gshhs_h('save','gumby');
    

      将该区域的数据保存下来,供以后直接调用,可节约时间

    clear all
    m_proj('albers equal-area','lat',[29 31],'long',[120 125],'rect','on');%方形,扇形
    load gumby
    figure(1);
    m_usercoast('gumby','patch','r');
    m_grid;
    
    figure(2);
    m_usercoast('gumby','linewidth',2,'color','b');
    m_grid('tickdir','out','yaxisloc','left');
    

     

    clear all
    % load s 
    tic
    m_proj('albers equal-area','lat',[29 31],'long',[120 125],'rect','on');
    m_gshhs_h('patch',[0.9 .86 .6]);
    m_grid('linewidth',2,'tickdir','out');
     
    % m_line(X,Y,'linewi',2,'color','r');%线宽,2;颜色
    toc
    

    clear all
    tic
    m_proj('albers equal-area','lat',[29 31],'long',[120 125],'rect','on');%方形,扇形
    load gumby
    m_usercoast('gumby','patch',[0.9 .86 .6]);
    m_grid;
    toc
    

     

    四、路径显示在图上

    clear all
    load s 
    m_proj('albers equal-area','lat',[29 31],'long',[120 125],'rect','on');%方形,扇形
    load gumby
    m_usercoast('gumby','patch',[0.9 .86 .6]);
    m_grid;
    m_line(X_1,Y_1,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色
    m_line(X_2,Y_2,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色
    

    clear all
    %% 
    %输入值
    d1=5;%第一段距离
    d2=100;%第二段距离
    d3=30;%第三段距离
    d4=d3;%第四段距离
    thiet=125;%初始角度
    [X_1,Y_1,X_2,Y_2]=ROAD(d1,d2,d3,d4,thiet);%调用函数
    %% 
    m_proj('albers equal-area','lat',[29.5 30.5],'long',[122 124],'rect','on');%方形,扇形
    load gumby%载入地图数据
    m_usercoast('gumby','patch',[0.9 .86 .6]);
    m_grid;
    m_line(X_1,Y_1,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色
    m_line(X_2,Y_2,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色
    title('路径示意图','fontsize',18,'fontweight','bold');
    m_text(X_1(2),Y_1(2),[num2str(X_1(2)) ' , ' num2str(Y_1(2))],'fontweight','bold','color','m','fontsize',14);
    m_text(X_1(3),Y_1(3),[num2str(X_1(3)) ' , ' num2str(Y_1(3))],'fontweight','bold','color','m','fontsize',14,'Horizontal','right');
    m_text(X_1(4),Y_1(4),[num2str(X_1(4)) ' , ' num2str(Y_1(4))],'fontweight','bold','color','m','fontsize',14);
    m_text(X_2(4),Y_2(4),[num2str(X_2(4)) ' , ' num2str(Y_2(4))],'fontweight','bold','color','m','fontsize',14);
    

    四、度分秒转换

    function [str]=DMS(deg)
    
    ang=floor(deg);
    m=roundn((deg-ang)*60,-2);%保留两位小数
    str=[num2str(ang) ' circ ' num2str(m)];%显示度的符号
    
    clear all
    %% 
    %输入值
    d1=6;%第一段距离
    d2=0;%第二段距离
    d3=20;%第三段距离
    d4=20;%第四段距离
    thiet=75;%初始角度
    [X_1,Y_1,X_2,Y_2]=ROAD(d1,d2,d3,d4,thiet);%调用函数
    %% 
    m_proj('albers equal-area','lat',[29.7 30.3],'long',[122 123],'rect','on');%方形,扇形
    load gumby%载入地图数据
    m_usercoast('gumby','patch',[0.9 .86 .6]);
    m_grid;
    m_line(X_1,Y_1,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色
    m_line(X_2,Y_2,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色
    title('路径示意图','fontsize',18,'fontweight','bold');
    %m_text(X_1(2),Y_1(2),[num2str(X_1(2)) ' , ' num2str(Y_1(2))],'fontweight','bold','color','m','fontsize',14);%将度数,经纬度标志加入
    m_text(X_1(3),Y_1(3),[DMS(X_1(3)) ' E , ' DMS(Y_1(3)) ' N'],'fontweight','bold','color','m','fontsize',14,'Horizontal','right');
    m_text(X_1(4),Y_1(4),[DMS(X_1(4)) ' E , ' DMS(Y_1(4)) ' N'],'fontweight','bold','color','m','fontsize',14);
    m_text(X_2(4),Y_2(4),[DMS(X_2(4)) ' E , ' DMS(Y_2(4)) ' N'],'fontweight','bold','color','m','fontsize',14);
    

    五、GUI设计

     (1)

    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    cla reset%重置 axes(handles.axes1); m_proj('albers equal-area','lat',[29 30.5],'long',[122 124],'rect','on');%方形,扇形 m_usercoast('gumby','patch',[0.9 .86 .6]); m_grid; %基本地图 lon=110*cos(3.14*29.9/180); lat=110;%当地经纬度1度距离 x0=str2num(get(handles.lon,'String')); y0=str2num(get(handles.lat,'String'));%经纬度 thiet=str2num(get(handles.angle,'String'));%初始角度 d1=str2num(get(handles.des1,'String'));%第一段距离 d2=str2num(get(handles.des2,'String'));%第二段距离 d3=str2num(get(handles.des3,'String'));%第三段距离 d4=str2num(get(handles.des3,'String'));%第四段距离 %计算第一个坐标 x1=x0+d1*cos(3.14*(90-thiet)/180)/lon; y1=y0+d1*sin(3.14*(90-thiet)/180)/lat; %计算第二个坐标 x2=x1+d2*cos(3.14*(90-thiet)/180)/lon; y2=y1+d2*sin(3.14*(90-thiet)/180)/lat; %第三个坐标 thiet_3=thiet-35; x3=x2+d3*cos(3.14*(90-thiet_3)/180)/lon; y3=y2+d3*sin(3.14*(90-thiet_3)/180)/lat; %第四个坐标 thiet_4= thiet+20; x4=x2+d4*cos(3.14*(90-thiet_4)/180)/lon; y4=y2+d4*sin(3.14*(90-thiet_4)/180)/lat; X_1=[x0,x1,x2,x3]; Y_1=[y0,y1,y2,y3]; X_2=[x0,x1,x2,x4]; Y_2=[y0,y1,y2,y4];%数据点集合到一块 m_line(X_1,Y_1,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色 m_line(X_2,Y_2,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色 m_text(X_1(2),Y_1(2),[num2str(X_1(2)) ' , ' num2str(Y_1(2))],'fontweight','bold','color','m','fontsize',14); m_text(X_1(3),Y_1(3),[num2str(X_1(3)) ' , ' num2str(Y_1(3))],'fontweight','bold','color','m','fontsize',14,'Horizontal','right'); m_text(X_1(4),Y_1(4),[num2str(X_1(4)) ' , ' num2str(Y_1(4))],'fontweight','bold','color','m','fontsize',14); m_text(X_2(4),Y_2(4),[num2str(X_2(4)) ' , ' num2str(Y_2(4))],'fontweight','bold','color','m','fontsize',14);

    (2)添加角度函数

    将角度转换函数加到最后,和普通的MATLAB调用程序一样

    function [str]=DMS(deg)
    
    ang=floor(deg);
    m=roundn((deg-ang)*60,-2);
    str=[num2str(ang) ' circ ' num2str(m)];
    
    %主函数
    function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) cla reset axes(handles.axes1); m_proj('albers equal-area','lat',[29 30.5],'long',[122 124],'rect','on');%方形,扇形 m_usercoast('gumby','patch',[0.9 .86 .6]); m_grid; %基本地图 lon=110*cos(3.14*29.9/180); lat=110;%当地经纬度1度距离 x0=str2num(get(handles.lon,'String')); y0=str2num(get(handles.lat,'String'));%经纬度 thiet=str2num(get(handles.angle,'String'));%初始角度 d1=str2num(get(handles.des1,'String'));%第一段距离 d2=str2num(get(handles.des2,'String'));%第二段距离 d3=str2num(get(handles.des3,'String'));%第三段距离 d4=str2num(get(handles.des3,'String'));%第四段距离 %计算第一个坐标 x1=x0+d1*cos(3.14*(90-thiet)/180)/lon; y1=y0+d1*sin(3.14*(90-thiet)/180)/lat; %计算第二个坐标 x2=x1+d2*cos(3.14*(90-thiet)/180)/lon; y2=y1+d2*sin(3.14*(90-thiet)/180)/lat; %第三个坐标 thiet_3=thiet-35; x3=x2+d3*cos(3.14*(90-thiet_3)/180)/lon; y3=y2+d3*sin(3.14*(90-thiet_3)/180)/lat; %第四个坐标 thiet_4= thiet+20; x4=x2+d4*cos(3.14*(90-thiet_4)/180)/lon; y4=y2+d4*sin(3.14*(90-thiet_4)/180)/lat; X_1=[x0,x1,x2,x3]; Y_1=[y0,y1,y2,y3]; X_2=[x0,x1,x2,x4]; Y_2=[y0,y1,y2,y4];%数据点集合到一块 m_line(X_1,Y_1,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色 m_line(X_2,Y_2,'linewi',1.5,'color','g','Marker','o','LineStyle','-');%线宽,2;颜色 m_text(X_1(2),Y_1(2),[num2str(DMS(X_1(2))) ' , ' num2str(DMS(Y_1(2)))],'fontweight','bold','color','m','fontsize',14,'Horizontal','right'); m_text(X_1(3),Y_1(3),[num2str(X_1(3)) ' , ' num2str(Y_1(3))],'fontweight','bold','color','m','fontsize',14,'Horizontal','right'); m_text(X_1(4),Y_1(4),[num2str(DMS(X_1(4))) ' , ' num2str(DMS(Y_1(4)))],'fontweight','bold','color','m','fontsize',14); m_text(X_2(4),Y_2(4),[num2str(X_2(4)) ' , ' num2str(Y_2(4))],'fontweight','bold','color','m','fontsize',14); 

    小数和角度同时显示的图

    (3)gui转exe

    运行之后新生成了很多文件,其中就有应用程序。双击

     

    出错的原因是m_map地图包不能兼容。  

      

  • 相关阅读:
    python学习6—数据类型之集合与字符串格式化
    python学习5—一些关于基本数据结构的练习题
    21-python-time,random模块的应用
    20-python-装饰器⭐
    19-python-迭代器、生成器
    18-python-文件的操作
    17-python-主要内置函数
    16-python-map、filter函数
    15-python-局部变量全局变量
    14-python-函数
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/7828109.html
Copyright © 2011-2022 走看看