大家好,又见面了,我是你们的朋友全栈君
楼主按:在今年的Esri中国用户大会上,我听了几场关于ArcGIS用于制图方面的讲座,也在体验区与Esri中国的技术老师有一些交流。一直觉得ArcGIS在空间数据管理和分析方面很强大,而在制图方面却表现得不怎么样。我看到在国内很多人制图用的是CorelDraw、AI(可能不仅仅是国内,国外的专业制图也是),诚然这些软件作为专门的图形软件,在很多方面有不可比拟的优势,但是对于地理信息制图来说,图形不能和地理信息相关联却是这些软件最大的软肋。而ArcGIS越来越注重在制图方面的发展与应用,每年举办的制图大赛就是推广之一。
讲座听完了我当然想自己有所实践,于是便产生了此文。本文以中国年降水量分布图的制作为例详细地介绍了数据的获取、预处理、空间降水插值直到最后成图的整个过程。共分为三个部分:
第一部分:底图的制作。这一部分介绍衬托专题图的底图的制作,这一部分的结果还可以作为其它专题图的底图;
第二部分:中国年降水量插值。这一部分介绍用ArcGIS的空间插值方法将气象站点的降水量数据插值得到全国范围内的降水分布;
第三部分:地图整饰。这一部分介绍添加地图要素和美化及最后出图。
所有的步骤都在ArcGIS10/10.1环境下,本文涉及到的数据,以及最后结果(包括本文)都可以在网盘中下载,链接:https://pan.baidu.com/s/17KkfItDB0iOxYv2feqYMKA 提取码:n4ne
第一部分:底图的制作
Step1-1:数据准备
(1)先在网上下载中国地图shp格式的文件以及中国省级行政中心的shp文件(网上一搜就有了,不过我还是建议在国家基础地理信息系统(nfgis.nsdi.gov.cn/nfgis/Chinese/c_xz.htm)上下载来保证数据的权威性,不过这个网站经常上不去);
(2)世界国家图以及河流矢量图。如果大家安装了IDL,那么在IDL的安装目录下:D:Program FilesITTIDLIDL80resourcemapsshape(我的IDL安装在D盘),可以找到cntry02.shp和rivers.shp;
总共包含五个文件:
bou2_4l.shp:中国政区的线文件,在这个线文件里包含了南海的九段线
bou2_4p.shp:中国政区的面文件
rivers.shp:世界主要河流
cntry02.shp:世界国家面文件
省会城市.shp:中国省会城市点文件
注意:ITT提供的两个文件没有设置坐标系,需要先在Catalog中将这两个文件(rivers.shp和cntry02.shp)的地理坐标系设为WGS84。
Step1-2:设置投影
打开ArcMap将这些文件添加进去,接下来我们要给Dataframe设置一个投影坐标系。由于我们要做的是中国全国的降水量分布,我们使用等面积的Albers投影。右击Layers->Properties->Coordinate System选项卡->newProject System,选择Albers,设置中央经线105,标准纬线25度,47度,在地理坐标系中选择WGS84。设置如图:
Step 1-3:放大图我们可以看到,沿海一带有很多面积很小的岛屿,为了制图的美观,我们需要删掉一些面积小的岛屿,但是在这之前,我们必需把南海诸岛以及台湾周围的岛屿保留下来(原因大家都懂的)。
关闭其它图层(只留下政区图层bou2_4p),开始编辑进入编辑状态,选中南海的那些岛屿以及台湾周边岛屿,如图:
在bou2_4p图层上右击选择Selection->Create Layer From Selected Features。将选中的要素创建一个新的图层。
停止编辑,在刚刚产生的图层上右击选择Data->Export Data…,将选择的要素导出,命名为“南海诸岛及其它岛屿.shp”。
接下来我们就可以删掉面积小的岛屿了。继续进入编辑状态,打开bou2_4p的属性表,打开Select by Attribute对话框,输入”AREA”< 0.01,点击apply,选中面积为小于0.01的多边形,删除。
Step1-4: 提取出中国的轮廓线
接下来我们要从政区文件(bou2_4p)中提取出中国的轮廓线。这一步的目的是我们要分开中国在陆地上的国界和在海岸线上的国界,因为这两者在制图的时候是不同的。之所不直接用政区线文件提取轮廓是因为经过一些处理以后用面文件提取会更方便(下面会细说);而不用IDL中的国家(cntry02)是因为ITT提供的世界图是他们所认为的世界图(对比一下中国的藏南地区就会发现,在这个世界图上,中国的藏南地区是直接划给印度的,所以我们不用它,只把它作为底图)。
打开Toolbox->Data Management Tools->Features->Polygon to Line,将输出文件命名为“中国线.shp”。确保”Identifyand store polygon neighboring information(optional)”选中(保留每条线段两边的多边形信息是下一步提取轮廓线的关键;另外,Feature to Line也能实现面转线的功能,但是没有选项)。
打开“中国线.shp”属性表,选中LEFT_FID=-1或者RIGHT_FID=-1的所有要素,这个时候边界上的所有线要素就被选中了。如前所述的方法,将选中的要素创建图层,并导出成单独的图层,命名为“中国轮廓线.shp”。
Step1-5:提取陆上国界和海上国界
新建一个点文件(坐标系设为WGS84),进入编辑状态。在辽宁与朝鲜的入海口处、广西与越南的入海口处创建两个点,保存并停止编辑。
使用Toolbox->Data Management Tools->Features->Split Line atPoint工具,将线在点处打段。并且在编辑状态下,用Merge工具将两部分分别合并在一起;并新建一个字段用以区分陆上国界和海上国界。
Step1-6:提取出九段线
这一步我们从中国政区的线文件(bou2_4l)中提取出九段线。名称是叫九段线,但是实际上在现在地图出版物中都是10段的。这一步比较简单,在编辑状态下选出这10段线,导出成单独的文件,命名为“九段线.shp”。
到目前为止,我们已经整理出来我们的底图所需要的要素文件:
省会城市(点)
九段线(线)
中国轮廓线(线)
河流(线)
南海诸岛及其它岛屿(面)
中国政区(面)
国家(面)
接下来我们对这些要素进行符号化。
Step1-7:纸张设置
首先在File->Page and Print Setup中,将纸张调成横向。进入版面视图,适当调整数据框的大小和位置(上面留出写标题的空间,右边留出说明文字的空间),将地图比例尺改为1:25 000 000。
Step1-8:设置国家层的符号样式
将国家层的填充颜色设为10%灰度,边框宽度0.2,边框颜色为20%灰度。这时,整体如图:
Step1-9:设置国界线的符号样式
双击“中国轮廓线”图层打开Layer Properties对话框,在Symbology中选择Categories方式,在ValueField中选择国界类型,点击Add all Values。双击陆上国界的符号,打开Symbol Selector对话框,随便选择一种线型符号,点击“Edit Symbol”,打开Symbol Property Editor对话框。
对对话框中点击左下的“ ”号新建两层。将线型符号的颜色设为50%灰度,线宽0.5,Line Joins为“Round”。第二层的颜色设为Mango(RGB 255,211,127),线宽2,Line Joins设为“Round”,将Line Propeties中的Offset设为1。类似地,第三层的颜色设为Topaz Sand(RGB 255,235,175),线宽4,Line Joins设为“Round”,将Line Propeties中的Offset设为2。点击确定,返回Symbol Selector对话框,可以将刚刚设置的样式保存。
点击确定返回Layer Properties对话框,将海上国界的符号样式设置为:颜色Yogo Blue(RGB 115,178,255),线宽0.4。设置完成后国界线的效果如图:
将九段线的符号样式也设置成陆上国界的样式。
Step1-10:设置省会城市符号
将省会城市的符号类型设置为“Circle 19”,颜色50%灰度,大小6。并右击该图层设置“Label Features”。
Step1-11:设置河流符号样式
使用ArcToolbox->Cartography Tools->Generalization->Smooth Line工具,将河流光滑。”SmoothingAlgorithm”方法选择BEZIER_INTERPOLATION。完成以后设置河流的符号样式为:颜色Cretean Blue(RGB 0,112,255),线宽0.5。为了只让它显示长江和黄河,双击光滑过的河流图层,切换到“Definition Query”选项卡,在Definition Query中输入”NAME” = ‘Huang He’ OR “NAME” = ‘Yangtze’,点击确定。
Step1-12:为数据框设置背景颜色
双击数据框“Layers”打开Data Frame Properties对话框,切换到“Frmae”选项卡,在“Background”中选择“Lt Blue”,确定,此时效果如图:
Step1-13:为数据框添加经纬线
双击数据框“Layers”打开Data Frame Properties对话框,切换到“Grids”选项卡,点击“New Grid…”,保持默认一直到Finish。接下来点击“Properties…”打开“Reference System Properties”对话框。
在“Axes”选项卡中,取消”Major Division Ticks”和”Subdivision Ticks”中所有的复选框;
在“Interior Labels”选项卡中,取消”Show interior grid labels”复选框;
在“Labels”选项卡中,设置Label的字体为Times new Roman,8号,“Label Offset”为“-2”pts。点击“Additional Properties”打开“Grid Label Properties”对话框,取消“Show coordinate direction labels”复选框,取消“Show zerominutes”和“Show zero seconds”复选框;
在“Lines”选项卡中,点击Symbol,设置经纬线的符号样式为:颜色Moorea Blue(RGB 0,169,230),线宽0.2;
点击确定,效果如图:
Step1-14:添加北回归线
双击数据框“Layers”打开Data Frame Properties对话框,切换到“Grids”选项卡,点击“New Grid…”,保持默认一直到Finish。点击“Properties…”打开“Reference System Properties”对话框。
在“Lines”选项卡中设置线型为“Dashed 4:4”,颜色40%灰度,线宽0.4;
在“Label”选项卡中取消所有复选框;
在“Intervals”选项卡中如下设置:
点击确定。点击菜单”Insert”->”Text”插入“北回归线”四个字,双击这四个字,如下设置:
到现在为止,我们的底图就基本做完了,效果如下图所示。之所以叫基本做完了,是因为,还有重要的南海诸岛没有放上去,但是这一步我们留到最后才做。
第二部分:中国年降水量插值
要做中国年降水量的空间分布图,首要的问题是如何获取降水量数据,我们从中国气象科学数据共享服务网(cdc.cma.gov.cn)下载中国国际地点交换站的降水量数据。
Step2-1:数据准备
中国气象科学数据共享服务网(cdc.cma.gov.cn)。在中国地面国际交换点气候资料日值数据集(本文可以直接利用月值数据集来做)中下载2011年中国气象站20-20时降水量数据,包括66430条数据。并下载元数据。元数据中包括中国地面气候资料国际交换站数据集台站信息,其中有区站编号、站名、经纬度、海拔高度等信息。站点的经纬度信息是建立空间关系的基础(如图1所示)。国际交换站从建站到2007年资料台站数为206个。
下载不到数据的请点这里(百度网盘-链接不存在)
Step2-2:数据预处理
在下到的数据中,有一些值如999、9999、32700等是填充值,要先去掉。接下来,这些数据存放的是每个台站365天的降水量,所以先要统计得到每个站的年降水量数据。在Excel中打开降水量数据表,选中所有数据,点击插入->数据透视表,插入一个新的数据透视表。
在数据透视表中勾上“台站”、“月”和“20-20降水量(无填充值)”。并拖到如下图所示的位置,在“数值”一栏中设置“求各项”,这样就统计出了每个气象站点的年降水量值。将这个表整理,并将降水量由0.1mm处理成1mm为单位的数据。
Step2-3:导入站点数据
在下载到的站点信息中提供了每个站点的经纬度坐标,这样我们可以利用ArcMap->File->Add Data->Add XY Data将站点导入ArcMap中,注意导入时设置坐标系为WGS84。用Data->ExportData将站点导出成shp文件,命名为“气象站点.shp”。如图2-4。
Step2-4:投影气象站点
使用Data Managerment Tools->Project andTransformations->Features->Project工具将点数据投影到Albers平面上(中央经线105度,标准纬线25度、45度。生成气象站点_Project文件)。
Step2-5:关联气象站点与降水量值
在气象站点_Project右击->Joins and Relates->Join,使用台站号作为关联ID,将气象站点与每个站点的降水值关联起来。从关联结果可以看出,只有181个(总共206个)关联成功了,这是因为有些气象站点被废弃不用了。结果如图:
Step2-6:插值方法研究
接下来我们便要用这181个样本点的数据插值得到全国的年降水量分布。空间降水插值一直是个难题,影响降水的因素很多,如经度、纬度、高程、坡度、坡向、离水体的距离等,建立一个通用的降水插值模型几乎是不可能的。空间降水插值方法很多,优缺点和适用性不同。总体上,降水的空间插值方法有3类:整体插值法(趋势面法和多元回归法等) 、局部插值法(泰森多边形法、反距离加权法、克里金插值法和样条法)和混合插值法(整体插值法和局部插值法的综合) 。何红艳(2005)比较了各种降水插值的优缺点:
在这里,克里金插值能达到较高的精度,而为了能考虑高程的因素,我们选择使用协同克里金插值。协同克里金插值的一个前提是,降水量与高程应该有相关性。为此,下一步我们要验证年降水量与高程是不是相关的。
Step2-7:相关性检验
在我们关联的降水量数据以后,气象站点的属性表里就有了站点的高程和站点的年降水量。把属性表导出,并用SPSS检验两者的相关性,结果如下:
结果表明,站点的年降水量与高程显著相关,于是,我们便可以利用站点本身附带的高程数据对降水量进行插值了。
Step2-8:降水量插值
在工具栏空白处右击打开Geostatistical Analyst工具条,选择Geostatistical Wizard,每一步的设置如下:
第一步:在“Methods”中选择“Kriging/CoKriging”,Dataset中选择“气象站点_Project”,DataField选择“降水量_毫米”,Dataset 2中选择“气象站点_Project”,DataField选择“海拔高度”;
第二步:由经验知我国的降水由东南往西北会递减,在这里选择“First”以剔除降水分布的趋势分布(一次);
第三步:年降水量分布的趋势(一次趋势面)
第四步:设置Number of Lags为24
第五步:设置SectorType为四方向
第六步:交叉验证
由交叉验证结果可以看出,插值误差为0.899(毫米),均方根误差162.0961,平均标准误差为156.8678,两者比较接近。标准均方根误差为1.039048。点击Finish完成插值。
Step8:插值结果导出。插值所覆盖的范围默认只包含气象点的最小外包矩形,要把它扩展到整个中国区域。双击插值产生的图层在Layer Properties对话框中切换到“Extent”选项卡,在“Set the Extent to ”选择“the rectangular extent of 中国政区”。
在插值结果图层上右击,选择Data->Export to Raster,将结果导出成栅格数据。并使用Spatial Analyst->Extraction->Extract byMask将中国区域提取出来,结果如图:
到这里,我们就完成了中国年降水量的插值了。
第三部分:地图整饬
Step3-1:降水量分级
注意,这一步我们从克里金插值得到的结果做起,而不是从导出的栅格数据做起,因为ArcGIS将插值结果导出栅格时会有一些小小的问题(从图2-16的西藏地区的结果可以看出,当然这也可能是样本点的问题)。从插值结果可以看出,年降水量在1.68-1957.28mm的范围内,我们按照母100毫米分一级的等距分级法进行分级。双击插值结果图层打开Layer Properties对话框,在Symbology选项卡中选择Classified方法,点击“Classfify…”,选择“Manual”,Classes:20,在“Break”中手动输入从100-2000:
点击OK,选择从蓝色到红色的渐变,结果如图:
Step3-2:结果导出成矢量文件
右击选择Data->Export to Vector,在“Contour Type”中选择“FILLEDCONTOUR”,导出文件命名为降水量。
Step3-3:分级设色
双击降水量图层,设置如下:
点击确定。这里有两种方法,使得只显示中国范围内的数据:
方法一:动态裁剪法。双击数据框Layers,设置图层的裁剪范围:
方法二:矢量转栅格。将降水量的矢量数据转为栅格数据,并用Spatial Analyst->Extraction->Extract by Mask将中国区域提取出来。
由于第一种方法每次刷新时都要实时计算显示的范围,速度很慢,帮本文使用方法二。结果如图:
Step3-4:生成等降水量线
用Spatial Analyst->Surface->Contour,设置间隔100,生成等降水量线。并使用Maplex引擎对其进行标注。ArcGIS10.1默认使用Maplex标注引擎,在ArcGIS10中,可以通过打开DataFrame Properties对话框在General选项卡中设置标注引擎为Maplex。
双击等降水量线在图层属性对话框中切换到Labels选项卡,设置标注的字体和颜色,点击“Placement Properties”,在“Label Position”中设置标注方式为“Contour Placement”;在“Label Density”中勾选“Repeat Label”并设置适当的间隔;效果如图:
Setp3-5:添加南海诸岛
复制一份数据框Layers,粘贴,并调整到适当大小。
Step3-6:添加图例
在左下角放置图例,图例的类型是“Legend Item Selector”中的第一种。
Step3-7:添加比例尺和投影信息
在左上角添加比例尺和投影信息。
Step3-8:添加其它要素
可以再添加对我国年降水量分布特征的说明性文字,ArcGIS中可以插入对象,将Word文档插入到MXD文档中,但是在导出图片的时候会有一些问题,所以本文把这些文字做成了图片插入。另外,还可以在EXCEL中统计年降水量最多或最小的站点的数据,做成图片插入MXD文档中。最后添加一些制作人的信息。
Step3-9:出图
到现在为止,所有的工作都完成了,File->Export Map把图片导出成JPG格式,设置下分辨
率300dpi,最终的结果如下:
总结:制作一幅精美的地图要考虑很多的因素,一些很小的细节都要考虑到,涉及到从数据到处理到分析的各个方面。ArcGIS为精细化制图提供了一个很好的平台。当然本文的最终结果还有很多可以改进的地方,比如有的地方样本点太少(如西藏,台湾),导致这些地方的插值结果误差较大(涉及到数据的问题);本文使用的协同克里金插值是否是正确的需要进一步考证(涉及到降水的插值方法);地图的配色是否美观等等。
当然ArcGIS也还需要一些改进,比如使用Geostatistical Wizard产生的插值中间结果导出成栅格文件时会产生一些数据异常(与导出的矢量数据结果不一致,这也是本文导出成矢量再转栅格的原因);使用数据框的动态裁剪功能速度太慢;Maplex还是没有实现把字标注在线上并且在字的底下不显示那条线(看上去就是线被打断成两截)的功能;ArcGIS在插入对象后导出图片时对象那一块会没有显示;对段落文本的支持不够,等。
当然我也相信,随着GIS的发展,尤其是“普适化”的发展,这些问题都会不断地解决,制图将会变得更方便,更大众化。
最后感谢Esri中国技术团队的老师们~
参考文献
何红艳,郭志华,肖文发. 降水空间插值技术的研究进展[J]. 生态学杂志, 2005, 24(10) :1187~1191
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157827.html原文链接:https://javaforall.cn