穿越星空(Across the Stars)分享 http://blog.sciencenet.cn/u/aweng

博文

制作官方渠道的中国省市县行政区划地图(3)属性数据处理

已有 2048 次阅读 2022-7-24 18:48 |个人分类:学习|系统分类:科研笔记

第三步,就要处理属性数据了。

如果使用过ArcGIS软件的朋友,都会知道在ArcGIS里直接操作属性数据是件十分复杂麻烦的事情。因此我们考虑使用更简单的方式。在这里,我使用的是Microsoft Office Excel,建议使用最新版本。

在之前的第一步科学网—制作官方渠道的中国省市县行政区划地图(1)数据准备 - 翁建武的博文 (sciencenet.cn)里,已经说了把来自民政部的行政区划数据复制到Excel文件中。

现在新建一个Excel文件,命名为“行政区划代码2020.xlsx”。

把从民政部的行政区划数据复制过来,存放到sheet1里,作为原始数据保存。

新建sheet2,把原始数据复制到A、B两列。A列为行政区划代码,B列为单位名称,也就是行政区划名称。

在之后的C列至H列,顺序命名为县代码、县名称、市代码、市名称、省代码、省名称。

在这里,县指可区分的最低一级行政区划,可以是县,也可以是市(如广东省中山市,是地级市,但未辖任何区,也未代管任何县),也可以是省(如香港、澳门特别行政区)。市是可以根据行政区划管辖关系而判别的比可区分的最低一级行政区划更高一级的行政区划,简单点说就是可以根据管辖关系并成地级市的。不能并的就仍保持原样,如直辖市的区、台湾的区县等。省就是省级行政区划,包括中国大陆的31个省级行政区再加上港澳台。

在此前的图幅拼接处理中,我们已经处理了一次行政区划,现在还需要更细致的处理。处理的情况主要有:(1)行政区划调整后未及时更新行政区划代码或行政区划名称,(2)属性需要按行政区划调整后的情况进行更新或更改。

现在,在sheet2中,A列和B列是有数据的,C列至H列需要填充。

按上面写的县、市、省的方式,县就是原始数据的现状。因此在C列、D列中输入公式。

C2单元格中输入

=A2

D2单元格中输入

=B2

按上面写的县、市、省的方式,市需要排除直辖市、没有市代管而由省直辖的县这两种情况。因此在E列、F列中输入公式。

E2单元格中输入

=IF(OR(LEFT(A2,2)="11",LEFT(A2,2)="12",LEFT(A2,2)="31",LEFT(A2,2)="50",MID(A2,3,2)="90"),A2,LEFT(A2,4)*100)

这里使用了if、or、left、mid等函数。

left表示从字符串的左边开始取连续的几个字符。在这里,从A列中取字符串,取前面的两位,把北京、天津、上海、重庆这4个直辖市挑出来,因为它们的行政区划代码前两位分别为11、12、31、50。

or表示只要其中的任何一个条件成立,就判断为“真”。在这里,就是判断是否为直辖市。

mid是从字符串取连续的几个字符。在这里,从A列中取从第3位开始取连续的2位,即第3位、第4位。没有市代管而由省直辖的县,给的行政区划代码,第3位、第4位连起来就是90。

除此之外,就是根据行政区划代码的规律,取行政区划代码的前4位,再在后面补两个0。所以就用left函数,取A列中的前4位,再乘以100,即可在后面补两个0了。

F2单元格中输入

=VLOOKUP(E2,$ A $2:$ B $3212,2)

就是在A列和B列中搜索,使用E2的值找F2的值。具体的用法可以自己搜索一下vlookup函数的用法。

按上面的县、市、省的方式,省是最好设置的。因此在G列、H列中输入公式。

G2单元格中输入

=LEFT(A2,2)*10000

从A列中取前两位,再乘以10000,就实现取前两位后补4个0了。

H2单元格中输入

=VLOOKUP(G2,$A$2:$B$3212,2)

就是在A列和B列中搜索,使用G2的值找H2的值。具体的用法可以自己搜索一下vlookup函数的用法。

把C2到H2的单元格复制,把下面直到C3212到H3212填充完毕。这样sheet2的数据填充任务就完成了。

sheet2是用来做查询表的,用在之后的属性操作。

科学网—制作官方渠道的中国省市县行政区划地图(2)图幅拼接处理 - 翁建武的博文 (sciencenet.cn)中,最后把cn2021_03_01图层的属性数据导出成了cn2021_03_01.xls。把这个文件中的sheet复制到“行政区划代码2020.xlsx”中,成为cn2021_03_01这个sheet。

cn2021_03_01这个sheet中,可以看到有FID、PAC、NAME这三列。FID是多边形的编号,PAC是行政区划代码,NAME是行政区划名称。

浏览一下,可以看到,这里的行政区划比较复杂,包括了正常的行政区划,包括了如日本、菲律宾这样的国家,包括了中朝共有的区域,包括了海洋,包括了不在sheet2中的行政区划。所以我们在处理的时候需要分别处理。

