Part.I Introduction

本文介绍了如何绘制常用的行政区划四(五)色图,方法有些繁琐,主要用到的工具有:

  1. Matlab,主要战场
  2. 在线网址:www.cainiaojc.com,辅助工具
  3. 在线网址:阿里云 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) 样式

准备相关代码

  • 读取并展示 svg 的包:loadsvg
  • 十六进制颜色转RGB包:hex2rgb

解压下载到的 matlab 包 loadsvghex2rgb

hex2rgb 包中的 rgb2hex.mhex2rgb.m 两个文件放到 loadsvg_2 文件夹下

在这里插入图片描述

打开 Matalb,将工作目录设置为 loadsvg_2 文件夹
在这里插入图片描述

Chap.II 步骤概览

  1. 阿里云 DataV 数据可视化平台下载所需的svg,只能精确到县区
  2. 用 Matlab 显示 svg
  3. 标注:确定各区域名字;微调:解决相邻区域染色一样问题
  4. 成图
  5. 图片处理软件精修

存在的问题:

  • 染色和标注不够智能
  • 受限于 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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