【重新定义matlab强大系列二十】Matlab显示地球地貌数据

发布于:2024-08-12 ⋅ 阅读:(137) ⋅ 点赞:(0)

🔗 运行环境:Matlab

🚩 撰写作者:左手の明天

🥇 精选专栏:《python》

🔥  推荐专栏:《算法研究》

#### 防伪水印——左手の明天 ####

💗 大家好🤗🤗🤗,我是左手の明天!好久不见💗

💗今天更新系列——重新定义matlab强大系列💗

📆  最近更新:2024 年 08 月 11 日,左手の明天的第 346 篇原创博客

📚 更新于专栏:matlab

#### 防伪水印——左手の明天 ####


本文中的数据取自美国商务部海洋及大气管理局 (NOAA) 国家地理数据中心,数据通告编号为 88-MGG-02。

一、关于地貌数据

数据文件 topo.mat 包含地貌数据。topo 是海拔数据,topomap1 是海拔的颜色图。

load topo topo topomap1    % load data 
whos('topo','topomap1')
 Name            Size              Bytes  Class     Attributes

  topo          180x360            518400  double              
  topomap1       64x3                1536  double              

二、显示地球地貌数据的方法

1、等高线和纹理映射

创建等高线图

以可视化形式呈现地貌数据的一种方法是创建等高线图。若要显示地球上各大洲的轮廓,请绘制海拔为零的点。contour 中的前三个输入参量指定等高线图上的 X、Y 和 Z 值。第四个参量指定要绘制的等高线层级。

x = 0:359;                                % longitude
y = -89:90;                               % latitude

figure
contour(x,y,topo,[0 0])

axis equal                                % set axis units to be the same size
box on                                    % display bounding box

ax = gca;                                 % get current axis               
ax.XLim = [0 360];                        % set x limits
ax.YLim = [-90 90];                       % set y limits
ax.XTick = [0 60 120 180 240 300 360];    % define x ticks
ax.YTick = [-90 -60 -30 0 30 60 90];      % define y ticks

以图像形式查看数据

可以使用高程数据和自定义颜色图创建地貌图像。地貌数据被视为自定义颜色图的索引。将图像的 CDataMapping 设置为 'scaled' 以将数据值线性缩放至颜色图的范围。在颜色图上,不同深浅的绿色表示海拔数据,不同深浅的蓝色表示海平面下的深度。

image([0 360],[-90 90], flip(topo), 'CDataMapping', 'scaled')
colormap(topomap1)

axis equal                                % set axis units to be the same size

ax = gca;                                 % get current axis               
ax.XLim = [0 360];                        % set x limits
ax.YLim = [-90 90];                       % set y limits
ax.XTick = [0 60 120 180 240 300 360];    % define x ticks
ax.YTick = [-90 -60 -30 0 30 60 90];      % define y ticks

使用纹理映射

纹理映射将二维图像映射到三维曲面上。若要将地貌映射到球形曲面,将由 CData 属性指定的曲面颜色设置为地貌数据并将 FaceColor 属性设置为 'texturemap'

clf
[x,y,z] = sphere(50);          % create a sphere 
s = surface(x,y,z);            % plot spherical surface

s.FaceColor = 'texturemap';    % use texture mapping
s.CData = topo;                % set color data to topographic data
s.EdgeColor = 'none';          % remove edges
s.FaceLighting = 'gouraud';    % preferred lighting for curved surfaces
s.SpecularStrength = 0.4;      % change the strength of the reflected light

light('Position',[-1 0 1])     % add a light

axis square off                % set axis to square and remove axis
view([-30,30])                 % set the viewing angle

2、worldmap函数创建

在MATLAB中显示地理数据,可以使用Mapping Toolbox中的worldmap函数来创建世界地图,然后使用geoshow函数来显示地理数据。

展示世界地图经纬线


worldmap('World')

载入海岸线

worldmap('World')%世界地图
load coast %载入海岸线
plotm(lat,long)%经纬度

ax = worldmap('World');
setm(ax, 'Origin', [0 180 0])%更改经度,从0到180再到0
land = shaperead('landareas', 'UseGeoCoords', true);%陆地
geoshow(ax, land, 'FaceColor', [0.5 0.7 0.5])

