🔗 运行环境: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'
表示数据点将以点的形式显示。其他属性如比例尺和颜色设置用于改善地图的视觉效果。