直接上優化后的代碼和效果圖
colour_totall=128;
% 載入地圖數據 --各省的多邊形數據
shp_data=shaperead('maps/bou2_4p.shp', 'UseGeoCoords', true);% 省
%{
// matlab 2016b已經解決這個問題了
% 檢查數據發現中午名稱為亂碼,可能是由於字符編碼引起的,需要糾正文件導入時出現的亂碼
% 中文名稱記錄在相應的dbf文件中,可以使用Excel打開,並且不會出現亂碼,截取其中的中文保存為文本文件
% 然后在導入工作區,並將其保存為*.mat格式文件,隨用隨取。
% 依次替換sheng數據中的亂碼【算是變通之法,有誰知道更好的方法一定告訴我哦】
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');
data=d.data; % 海拔高度
province_arr=d.textdata; % 相對應的省的名稱
% 定義地圖參數
% 針對不同省份,分別設置不同的顏色(FaceColor)
mycolormap=summer(colour_totall); % 定義顏色
% 生成不同區域按大小的顏色,按照人口數目多少分別指定不同的顏色.人口越多,顏色越突出
geo_name={shp_data.NAME}';
max_height = max(data);
n=length(data); % provice num
symbol_spec=cell(1,n); % 預定義變量可以加快處理速度
for i=1:n
height_tmp=data(i);
c_index=floor( colour_totall * height_tmp / max_height );
c_index(c_index<1)=1;
tmp_pn=province_arr{i};
geoidx= find(strncmp(tmp_pn, geo_name, length(tmp_pn)) == 1);
if numel(geoidx) > 0
province_name=geo_name( geoidx(1) );
symbol_spec{i} = {'NAME', char(province_name), 'FaceColor', mycolormap( c_index, :) };
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]},...
symbol_spec{:}...
);
geoshow(shp_data,'SymbolSpec',symbols); % 此處用mapshow投影會不正確
% 圖的標注
% 在圖像右側顯示bar
colormap(summer(colour_totall))
hcb=colorbar('EastOutside');
step=round(max_height/11);
set(hcb,'YTick',(0:.1:1))
set(hcb,'YTickLabel',num2cell(0:step:max_height))
% 給圖像加標題
title('中國各省海拔分布圖(單位:m)')
Source Code are here:
