体素图层表示规则的多维体积格网数据。 体素图层的数据源可以是 netCDF 文件、场景图层包或场景服务。 ArcGIS Pro 提供了多种地理处理工具和工作流,用于创建适合体素图层的数据源。 各种工作流允许您根据 3D 点输入、地统计分析或通过转换要可视化为体素图层的现有多维数据(如栅格数据)来创建多维数据。 有关体素图层的其他信息,请参阅支持的体素格式和常见问题解答。
输入 | 处理 | Learn ArcGIS 课程 |
---|---|---|
点 | 通过聚合点创建时空立方体 | |
点 | ||
点 | Python netCDF4 | |
netCDF | 创建多维体素图层 | |
多维栅格(netCDF、GRIB、HDF、CRF)或栅格数据集 | 复制栅格、栅格转 NetCDF | |
表 | 表转 NetCDF、Python netCDF4 |
注:
要素转 NetCDF工具不会生成适用于体素图层的输出。
使用地统计分析根据点输入创建体素图层
您可以将点数据作为体素图层进行插值和可视化。 例如,您可以分析研究区域的氧含量如何随时间变化。 在 ArcGIS 中,地统计分析允许您分析这些类型的模式。 您可以可视化在不同深度测得的溶氧测量值并执行 3D 地统计插值,以预测整个研究区域的氧含量。 您可以根据地统计分析来创建 3D netCDF 文件,并将其可视化为局部场景中的体素图层。 如果局部场景处于活动状态,则地统计分析工具会将体素图层输出到场景。 兼容工具包括 3D 经验贝叶斯克里金法、IDW 3D 和 3D 最近邻域。
- 单击分析选项卡,然后单击工具 。
- 在地理处理窗格中,搜索 3D 经验贝叶斯克里金法,单击以打开该工具,并设置以下参数:
- 输入要素 - 将内插的输入点要素图层
- 高程字段 - 保存每个点的高度值的字段
- 值字段 - 包含要内插的测量值的字段
- 输出地统计图层 - 所生成的地统计图层
- 单击运行 。
地统计图层随即生成。
- 在地理处理窗格中,搜索 3D GA 图层转 NetCDF,单击打开该工具,并设置以下参数:
- 输入 3D 地统计图层 - 步骤 3 中的 3D 地统计图层
- 输出 netCDF 文件 - 输出 netCDF 文件的名称
- 单击运行 。
该体素图层将显示在场景中。
使用“创建时空立方体”工具根据点输入创建体素图层
多维数据可以将 x,y 和时间表示为高度维度。 例如,您可以分析研究区域的暴风雨模式如何随时间变化。 在 ArcGIS Pro 中,时空立方体允许您分析这些类型的模式。 时空立方体可以将一组点汇总到一个 netCDF 文件中,方法是将其聚合为时空立方图格。 在每个立方图格中,都会对点进行居中处理并对指定属性进行聚合。 对于所有立方图格位置,评估计数和汇总字段值。 因为体素图层需要规则的格网数据,所以聚合形状必须是渔网类型。 其结果为 x,y,t 体积数据结构。
- 单击分析选项卡,然后单击工具 。
- 在地理处理窗格中,搜索通过聚合点创建时空立方体,单击将该工具打开,然后设置以下参数:
- 输入要素 - 要聚合的输入点要素图层。
- 输出时空立方体 - 将生成的输出 netCDF 文件。
- 时间字段 - 包含每个点的日期和时间的字段。
- 时间步长 - 用来表示单个时间步的秒数、分钟数、小时数、天数、周数或年数。
- 距离间隔 - 用于聚合输入要素的立方图格大小。
- 汇总字段 - 包含用于在聚合到时空立方体时计算指定统计数据的属性值的数值字段。
- 聚合形状类型 - 选择渔网格网。
- 单击运行 。
时空立方体随即生成。
- 单击地图选项卡,然后单击添加数据 。
体素图层需要一个活动的局部场景。
- 单击添加多维体素图层 并指定在步骤 3 中创建的输出 netCDF。
- 单击确定。
该体素图层将显示在场景中。
根据多维栅格创建体素图层
多维数据具有多种格式。 目前,体素图层仅支持 netCDF 数据。 您可以使用复制栅格工具将其他多维格式(例如 GRIB、HDF 和 CRF)的数据导出为 netCDF 文件。
- 单击分析选项卡,然后单击工具 。
- 在地理处理窗格中,搜索复制栅格,单击以打开该工具,并设置以下参数:
- 输入栅格 - 将此设置为输入多维栅格。
- 输出栅格数据集 - 将此参数设置为具有 .nc 文件扩展名的输出 netCDF 文件。
- 无数据值 - 移除默认值并将其留空。
- 格式 - 选择 NetCDF 格式。
体素图层需要将数据转换为规则的格网数据。
- 单击运行 。
netCDF 文件随即生成。
- 单击地图选项卡,然后单击添加数据 。
体素图层需要一个活动的局部场景。
- 单击添加多维体素图层 并指定在步骤 3 中创建的输出 netCDF。
- 单击确定。
该体素图层将显示在场景中。
根据 .csv 文件创建体素图层
在本例中,netCDF 文件将使用 .csv 文件生成。 该 .csv 文件将包括五列:X、Y、Z、T 和数据。 此外还需假设该 .csv 文件在所有维度上均匀地进行了格网化处理。 在创建 netCDF 文件后,可以运行创建多维体素图层工具并将其另存为图层文件以添加至局部场景。from netCDF4 import Dataset
import numpy as np
import pandas as pd
import arcpy
#Create a pandas dataframe and insert data from CSV/TEXT file
filePath = "myFile.csv"
dfPoints = pd.read_csv(filePath)
#Sort values to ensure they are in the correct order
dfPoints = dfPoints.sort_values(by=['T','Z','Y','X'])
#Create domain for longitude/latitude
#Each domain has unique values, no repeating numbers, and are sorted (to be monotonic)
xDomain = np.sort(np.unique(dfPoints.iloc[:,0].values)) # 0th column contains x values
yDomain = np.sort(np.unique(dfPoints.iloc[:,1].values)) # 1st column contains y values
zDomain = np.sort(np.unique(dfPoints.iloc[:,2].values)) # 2nd column contains z values
tDomain = np.sort(np.unique(dfPoints.iloc[:,3].values)) # 3rd column contains t values
#Create NetCDF file
outDataSet = Dataset('myNetCDF.nc', 'w', format = 'NETCDF4') # Creates the output NetCDF file
outDataSet.createDimension('x', len(xDomain)) # Creates the x dimension
outDataSet.createDimension('y', len(yDomain)) # Creates the y dimension
outDataSet.createDimension('z', len(zDomain)) # Creates the z dimension
outDataSet.createDimension('t', len(tDomain)) # Creates the t dimension
#Create variables
ncX = outDataSet.createVariable('x', np.float32, 'x') # Create variable x
ncY = outDataSet.createVariable('y', np.float32, 'y') # Create variable y
ncZ = outDataSet.createVariable('z', np.float32, 'z') # Create variable z
ncT = outDataSet.createVariable('t', np.float32, 't') # Create variable t
#Create variable data with dimensions (t,z,y,x). The fill value is set to -99999 which are values to be ignored by client.
ncData = outDataSet.createVariable('data',np.float32,('t','z','y','x'),fill_value = -99999)
#Assign values
ncX[:] = xDomain[:]
ncY[:] = yDomain[:]
ncZ[:] = zDomain[:]
ncT[:] = tDomain[:]
#The dataframe 'Data' column must be reshaped to match the dimension shapes and placed into the ncData variable
ncData[:,:,:,:] = np.reshape(
dfPoints['Data'].values,
(tDomain.shape[0],zDomain.shape[0],yDomain.shape[0],xDomain.shape[0])
)
#Assign variable attributes
ncData.long_name = "My test data"
ncZ.positive = 'up'
ncX.standard_name = 'projection_x_coordinate'
ncX.units = 'm'
ncY.standard_name = 'projection_y_coordinate'
ncY.units = 'm'
ncT.units = 'hours since 2000-01-01 00:00:00'
#Assign global attribute. This attribute is to assign a coordinate system.
outDataSet.esri_pe_string = 'PROJCS["ETRS_1989_UTM_Zone_32N_7stellen",GEOGCS["GCS_ETRS_1989",DATUM["D_ETRS_1989",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",2500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",9.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0],AUTHORITY["Esri",102328]]'
outDataSet.close()
# Create the voxel layer
arcpy.md.MakeMultidimensionalVoxelLayer(outDataSet, "TestVoxelLayer")
# Save the voxel layer to a layer file
arcpy.management.SaveToLayerFile(
in_layer="TestVoxelLayer",
out_layer=r"C:\Temp\TestVoxelLayer.lyrx",
is_relative_path=None,
version="CURRENT"
)