载入水准面数据

worldmap([-50 50],[160 -30]) %载入范围
 
load geoid %载入水准面数据
geoshow(geoid, geoidrefvec, 'DisplayType', 'texturemap'); %画图显示
 
load coast %载入海岸线
geoshow(lat, long) %显示

海拔高度的不同颜色显示

%-- 分省中国地图在MATLAB中的画法 --%
% 地图数据来源:国家基础地理信息系统网站
% 人口数据来源:国家统计年鉴2011版
%% 载入地图数据
clear all
% 载入各省的多边形数据
sheng=shaperead('maps/bou2_4p.shp', 'UseGeoCoords', true);
load chinese_name.mat % 省,省会,主要城市的正确中文
for i=1:length(sheng)
    sheng(i).NAME=sheng_chinese_name{i}; % 纠正中文显示错误
end
%unique(sheng_chinese_name) % 含有34个省(直辖市)的数据,合并相同的值
length(sheng) % 共分为925个区块
%% 使用importdata向导导入2011年全国31个省的人口数据
% data为人口数目 textdata为省名称
d=importdata('gaodu.txt');
%d=importdata('renkou.txt');
data=d.data; % 海拔高度
textdata=d.textdata; % 相对应的省的名称
%% 定义地图参数
% 针对不同省份,分别设置不同的颜色(FaceColor),由人口数据决定颜色数据
% 定义颜色
k=128;  
mycolormap=summer(k);
% 生成不同区域按大小的颜色,按照人口数目多少分别指定不同的颜色
% 人口越多,颜色越突出
geoname={sheng.NAME}';%省的名字,925个
max_data = max(data);
n=length(data);
mysymbolspec=cell(1,n); % 预定义变量可以加快处理速度
 
%%
%高度和颜色对应起来,然后省份和颜色对应起来,利用归一化排序,定位
for i=1:n
    count=data(i);%高度
    mycoloridx=floor( k * count / max_data );
    mycoloridx(mycoloridx<1)=1;
    myprovince=textdata{i};%省,31个
    geoidx=strmatch(myprovince, geoname);%从925中挑31的位置
    if numel(geoidx) > 0
        province_name=geoname( geoidx(1) );
        mysymbolspec{i} = {'NAME', char(province_name), 'FaceColor', mycolormap( mycoloridx, :) };%省份和颜色对应
    end
end
%% 显示地图
figure
ax=worldmap('china'); % 使用worldmap的坐标轴作图
setm(ax,'grid','off') % 关闭grid
setm(ax,'frame','off') % 关闭边框
setm(ax,'parallellabel','off') % 关闭坐标轴标记,平行线
setm(ax,'meridianlabel','off') % 关闭坐标轴标记,子午线
 
% 最关键的两个语句
symbols=makesymbolspec('Polygon',{'default','FaceColor',[0.9 0.9 0.8],...
    'LineStyle','--','LineWidth',0.2,...
    'EdgeColor',[0.8 0.9 0.9]},...
    mysymbolspec{:}...
    );
geoshow(sheng,'SymbolSpec',symbols); % 此处用mapshow投影会不正确

以下是一个简单的示例,展示如何在MATLAB中显示一个地理数据点图层:

% 创建一个新的世界地图
worldmap('World');
 
% 假设有一组地理数据,包括经度和纬度
longitudes = [103.8 103.8 104.6 104.6]; % 经度数据
latitudes = [3.8 4.6 3.8 4.6]; % 纬度数据
 
% 显示地理数据点
geoshow('vertex', [longitudes' latitudes'], 'DisplayType', 'point');
 
% 设置地图的比例尺和其他属性
axis equal;
outline('Color', 'k');
shading interp;
light;
camlight;

在这个例子中,worldmap函数用于创建一个世界地图,geoshow函数用于显示地理数据点。vertex参数指定了地理数据点的坐标,DisplayType参数设置为'point'表示数据点将以点的形式显示。其他属性如比例尺和颜色设置用于改善地图的视觉效果。


网站公告

今日签到

点亮在社区的每一天
去签到