|

| 前言:直接使用等值線工具制作出的等值線非常丑,只需一小步,就能完全改變這種情況,制作出專業(yè)級的等值線圖。 |
等值線等值線,是一大類的統(tǒng)稱,比如等高線、等溫線、等降雨線等,是一種非常非常常見的數(shù)據(jù)可視化方法,幾乎所有人都見過。 在我做耕地質(zhì)量評價的時候需要制作有機質(zhì)、有效磷等參數(shù)的等值線圖,然后我就直接使用 ArcGIS 自帶的等值線工具:Spatial Analyst 工具->表面分析->等值線。  等值線工具設(shè)置界面直接使用該工具制作有機質(zhì)柵格的等值線圖,結(jié)果非常的“潦草”,基本上是不能使用的。  普通方法制作的等值線圖那么如何才能制作出光滑清晰的等值線圖呢? 其實在使用等值線工具前最好對原始柵格數(shù)據(jù)進行“模糊”處理: Spatial Analyst 工具->鄰域分析->焦點統(tǒng)計。 焦點統(tǒng)計工具可以重新計算柵格中的每一個像元值,計算規(guī)則是根據(jù)指定的像元鄰域內(nèi)的值來計算,可以是鄰域范圍內(nèi)值中最大值、最小值、眾數(shù)、中位數(shù),當然最常見的、默認的是使用平均值,這也是為什么說是“模糊”處理的原因。  焦點統(tǒng)計工具設(shè)置界面根據(jù)各自的情況選擇合適的領(lǐng)域設(shè)置后(高度、寬度多試試),點擊確認輸出處理后的柵格; 接著使用等值線工具,輸出的等值線結(jié)果如下,是不是順眼多了: 
那么試試現(xiàn)成的30米分辨率的 DEM 數(shù)據(jù): 
也是同樣的情況,下面左邊的是默認生成的等高線,間距是200米,線條比較曲折同時較為零碎,不利于解譯; 而在對原始 DEM 進行焦點統(tǒng)計后再生成的200米間隔的等高線就非常的平滑、美觀、易于理解。  左:處理前;右:處理后一鍵制作工具由于經(jīng)常使用這種功能,我直接寫了一個腳本工具(最后附下載),同時考慮了不規(guī)則柵格在較大鄰域范圍會出現(xiàn)結(jié)果柵格尺寸變大的情況。 # -*- 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): """ 直接使用軟件自帶的等值線工具制作柵格的等值線, 線條比較曲折同時較為零碎,不利于解譯; 集成焦點統(tǒng)計工具對原始柵格數(shù)據(jù)處理后再生產(chǎn)等值線圖, 線條清晰光滑,易于解譯和使用。 :param input_raster: 輸入柵格 :param output: 輸出更好的等值線數(shù)據(jù)集。 :param neighborhood: {Int} 鄰域分析,指定的像元范圍 :param distance: {Double} 等值線間隔 :return: """ # 進行焦點統(tǒng)計分析 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 可將柵格的范圍提取保存為矢量數(shù)據(jù)。
?注釋二? 在使用焦點統(tǒng)計功能的時候,設(shè)置到鄰域范圍的選取,如果該值取到50,可以明顯發(fā)現(xiàn)焦點統(tǒng)計后輸出的柵格數(shù)據(jù)大了一圈。 
同時在工具箱環(huán)境中設(shè)置柵格范圍、掩膜都不起作用,所以無奈在最后一步使用擦除的方法解決外面多出來的區(qū)域。 最后該工具命名為更好的等值線,已經(jīng)導入到海怪工具箱中。 
|