在D列到O列,分别命名列:PAC-01、NAME-01、PAC-02、NAME-02、PAC-03、NAME-03、国家、PAC1、NAME1、PAC2、NAME2、备注

PAC-01、NAME-01、PAC-02、NAME-02、PAC-03、NAME-03分别是省代码、省名称、市代码、市名称、县代码、县名称

国家是所属国家

PAC1、NAME1、PAC2、NAME2、备注分别是初始查询出的代码、初始查询出的名称、更正的代码、更正的名称、更正的备注

在K2中输入公式

=IF(B2<1000,"",IF(OR(LEFT(B2,2)="71",C2="中朝共有",C2="海洋"),B2,IFNA(VLOOKUP(B2,Sheet2!$A$1:$H$3212,3,FALSE),"NULL")))

在L2中输入公式

=IF(B2<1000,"",IF(OR(LEFT(B2,2)="71",C2="中朝共有",C2="海洋"),C2,IFNA(VLOOKUP(B2,Sheet2!$A$1:$H$3212,4,FALSE),"NULL")))

B2<1000表示外国区域,在行政区划代码中留空,不参与vlookup查询。

B2前两位为71,表示为台湾省的行政区,需要保留原样。C2为中朝共有、海洋的,需要保留原样。这两种情况保留原样 ,并都不参与vlookup查询。

其他情况下,按B2的行政区划代码开始查询,查询的数据表是sheet2中的A列到H列,查到了就填写查出来的结果。如果返回值为空,则写成NULL。

查过之后,会发现有一些行政区被赋予了NULL。这些就需要我们进一步处理。

第1个NULL是130521邢台县。网上查询可以知道:2020年6月,国务院批复同意河北省调整邢台市部分行政区划:邢台市桥东区更名为襄都区、邢台市桥西区更名为信都区,撤销邢台县,将原邢台县的豫让桥街道、晏家屯镇、祝村镇、东汪镇划归邢台市襄都区管辖,将原邢台县的南石门镇、羊范镇、皇寺镇、会宁镇、西黄村镇、路罗镇、将军墓镇、浆水镇、宋家庄镇、太子井乡、龙泉寺乡、北小庄乡、城计头乡、白岸乡、冀家村乡划归邢台市信都区管辖。撤销任县,设立邢台市任泽区,以原任县的行政区域为任泽区的行政区域。撤销南和县,设立邢台市南和区,以原南和县的行政区域为南和区的行政区域。

由此可见邢台市需要大调整。其中桥东区和桥西区已经通过vlookup查询,更新了行政区划名称。其他的要么不变,要么更改。从查出的信息可以看到,原邢台县被拆分了,不复存在。但是在地图上没有对应的多边形更新,所以不能按此信息更新邢台县。

因此这里又来一条原则,就是无法更新多边形的情况下,保留原本应该撤销的行政区。

而后,在M列和N列输入需要更新的行政区划代码和行政区划名称,O列中输入行政区划调整信息。如下图。

\"image.png\"/

按这样对其他的NULL进行处理,直到处理完成。

在H列中输入公式

=IF(K2="","",IF(K2="NULL",M2,K2))

在I列中输入公式

=IF(K2="","",IF(K2="NULL",N2,L2))

这样就可以把K列到N列中的数据更新到H列和I列中。

在F列中输入公式

=IF(H2="","",IF(OR(LEFT(H2,2)="11",LEFT(H2,2)="12",LEFT(H2,2)="31",LEFT(H2,2)="71",LEFT(H2,2)="50",MID(H2,3,2)="90",I2="中朝共有",I2="海洋"),H2,IFNA(VLOOKUP(LEFT(H2,4)*100,Sheet2!$A$1:$H$3212,5,FALSE),"NULL")))

在G列中输入公式

=IF(H2="","",IF(OR(LEFT(H2,2)="11",LEFT(H2,2)="12",LEFT(H2,2)="31",LEFT(H2,2)="71",LEFT(H2,2)="50",MID(H2,3,2)="90",I2="中朝共有",I2="海洋"),I2,IFNA(VLOOKUP(LEFT(H2,4)*100,Sheet2!$A$1:$H$3212,6,FALSE),"NULL")))

这样就可以把市级的行政区划代码和行政区划名称更新。

在D列中输入公式

=IF(H2="","",IF(OR(I2="中朝共有",I2="海洋"),H2,IFNA(VLOOKUP(LEFT(H2,2)*10000,Sheet2!$A$1:$H$3212,5,FALSE),"NULL")))

在E列中输入公式

=IF(H2="","",IF(OR(I2="中朝共有",I2="海洋"),I2,IFNA(VLOOKUP(LEFT(H2,2)*10000,Sheet2!$A$1:$H$3212,6,FALSE),"NULL")))

这样就可以把省级的行政区划代码和行政区划名称更新。

这样就把cn2021_03_01图层的属性数据全部做好了。





https://wap.sciencenet.cn/blog-485-1348612.html

上一篇:制作官方渠道的中国省市县行政区划地图(2)图幅拼接处理
下一篇:制作官方渠道的中国省市县行政区划地图(4)逐级融合
收藏 IP: 58.100.15.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 16:59

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部