使用IDL进行氚羽流监测(二)——绘制3D地形和地下水位

发布时间 2023-12-27 10:27:37作者: ENVI-IDL技术殿堂

本文我们将探讨如何结合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)