利用 Matlab 根据 SVG 绘制行政区划图(四色图)
本文介绍了如何绘制常用的行政区划四(五)色图,方法有些繁琐,主要用到的工具有:Matlab,主要战场在线网址:www.cainiaojc.com,辅助工具在线网址:阿里云 DataV 数据可视化平台,提供svg
·
文章目录
Part.I Introduction
本文介绍了如何绘制常用的行政区划四(五)色图,方法有些繁琐,主要用到的工具有:
- Matlab,主要战场
- 在线网址:www.cainiaojc.com,辅助工具
- 在线网址:阿里云 DataV 数据可视化平台,提供svg
注:除了Matlab,没有用到付费工具。因为笔者电脑上没有GIS软件,所以才出此下策。
Chap.I 准备工作
地图染色常用的五种颜色
| 十六进制 | RGB | 颜色 |
|---|---|---|
| #c7cde7 | rgb(199, 205, 231) | 样式 |
| #f8c7dc | rgb(248, 199, 220) | 样式 |
| #fae0bf | rgb(250, 224, 191) | 样式 |
| #fffdd7 | rgb(255, 253, 215) | 样式 |
| #c5e4d4 | rgb(197, 228, 212) | 样式 |
准备相关代码
解压下载到的 matlab 包 loadsvg 和 hex2rgb
将 hex2rgb 包中的 rgb2hex.m 和 hex2rgb.m 两个文件放到 loadsvg_2 文件夹下

打开 Matalb,将工作目录设置为 loadsvg_2 文件夹
Chap.II 步骤概览
- 从阿里云 DataV 数据可视化平台下载所需的svg,只能精确到县区
- 用 Matlab 显示 svg
- 标注:确定各区域名字;微调:解决相邻区域染色一样问题
- 成图
- 图片处理软件精修
存在的问题:
- 染色和标注不够智能
- 受限于 SVG 资源,无法绘制县以下的行政区划
Part.II 详细步骤
Chap.I 下载 svg 资源
访问阿里云 DataV 数据可视化平台,放大,点选想要绘制的区域

以郑州市为例,依次点击河南省区域→郑州市区域,然后点击右边下载按钮即可。

Chap.II 显示 svg
新建个脚本 main.m ,将下面的代码粘贴进去,然后运行。注意将 svg 路径修改为你自己的路径。
clc;clear;
c=[hex2rgb('#c7cde7');hex2rgb('#f8c7dc');hex2rgb('#fae0bf');hex2rgb('#fffdd7');hex2rgb('#c5e4d4')];
mat=loadsvg('A:\OHanlon\downloads\郑州市.svg',0.1,true);
num_P_cell=length(mat);
temp=max(mat{1,num_P_cell});maxX=temp(1);minY=temp(2);
temp=min(mat{1,num_P_cell});minX=temp(1);maxY=temp(2);
minY=-minY-10;maxY=-maxY+10;
minX=minX-10;maxX=maxX+10;
set(gca,'position',[0.05 0.05 0.9 0.9],'xtick',[],'ytick',[],'box','off')
set(gca,'XLim',[minX, maxX]);
set(gca,'YLim',[minY, maxY]);
for num_line=1:floor(num_P_cell/2)
X=mat{num_line};
ci=rem(num_line,5)+1;
outline=fill(X(:,1),-X(:,2),c(ci,:));
x=(min(X(:,1))+max(X(:,1)))/2; y=-(min(X(:,2))+max(X(:,2)))/2;
text(x,y,num2str(num_line),'FontName','楷体', 'FontSize', 12);
hold on
axis equal
end

Chap.III 调整
- 上图中 1 号区域和 6 号区域相连,但是染色一致,需要修改。
- 根据地图,对所有区域进行标注。
调整之后的代码为
clc;clear;
c=[hex2rgb('#c7cde7');hex2rgb('#f8c7dc');hex2rgb('#fae0bf');hex2rgb('#fffdd7');hex2rgb('#c5e4d4')];
mat=loadsvg('A:\OHanlon\downloads\郑州市.svg',0.1,true);
name={'中原区','二七区','管城回族区','金水区','上街区','惠济区','中牟县','巩义市','荥阳市','新密市','新郑市','登封市'};
num_P_cell=length(mat);
temp=max(mat{1,num_P_cell});maxX=temp(1);minY=temp(2);
temp=min(mat{1,num_P_cell});minX=temp(1);maxY=temp(2);
minY=-minY-10;maxY=-maxY+10;
minX=minX-10;maxX=maxX+10;
set(gca,'position',[0.05 0.05 0.9 0.9],'xtick',[],'ytick',[],'box','off')
set(gca,'XLim',[minX, maxX]);
set(gca,'YLim',[minY, maxY]);
for num_line=1:floor(num_P_cell/2)
X=mat{num_line};
ci=rem(num_line,5)+1;
if num_line==6
ci=1;
end
outline=fill(X(:,1),-X(:,2),c(ci,:));
x=(min(X(:,1))+max(X(:,1)))/2; y=-(min(X(:,2))+max(X(:,2)))/2;
% text(x,y,num2str(num_line),'FontName','楷体', 'FontSize', 12);
text(x,y,name{1,num_line},'FontName','楷体', 'FontSize', 12);
hold on
axis equal
end
运行可得
Chap.IV 精修
可以看到上面有几个地方字体显示不全,比如上街区、管城回族区,可以用画图 3D 、PS、PPT等软件进行处理。
笔者喜欢用画图3D(受大学舍友的影响,嘿嘿),字体选择STKaiti,大小为12,成图如下:

Chap.V 备份&代码精进
已经得知的顺序
% 郑州市
name={'中原区','二七区','管城回族区','金水区','上街区','惠济区','中牟县','巩义市','荥阳市','新密市','新郑市','登封市'},
% 信阳市
name={'浉河区','平桥区','罗山县','光山县','新县','商城县','固始县','潢川县','淮滨县','息县'};
隐藏坐标轴
axis off
画布背景颜色改为白色
set(gcf,'color','w');
Reference
- 知乎:怎么样可以给中国地图按省份、区域上色?(注意区分广子)
更多推荐

所有评论(0)