分享

更好的等值线

 GIS荟 2021-09-19

前言:直接使用等值线工具制作出的等值线非常丑,只需一小步,就能完全改变这种情况,制作出专业级的等值线图。

等值线

等值线,是一大类的统称,比如等高线、等温线、等降雨线等,是一种非常非常常见的数据可视化方法,几乎所有人都见过。

在我做耕地质量评价的时候需要制作有机质、有效磷等参数的等值线图,然后我就直接使用 ArcGIS 自带的等值线工具:Spatial Analyst 工具->表面分析->等值线

等值线工具设置界面

直接使用该工具制作有机质栅格的等值线图,结果非常的“潦草”,基本上是不能使用的。

普通方法制作的等值线图

那么如何才能制作出光滑清晰的等值线图呢?

其实在使用等值线工具前最好对原始栅格数据进行“模糊”处理:

Spatial Analyst 工具->邻域分析->焦点统计

焦点统计工具可以重新计算栅格中的每一个像元值,计算规则是根据指定的像元邻域内的值来计算,可以是邻域范围内值中最大值、最小值、众数、中位数,当然最常见的、默认的是使用平均值,这也是为什么说是“模糊”处理的原因。

焦点统计工具设置界面

根据各自的情况选择合适的领域设置后(高度、宽度多试试),点击确认输出处理后的栅格;

接着使用等值线工具,输出的等值线结果如下,是不是顺眼多了:

那么试试现成的30米分辨率的 DEM 数据:

也是同样的情况,下面左边的是默认生成的等高线,间距是200米,线条比较曲折同时较为零碎,不利于解译;

而在对原始 DEM 进行焦点统计后再生成的200米间隔的等高线就非常的平滑、美观、易于理解。

左:处理前;右:处理后

一键制作工具

由于经常使用这种功能,我直接写了一个脚本工具(最后附下载),同时考虑了不规则栅格在较大邻域范围会出现结果栅格尺寸变大的情况。

# -*- coding:utf-8 -*-from __future__ import absolute_importimport arcpyarcpy.env.overwriteOutput = Truearcpy.CheckOutExtension("Spatial")arcpy.CheckOutExtension("3D")def better_isogram(input_raster, output, neighborhood, distance):    """   直接使用软件自带的等值线工具制作栅格的等值线,   线条比较曲折同时较为零碎,不利于解译;   集成焦点统计工具对原始栅格数据处理后再生产等值线图,   线条清晰光滑,易于解译和使用。   :param input_raster: 输入栅格   :param output: 输出更好的等值线数据集。   :param neighborhood: {Int} 邻域分析,指定的像元范围   :param distance: {Double} 等值线间隔   :return:   """            # 进行焦点统计分析        fs = arcpy.sa.FocalStatistics    nrt = arcpy.sa.NbrRectangle    neighborhood = int(neighborhood)    neighborhood = nrt(neighborhood, neighborhood, "cell")    fs_result = fs(input_raster, neighborhood, "MEAN")            # 等值线计算        contour = "in_memory/contour"    arcpy.sa.Contour(fs_result, contour, float(distance))            # 获得输入栅格范围矢量 ▶注释一◀        domain = "in_memory/domain"    arcpy.RasterDomain_3d(input_raster, domain, "POLYGON")            # 擦除范围外的线条 ▶注释二◀        erase_left = "%scratchFolder%/out172005.shp"    arcpy.AddMessage(neighborhood)    arcpy.Erase_analysis(contour, domain, erase_left)    arcpy.AddMessage(neighborhood)    arcpy.Erase_analysis(contour, erase_left, output)    arcpy.Delete_management(erase_left)    if __name__ == '__main__':    args = tuple(        arcpy.GetParameterAsText(i) for i in range(            arcpy.GetArgumentCount()))    better_isogram(*args)

▶注释一◀

RasterDomain_3d 可将栅格的范围提取保存为矢量数据。

▶注释二◀

在使用焦点统计功能的时候,设置到邻域范围的选取,如果该值取到50,可以明显发现焦点统计后输出的栅格数据大了一圈。

同时在工具箱环境中设置栅格范围、掩膜都不起作用,所以无奈在最后一步使用擦除的方法解决外面多出来的区域。

最后

该工具命名为更好的等值线,已经导入到海怪工具箱中。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多