使用IDL进行氚羽流监测(二)——绘制3D地形和地下水位
本文我们将探讨如何结合POLYLINE和SCATTERPLOT3D两种不同的地表制图方法,以进一步描述研究区域的特征。我们使用与上一篇文章中相同的数据,但数据将以三维曲面而非二维等高线图的形式展示。
读入地形数据并对其进行网格化
首先读入基础数据。数据位于 IDL 安装目录下的(examples/data)目录中的 TankDataTerrain.csv 文件中。该文件包含储罐或储井点的地表地形数据,以 X、Y、Z 坐标表示(单位均为米)。该文件的第四列数据包含下层含水层的海拔高度。
在本例中,我们使用 ASCII_TEMPLATE 创建一个模板,需指定数据从第2行开始。
并在第3步中为FIELD1~4设置属性名称为X、Y、Z和AQ。
然后使用 READ_ASCII 读入数据。
; 确保数据从第 2 行开始
; (第 1 行为列标题)。
; 创建基本模板并手动指定 X、Y、Z和 AQ 作为变量名。
myTemplate = ASCII_TEMPLATE(FILEPATH('TankDataTerrain.csv', $
SUBDIRECTORY=['examples', 'data']))
site = READ_ASCII(FILEPATH('TankDataTerrain.csv', $
SUBDIRECTORY=['examples', 'data']),TEMPLATE=myTemplate)
; 使用克里金法对数据进行网格化
; (将维度设置为 100以符合研究区域的大小)。
; 如果愿意,可以选择其他网格方法。
grid = GRIDDATA(site.X, site.Y, site.Z, $
DIMENSION=100, METHOD="Kriging")
创建曲面图
接下来,开始根据地形数据绘制地表图。
DEPTH_CUE 属性在图上产生雾化效果。在本例中,我们使用了 Gouraud 阴影效果,并将 ASPECT_Z 设置为 0.25,缩放 Z 轴维度,使绘图更易于查看。
mySurf = SURFACE(grid, RGB_TABLE=16, TRANSPARENCY=40, $
COLOR='sienna', DEPTH_CUE=[0,1], SHADING=1, $
TITLE="研究区域3D地形和地下水位", $
ASPECT_RATIO=.75, ASPECT_Z=0.25 , $
font_name = 'Microsoft Yahei')
; 将标题方向更改为平行
; 到 z 方位角。
mySurf.TITLE.UPDIR = [0,0,1]
; 隐藏原始轴更容易查看绘图。
mySurf['axis0'].TRANSPARENCY = 100
mySurf['axis1'].TRANSPARENCY = 100
mySurf['axis2'].TRANSPARENCY = 100
; 创建备用轴以便于阅读和更准确地表示数据。
surfXAxis = AXIS('X', LOCATION=-1.5, TITLE='km', TICKINTERVAL=2, $
COORD_TRANSFORM=[0,0.1])
surfYAxis = AXIS('Y', LOCATION=-1.5, TITLE='km', TICKINTERVAL=2, $
COORD_TRANSFORM=[0,0.1])
zAxis = AXIS('Z', LOCATION=[0, 101], TICKINTERVAL=50, $
TITLE='地形及地下水位(m)', AXIS_RANGE=[0.0,600] , $
TICKFONT_NAME = 'Microsoft Yahei')
; 最后,添加网格轮廓和标签。
contours = CONTOUR(grid, C_VALUE=site.Z, PLANAR=0, FONT_SIZE=12, $
C_LABEL_SHOW=0, /OVERPLOT)
; 添加地下水位:对数据进行网格化,然后使用 SURFACE 进行绘制。
gridH2O = GRIDDATA(site.X, site.Y, site.AQ, DIMENSION=100, $
METHOD="Kriging")
myWaterTable = SURFACE(gridH2O, TRANSPARENCY=25, $
COLOR='cornflower', /OVERPLOT)
将储罐和储井位置添加到绘图中
废水被泵入储水井和储罐中,因此要在三维空间中绘制它们与地下水位表面的关系图。我们还将在实际的地表图上绘制储罐和储水井的位置。
; 使用 POLYLINE 在空间中绘制储罐和储水井的位置。
tank1 = POLYLINE([6.6,6.6], [21.0,21.0], [475,473], /DATA, $
TARGET=mySurf, COLOR='red', THICK=10)
well2 = POLYLINE([27.6,27.6], [22.1,22.1], [479,450], /DATA, $
TARGET=mySurf, COLOR='hot pink', THICK=3)
well3 = POLYLINE([56.6,56.6], [14.6,14.6], [463,450], /DATA, $
TARGET=mySurf, COLOR='dark red', THICK=3)
tank4 = POLYLINE([47.1,47.1], [48.3,48.3], [465,462], /DATA, $
TARGET=mySurf, COLOR='orange red', THICK=10)
well5 = POLYLINE([48.4,48.4], [31.3,31.3], [470,460], /DATA, $
TARGET=mySurf, COLOR='medium violet red', THICK=3)
; 绘制井/罐的网格位置,
; 并在表面标记它们的位置。
xLoc = [6.6,27.6,56.6,47.1,48.4]
yLoc = [21.0,22.1,14.6,48.3,31.3]
zLoc = [491,480,463,473,470]
zLocLabels = [495,484,467,477,474]
labels = ['A-401','A-402','A-403','A-404','A-405']
; 使用 SCATTERPLOT3D 将位置放置在表面上
; 使用 TEXT 放置标签。
myPlot2 = SCATTERPLOT3D(xLoc, yLoc, zLoc, /OVERPLOT, SYMBOL='*', $
SYM_SIZE=1, SYM_FILLED=1, SYM_THICK=2, SYM_FILL_COLOR='black')
myLabels = TEXT(xLoc, yLoc, zLocLabels, labels, /DATA, /OVERPLOT)