本文作者:Lily
0 内容导读
2023年12月2日-3日,由中国地理信息产业协会、中国地理学会主办的“第十二届全国大学生GIS应用技能大赛”在广州大学成功举办,本届大赛采用线上比赛的模式进行。
与近几年的GIS应用技能大赛相比,2023大赛的试题题型有所变化。由原来的上下午各一题,变成上午一道基础题,主要考察数据组织处理、投影、制图等基本GIS能力;下午两道分析题,其主要目的是测试同学们对空间分析以及三维分析的掌握程度。特别是下午的题目整体难度加大,分析工具涉及的范围更广。
闲话少叙,今天起我们将针对这三道大题给出详细的解决方法。当然,GIS最终的目的是作为工具解决问题,如果同学们有更好的解题思路和方法,欢迎讨论。
操作软件:GeoScene Pro 4.0
先来看上午的基础题。
今天分享的就是上午这道题的解决方案,目标简述:
根据相关基础数据,制作江苏省基础地理信息地图,并叠加若干反映社会发展的专题要素密度图。
1 整体解决思路
拿到题之后,我们大概浏览一下,了解题目需求,大致拆分成4块任务:
1)配准江苏省标准地图;
2)整合基础矢量数据并入库;
3)整合 POI 数据并入库;
4)制作相应地图。
再详细查看题目提供的数据并找到对应的解决策略。这部分的内容大家可以跳过不看,自己先尝试做一下,遇到卡壳的地方再翻回来看解决的思路。
1.1 配准江苏省标准地图
这一步题目有3项要求,其中构建数据库并保证所有结果数据在数据库中,以及空间参考设为统一,均是对所有数据的统一要求。通常统一要求的条件,需要首先设置。由题可知,数据要求CGCS2000,高斯克吕格 6°投影,中央经线 119。Pro中没有直接提供这个坐标系,需要创建符合要求的坐标系。
再进行手动的图片配准。配准需要有对应的参考矢量依据。题目中本身没有提供现成的江苏省行政区划,需要在第二步中结合已有数据处理后再返回来进行配准。
1.2 整合基础矢量数据并入库
题目要求整合江苏省各行政境界面、行政境界线、行政境界点、主要水系面、主要水系线、公路、街区共 7 份矢量数据。这7份矢量数据除街区外,均来自100 万公众版基础地理信息数据中的H50、H51、I50、I51 文件夹。需要将同类数据进行合并同时提取江苏省境界范围内的数据。需要注意原始数据的坐标系与题目要求坐标系的区别,进行投影转换。
这一步首要问题是如何获取江苏省境界范围,可以参考题目提供的江苏省各行政境界面数据,打开其属性,其中PAC字段表示行政编码,观察其编码,以32开头的均为江苏省行政区,中间两位编码表示所属地区。使用按属性提取工具将符合条件的数据进行提取,获取江苏省境界矢量范围。
对各行政境界面、行政境界线、行政境界点、主要水系面、主要水系线、公路6类矢量数据,可对同名要素进行融合,合并成同一要素,按照题目添加对应的属性字段。
对街区数据,则需要沿着“江苏省地图政区图.jpg”街区的外轮廓范围进行手动矢量化。
1.3 整合 POI 数据并入库
这一步需要将包含点位信息的POI表格数据转化成点数据,并改变其投影。
对餐饮POI数据进行清洗,可考虑将点位数据重复的删除;使用模糊查询,筛选与关键字不一致的名称并人工进行排查(例如一点点酒楼)。添加“品牌名称”字段并补充对应的属性。合并不同品牌的POI数据。
为学校POI数据添加“学校类型”和“权重”字段。为了计算“权重”属性,需要使用相交及汇总统计工具,统计地级市幼儿园和小学的数量。再结合江苏省统计年鉴.csv查询地级市人口数量,得到其权重。
1.4 制作相应地图
制作江苏省人口地图时,需要注意基础要素以及人口要素的可视化效果,题目中没有明确要求特定的符号及标注。该部分要求相对主观,同学们可以根据题目罗列的条件进行优化。例如整体制图风格可以参考江苏省地图政区图,行政境界线绘制时可以参考境界线类型,突出不同类型的境界线对应不同线型等等。
制作公路、餐饮POI、学校POI核密度图时,注意核密度工具的参数设置。
既然是要求制作地图,也就说该步骤提交的结果为地图图片,还需要记得地图上要有基本的整饰要素。例如比例尺、图例、图名等信息。
整体的操作流程如下:
图1 流程图
2 详细步骤
2.1 配准江苏省标准地图
2.1.1 设置坐标系
选择地图属性的坐标系CGCS2000 GK CM 117E。(【内容列表】中,双击【地图】设置属性)
图2 【地图属性】对话框
在其上右键选择复制并修改。【名称】改为CGCS2000 GK CM 119E,【中央经线】改为119。
图3 修改坐标系
在该坐标系上,右键选择【添加到收藏夹】。方便后续使用。
2.1.2 创建数据库
目录视图中,新建文件地理数据库。重命名文件地理数据库为“结果数据库”。
2.1.3 提取江苏省境界面数据
2.1.3.1 合并境界面数据
在Pro中依次加载H50、H51、I50、I51 文件夹中的BOUA图层,表示各级行政区,并在内容列表中重命名BOUA图层为BOUA1、BOUA2、BOUA3、BOUA4(防止合并工具检测图层为重复图层)。使用【合并】(【数据管理工具】),依次输入BOUA数据, 输出数据集为“行政区划”。
图4 【合并】工具对话框
2.1.3.2 选择江苏省境界面数据
使用【按属性选择图层】工具,输入图层为“行政区划”,表达式为“PAC > 320000 And PAC < 330000”。
图5 【按属性选择图层】工具对话框
属于江苏省的数据将会被高亮显示。
2.1.3.3 融合江苏省境界面数据
保持高亮显示状态,使用【融合】工具,将接缝处的要素进行融合,融合字段为“PAC”及“NAME”。生成“江苏省行政区划”图层。
图6 【融合】工具对话框
2.1.3.4 投影境界面数据
使用【投影】工具,输出坐标系为“CGCS2000 GK CM 119E”,投影后为“行政境界面”。
图7 【投影】工具对话框
2.1.4 配准政区图
内容列表中选中“江苏省地图政区图.jpg”图层,切换到【地图】菜单栏,点击【地理配准】。
选择【添加控制点】,在图片上找到关键控制点,进行点选,再缩放至行政境界面矢量图层,找到对应的关键控制点。生成一个控制点点对。软件默认自动应用配准。
如此操作至少三次,生成三个控制点对。进行保存。效果如下图。
图8 行政图配准
配准完成后,政区图图片将自动生成坐标系,该坐标系与地图图框坐标系一致。
2.2 整合基础矢量数据并入库
2.2.1 行政境界面、线、点数据入库
2.2.1.1 合并点数据
参考2.1.3.1步骤加载AGNP图层,对境界点数据进行合并,生成“居民地地名”数据。
图9 【合并】工具对话框
2.2.1.2 投影
参考2.1.3.4步骤对居民地地名数据进行投影,生成“境界点”。
图10 【投影】对话框
2.2.1.3 提取点数据
使用【相交】工具,输入要素依次为“境界点、行政境界面”, 输出数据集为“行政境界点”。生成江苏省境内的境界点。
图11 【相交】工具对话框
2.2.1.4 添加字段
使用【添加字段(多个)】工具,为“行政境界点”图层添加 “行政中心类型”及“名称”,字段类型为“文本”。
图12 【添加字段(多个)】工具对话框
打开行政境界点图层属性表,观察“CLASS”字段。值为AB表示省份名称,AD表示地级市行政地名,AE和AF表示县级市、县及地级市市辖区级别的行政地名。其他类别则表示乡镇等更低一级。其中AD级中包含南京市,属于题目中要求的“省级行政中心”类。
2.2.1.5 添加数据属性
使用【按属性选择】工具,设置条件为“CLASS 等于 AD”,选中行政境界点”图层中的13个地市级行政中心(含南京),与江苏省统计年鉴中的城市一致。
图13 【按属性选择】工具对话框
在要素选中状态下,使用【计算字段】工具,为“行政境界点”图层的行政中心类型字段赋值,行政中心类型=“地市级行政中心”。
图14 【计算字段】工具对话框
修改“南京市”要素行政中心类型为“省级行政中心”。
重复本步骤的操作,选中县级行政中心并赋值。共计96个县级行政中心。
取消选中要素,使用【计算字段】工具,为“行政境界点”图层的名称字段赋值,名称=“!NAME!”(第一个NAME字段),填充名称属性。
图15 【计算字段】工具对话框
2.2.1.6 导出要素
使用【按属性选择】工具,选中“行政境界点”图层中,条件为“行政中心类型 不为空”的要素,共计109个。
图16 【按属性选择】工具对话框
保持要素选中状态,在行政境界点图层上右键,导出要素。
图17 【导出要素】工具对话框
输出要素类保存在结果数据库中,名称为“行政境界点”。
2.2.1.7 境界线入库
境界线要素操作与上述步骤类似,这里就不再赘述。
在添加数据属性时,除了选择使用【按属性选择】与【计算字段】工具组合,还可以直接在【计算字段】工具中使用python条件语句。如下图
图18 【计算字段】工具对话框
def Reclass(GB):
if (GB == 250200):
return '海岸线'
elif (GB == 260100):
return '水系交汇处'
elif (GB == 630201):
return '省级界线(已定)'
elif (GB == 630202):
return '省级界线(未定)'
elif (GB == 640200):
return '地、市、州级行政区界'
elif (GB == 650200):
return '县级行政区界'
2.2.1.8 境界面入库
境界面需要添加“名称”和“地级市名称”。“名称”方法与2.2.1.5相同。地级市名称字段与PAC字段有关,PAC字段的3、4位表示地级市编码,属于相同地级市的境界面3、4位编码相同。可以参照2.2.1.5方法,按属性选择数据并赋值。也可以直接在【计算字段】工具中使用python条件语句。
图19 【计算字段】工具对话框
def Belong(PAC):
if (PAC >= 321300):
return '宿迁市'
elif (PAC >= 321200):
return '泰州市'
elif (PAC >= 321100):
return '镇江市'
elif (PAC >= 321000):
return '扬州市'
elif (PAC >= 320900):
return '盐城市'
elif (PAC >= 320800):
return '淮安市'
elif (PAC >= 320700):
return '连云港市'
elif (PAC >= 320600):
return '南通市'
elif (PAC >= 320500):
return '苏州市'
elif (PAC >= 320400):
return '常州市'
elif (PAC >= 320300):
return '徐州市'
elif (PAC >= 320200):
return '无锡市'
elif (PAC >= 320100):
return '南京市'
2.2.2 主要水系面和主要水系线数据入库
2.2.2.1 提取江苏省境内水系线与面数据
参考2.2.1.1-2.2.1.3步骤,分别使用HYDL和HYDA数据,提取江苏省境内水系线与面数据,并命名为“江苏省内水系线”和“江苏省内水系面”。
2.2.2.2 融合江苏省境内水系线与面数据
使用【融合】工具,融合“江苏省内水系线”图层中的同名要素,融合字段为“NAME”,注意取消勾选“创建多部件要素”(部分河流线是断开的,需要进行手动编辑)。输出要素类为“江苏省境内水系线”。
图20 【融合】工具对话框
同样方法融合水系面。
2.2.2.3 提取江苏省境内主要水系线与面
使用【按属性查询】工具。将NAME属性为京杭运河、废黄河、苏北灌溉总渠、通扬运河、滁河、通吕运河、通榆河、新沂河、新沂河北偏泓的河流高亮显示,可使用SQL查询语句,共计29条河流。
图21 【按属性选择图层】工具对话框
使用【导出要素】工具。导出选中要素,并命名为“主要水系线”。
相同方法导出“主要水系面”
图22 【按属性选择图层】工具对话框
2.2.2.4 配准“江苏省 1∶270 万.jpg”图片
参考2.1.4方法,配准江苏省河流图。效果如下图
图23 配准河流图
2.2.2.5 编辑江苏省境内主要水系线与面
叠加主要水系线与面要素以及江苏省河流图片。对照江苏省河流图片对主要水系线和面进行修改。
河流线需要编辑:
1)“新沂河北偏泓”改成“新沂河”,与原“新沂河”进行合并
图24 【合并】对话框
2)删除部分“通榆河”并改名为“通榆运河”,合并同名要素。
3)将“废黄河”、“京杭运河”断开部分进行连接,合并同名要素(京杭运河在长江段可不连通)。
4)参考2.2.1.4步骤,添加名称字段,并赋值属性。
河流面需要编辑:
1)编辑太湖要素折点,保证太湖要素为单一部件。(删除中间线上折点)
图25 太湖要素编辑前后对比
2)参考2.2.1.4步骤,添加名称字段,并赋值属性。
成果可参考下图。
图26 河流效果
2.2.3 公路数据入库
2.2.3.1 提取江苏省境内公路数据
参考2.2.1.1-2.2.1.3步骤,使用LRDL数据,提取江苏省境内公路数据,并命名为“公路”。
2.2.3.2 添加字段
使用【添加字段(多个)】工具,添加“公路类型”和“权重”字段。公路类型字段为文本型,权重字段为整型。
图27 【添加字段(多个)】工具对话框
2.2.3.3 添加数据属性
使用【计算字段】工具,给公路类型字段赋值。
图28 【计算字段】工具对话框
def Reclass(GB):
if (GB == 420101):
return '国道'
elif (GB == 420102):
return '建筑中国道'
elif (GB == 420201):
return '省道'
elif (GB == 420202):
return '建筑中省道'
elif (GB == 420301):
return '县道'
elif (GB == 420302):
return '建筑中县道'
elif (GB == 420400):
return '乡道'
elif (GB == 420800):
return '机耕路'
elif (GB == 420802):
return '建筑中机耕路'
elif (GB == 430200):
return '快速路'
elif (GB == 440100):
return '简易公路'
elif (GB == 440200):
return '乡村路'
elif (GB == 440300):
return '小路'
使用【计算字段】工具,给权重字段赋值,权重字段中需要两个条件组合进行判断。Python代码如下:
图29 【计算字段】工具对话框
def Reclass(RTEG,GLLX):
if (RTEG == '高'):
return 5
elif (RTEG == '一'):
return 4
elif (RTEG == '二'):
return 3
elif (RTEG == '三'):
return 2
elif (RTEG == '四'):
return 1
elif (RTEG == '等'):
return 1
elif (RTEG == '' and GLLX=='国道'):
return 3
elif (RTEG == '' and GLLX=='建筑中国道'):
return 3
elif (RTEG == '' and GLLX=='省道'):
return 2
elif (RTEG == '' and GLLX=='建筑中省道'):
return 2
else:
return 1
也可以使用【按属性选择】和【计算字段】工具结合方式来赋值。
2.2.4 街区数据入库
在结果数据库中,创建名为“街区”的面要素类,坐标为CGCS2000 GK CM 119E。
勾选“江苏省地图政区图.jpg”图层可见。在地图中找到街区的图例,按照各地级市街区的外轮廓范围矢量化,并添加名称字段。
需要注意连云港市、南京市街区为多部件要素(分别矢量化小部件,再使用编辑中的合并工具),且在江宁区位置存在中空的情况。(挖空可以使用编辑中的分割工具)。
图30 连云港市 南京市要素
最终矢量化效果如下
图31 江苏省地级市街区
2.3 整合POI数据并入库
2.3.1 餐饮POI数据入库
使用【XY表转点】工具,依次导入“餐饮 POI”相关点数据,将Excel表数据转为点要素,坐标系为CGCS 2000。(注意不是CGCS2000 GK CM 119E。Excel表中坐标为经纬度,一般使用地理坐标系)。
小窍门:在该工具上右键选择批处理,统一导入餐饮 POI数据。选择批处理输入表参数时,可以直接在内容列表中拖拽全部的餐饮表,比下拉列表选择方便。输出要素类参数需要是与名称相关的变量。
图32 【xy表转点】批处理工具对话框
使用批量【投影】工具,将上述要素类转换成CGCS2000 GK CM 119E坐标系。
图33 【投影】批处理工具对话框
2.3.2 清洗餐饮POI数据
使用品牌店名关键词,依次提取不符合关键词的要素,人为判断要素是否正确,对错误要素进行删除。以关键词‘肯德基’为例。
使用【按属性查询】工具,SQL语句填写name NOT LIKE'%肯德基%'。
图34 【按属性选择】工具对话框
得到不包含关键词的3个要素。可以将编号359、646的name属性改为肯德基,删除编号为828的点。再对数据进行保存。
图35 数据清洗
2.3.3 合并餐饮POI数据
使用【合并】工具,输入数据集依次为相关品牌,输出数据集为“餐饮POI”。
图36 【合并】工具对话框
使用【计算字段】工具,添加名为“品牌名称”的字段,并使用Python语法对其品牌进行判断。
图37 【计算字段】工具对话框
代码如下
def Reclass(name):
if ('麦当劳' in name):
return '麦当劳'
elif ('肯德基' in name):
return '肯德基'
elif ('星巴克' in name):
return '星巴克'
elif ('瑞幸咖啡' in name):
return '瑞幸咖啡'
elif ('luckin coffee' in name):
return '瑞幸咖啡'
elif ('都可茶饮' in name):
return '都可茶饮'
elif ('CoCo 都可' in name):
return '都可茶饮'
elif ('coco 都可' in name):
return '都可茶饮'
elif ('蜜雪冰城' in name):
return '蜜雪冰城'
elif ('7 分甜' in name):
return '7 分甜'
elif ('喜茶' in name):
return '喜茶'
elif ('1 点点' in name):
return '1 点点'
也可以在清洗完数据后,分别对各类数据添加品牌字段,并独立赋值。两种解决方法都可以。
2.3.4 学校POI数据入库
参考2.3.1步骤,依次导入小学、幼儿园点数据。并进行投影转换。
2.3.5 合并学校POI数据
使用【计算字段】工具,分别为小学及幼儿园图层添加“学校类型”字段,并赋值。这里以小学图层为例。
图38 【计算字段】工具对话框
使用【识别】或【相交】工具,分别为小学及幼儿园图层挂接所属行政区。(【识别】与【相交】工具的区别在于,【识别】保留了空间上不在江苏省所属行政区范围内的要素,其原因在于POI数据与行政区数据来源不同,数据有稍微的偏差)。
图39 【相交】工具对话框
其属性表如下
图40 小学属性表
分别使用【汇总统计数据】工具,统计不同地级市内的小学/幼儿园数量。注意选择案例分组字段参数。输出结果中的FREQUENCY字段表示各地级市对应的小学/幼儿园数量。(也可以选择使用【频数】工具)
图41 【汇总统计数据】工具对话框
加载江苏省统计年鉴至Pro。
分别使用【连接字段】工具,为小学/幼儿园图层连接小学/幼儿园数量表中的统计字段以及江苏省统计年鉴中的人口数量。(也可以使用在图层上右键【添加连接】的方式,二者区别是【添加连接】是临时的,【连接字段】是永久的)
图42 【连接字段】工具对话框
使用【合并】工具,将小学和幼儿园数据进行合并,输出要素名为“学校POI”。
图43 【合并】工具对话框
使用【计算字段】工具,计算权重。权重=!人口万人! / !FREQUENCY!。
图44 【计算字段】工具对话框
2.4 制作地图
2.4.1 制作江苏省人口地图
使用【融合】工具,将行政境界面图层按照所属地级市进行融合。
图45 【融合】工具对话框
使用【连接字段】工具,为地级市境界面图层连接江苏省统计年鉴中的人口数量。
图46 【连接字段】工具对话框
题目中没有明确的比例尺、符号化、专题图样式等要求,可以参考江苏省地图政区图提供的相关信息。
可以考虑使用分级色彩或者分级符号的方式制作人口专题图。注意选择的配色方案与政区图图片风格统一。
对于行政境界点、行政境界线数据,可以根据其类型进行分类符号化。
新建布局,选择自定义布局大小,大小为“60*60CM”(与1:1000000比例尺对应)。
图47 布局大小设置
将目录中的地图直接拖拽至布局中。设置左下方的比例尺为1:1000000。
添加名称、指北针、比例尺以及图例。
在共享菜单栏中,选择导出布局。导出PNG、PDF等格式图片。分辨率最高设为300DPI。效果如下图:
图48 江苏省人口专题图
2.4.2 制作公路核密度图
使用【核密度分析】工具生成公路核密度数据。Population字段设为“权重”,输出像元大小为“500”,搜索半径为“5000”。切换到【环境】选项卡,设置掩膜参数为“行政境界面”。
图49 【核密度分析】工具对话框
调整结果图层的颜色,使其更加清晰。
图50 江苏省公路核密度专题图
2.4.3 制作餐饮 POI 核密度图
同2.4.2方法制作餐饮POI核密度图。使用【核密度分析】工具生成餐饮POI核密度数据。Population字段设为“NONE”。
图51 【核密度分析】工具对话框
调整结果图层的颜色,使其更加清晰,这里选择几何间隔分类方法。结果如下图所示:
图52 江苏省餐饮POI核密度专题图
2.4.4 制作学校 POI 核密度图
同2.4.2方法制作学校POI核密度图。使用【核密度分析】工具生成学校POI核密度数据。Population字段设为“权重”,输出像元大小为“500”,搜索半径为“5000”。
图53 【核密度分析】专题图
调整结果图层的颜色,使其更加清晰,这里选择几何间隔分类方法(方法不限)。结果如下图所示。
图54 江苏省学校POI核密度专题图
3 总结
这是一道非常实用的数据处理及可视化的题目,涉及到投影变换、数据组织与管理、数据处理、制图等多个基本GIS操作,重点考察同学们对GIS工具的熟练程度。当然,要想提升比赛的分数,就需要重点考虑数据清洗、制图等方面的细节;在处理数据时,善于总结和分类,才能够快速的判断数据的区分方法(试题中的分类数据来自公众版基础地理信息数据,其分类依据来自国家规范,同学们可以作为日常知识点补充);考题中的第一部分的要求可能需要在完成第二步的操作之后才能继续,需要边考虑要求边观察分析数据,得出最佳的解题步骤,节省时间;文章中给出的解题步骤,部分顺序是可以调整的,并不影响结果 。
上午的题目没有特别难以理解的工具,所以对细节的把握上和细节处理就非常重要。建议:上述数据操作都存在一定的工作量,在比赛时一定要注意时间的把握以及成员之间合理的分工。
M姐实验室(2024.2.29)