创建 Terrain (3D Analyst)

摘要

创建 terrain 数据集

使用情况

  • 平均点间距参数值应反映 terrain 中使用的数据的合理近似值,因为该参数值将用于定义优化数据分析和显示性能的 terrain 内部切片的大小。 每个切片大约包含不超过 200,000 个源高程点。 如果数据在不同位置集聚的密度差异极大,则指定的值应该更偏重于较小的间距。

  • 执行此工具后,请依次使用添加 Terrain 金字塔等级来指定金字塔定义,使用向 Terrain 添加要素类来引用构成表面的数据源,然后使用构建 Terrain 来完成对 Terrain 的构建。

参数

标注说明数据类型
输入要素数据集

将包含 terrain 数据集的要素数据集。

Feature Dataset
输出 Terrain

Terrain 数据集的名称。

String
平均点间距

对 terrain 建模时所用数据点之间的平均水平距离。 对于摄影测量、激光雷达和声纳测量等基于传感器的测量,通常已知所需使用的间距。 间距使用要素数据集坐标系的水平单位。

Double
最大概貌大小
(可选)

Terrain 概貌类似于缩略图概念。 它是 terrain 数据集的最粗略表示,其最大大小表示为创建概貌而进行采样的测量点的数量上限。

Long
配置关键字
(可选)

用于优化企业级数据库中 terrain 存储的配置关键字。

String
金字塔类型
(可选)

指定将用于构建地形金字塔的点细化方法。

  • 窗口大小将使用窗口大小方法参数值,为每个金字塔等级选择由给定窗口大小定义的区域中的数据点。 这是默认设置。
  • Z 容差将指定每个金字塔等级相对于数据点全分辨率的垂直精度。
String
窗口大小方法
(可选)

指定如何在由窗口大小定义的区域中选择点。 仅当在金字塔类型参数中指定窗口大小时,此参数才适用。

  • Z 最小值将选择具有最小高程值的点。 这是默认设置。
  • Z 最大值将选择具有最大高程值的点。
  • 最接近平均值的 Z 值将选择具有最接近所有高程值的平均值的点。
  • 最小和最大 Z 值将选择具有最小和最大高程值的点。
String
二次细化方法
(可选)

当使用窗口大小金字塔时,指定要执行的外加细化来减少在平坦区域上所用的点数。 如果某个区域内点的高度均在二次细化阈值参数值内,则可将该区域视为平坦区域。 它的效果在更高分辨率的金字塔等级上更为明显,因为与较大的区域相比,较小的区域更可能是平坦的。

  • 将不执行任何二次细化。 这是默认设置。
  • 轻度将执行轻度抽稀,以保留线性不连续的地形(如建筑面和森林边界)。 建议对包括地面点和非地面点的激光雷达数据使用该方法。 其将抽稀最少的点。
  • 中等将执行中度抽稀,以在性能和精度之间实现平衡。 该方法不像轻度抽稀方法那样保留很多细节,尽管消除更多点,但整体上这两种方法相差无几。
  • 高度将执行高度抽稀,以移除大多数点,不大可能保留轮廓清晰的要素。 该方法仅限于使用在坡度逐渐更改的表面。 例如,高度抽稀对裸地激光雷达或深海探测数据具有效果。
String
二次细化阈值
(可选)

金字塔类型参数设置为窗口大小后,用于激活二次细化的垂直阈值。 将该值设置为等于或大于数据的垂直精度。

Double
三角测量方法
(可选)

指定是否要通过增密隔断线要素的线段使其符合用于构建 TIN 表面的 Delaunay 三角测量规则,从而将其合并到 terrain 表面中。

Delaunay 三角测量将增密隔断线要素以容纳其周围的点,从而避免创建细长三角形。在分析基于 TIN 的表面时,这些三角形通常会产生不良结果。 此外,只能对符合 Delaunay 准则的三角测量执行自然邻域插值和泰森多边形生成。

受约束的 Delaunay 三角测量将避免增密隔断线要素,而是将隔断线段作为边合并到 TIN 表面中。 当您需要明确定义以确保不会被三角仪修改(即,分割为多条边)的某些边时,请考虑使用此选项。

  • Delaunay将增密隔断线以构建容纳其周围点的 Delaunay 三角形。 这是默认设置。
  • 约束型 Delaunay隔断线不会被增密。
String

派生输出

标注说明数据类型
输出 Terrain

新 terrain 数据集。

Terrain

arcpy.ddd.CreateTerrain(in_feature_dataset, out_terrain_name, average_point_spacing, {max_overview_size}, {config_keyword}, {pyramid_type}, {windowsize_method}, {secondary_thinning_method}, {secondary_thinning_threshold}, {triangulation_method})
名称说明数据类型
in_feature_dataset

将包含 terrain 数据集的要素数据集。

Feature Dataset
out_terrain_name

Terrain 数据集的名称。

String
average_point_spacing

对 terrain 建模时所用数据点之间的平均水平距离。 对于摄影测量、激光雷达和声纳测量等基于传感器的测量,通常已知所需使用的间距。 间距使用要素数据集坐标系的水平单位。

Double
max_overview_size
(可选)

Terrain 概貌类似于缩略图概念。 它是 terrain 数据集的最粗略表示,其最大大小表示为创建概貌而进行采样的测量点的数量上限。

Long
config_keyword
(可选)

用于优化企业级数据库中 terrain 存储的配置关键字。

String
pyramid_type
(可选)

指定将用于构建地形金字塔的点细化方法。

  • WINDOWSIZE将使用 windowsize_method 参数值,为每个金字塔等级选择由给定窗口大小定义的区域中的数据点。 这是默认设置。
  • ZTOLERANCE将指定每个金字塔等级相对于数据点全分辨率的垂直精度。
String
windowsize_method
(可选)

指定如何在由窗口大小定义的区域中选择点。 仅当在 pyramid_type 参数中指定 WINDOWSIZE 时,此参数才适用。

  • ZMIN将选择具有最小高程值的点。 这是默认设置。
  • ZMAX将选择具有最大高程值的点。
  • ZMEAN将选择具有最接近所有高程值的平均值的点。
  • ZMINMAX将选择具有最小和最大高程值的点。
String
secondary_thinning_method
(可选)

当使用窗口大小金字塔时,指定要执行的外加细化来减少在平坦区域上所用的点数。 如果某个区域内点的高度均在 secondary_thinning_threshold 参数值内,则可将该区域视为平坦区域。 它的效果在更高分辨率的金字塔等级上更为明显,因为与较大的区域相比,较小的区域更可能是平坦的。

  • NONE将不执行任何二次细化。 这是默认设置。
  • MILD将执行轻度抽稀,以保留线性不连续的地形(如建筑面和森林边界)。 建议对包括地面点和非地面点的激光雷达数据使用该方法。 其将抽稀最少的点。
  • MODERATE将执行中度抽稀,以在性能和精度之间实现平衡。 该方法不像轻度抽稀方法那样保留很多细节,尽管消除更多点,但整体上这两种方法相差无几。
  • STRONG将执行高度抽稀,以移除大多数点,不大可能保留轮廓清晰的要素。 该方法仅限于使用在坡度逐渐更改的表面。 例如,高度抽稀对裸地激光雷达或深海探测数据具有效果。
String
secondary_thinning_threshold
(可选)

pyramid_type 设置为 WINDOWSIZE 后,用于激活二次细化的垂直阈值。 将该值设置为等于或大于数据的垂直精度。

Double
triangulation_method
(可选)

指定是否要通过增密隔断线要素的线段使其符合用于构建 TIN 表面的 Delaunay 三角测量规则,从而将其合并到 terrain 表面中。

Delaunay 三角测量将增密隔断线要素以容纳其周围的点,从而避免创建细长三角形。在分析基于 TIN 的表面时,这些三角形通常会产生不良结果。 此外,只能对符合 Delaunay 准则的三角测量执行自然邻域插值和泰森多边形生成。

受约束的 Delaunay 三角测量将避免增密隔断线要素,而是将隔断线段作为边合并到 TIN 表面中。 当您需要明确定义以确保不会被三角仪修改(即,分割为多条边)的某些边时,请考虑使用此选项。

  • DELAUNAY将增密隔断线以构建容纳其周围点的 Delaunay 三角形。 这是默认设置。
  • CONSTRAINED_DELAUNAY隔断线不会被增密。
String

派生输出

名称说明数据类型
derived_out_terrain

新 terrain 数据集。

Terrain

代码示例

CreateTerrain 示例 1(Python 窗口)

下面的示例演示了如何在 Python 窗口中使用此工具。

arcpy.env.workspace = 'C:/data'
arcpy.ddd.CreateTerrain('source.gdb/Redlands', 'Redlands_terrain',  5,
                      50000, '', 'WINDOWSIZE', 'ZMIN', 'NONE', 1)
CreateTerrain 示例 2(独立脚本)

下面的示例演示了如何在独立 Python 脚本中使用此工具。

"""****************************************************************************
Name: Create Terrain from TIN
Description: This script demonstrates how to create a terrain dataset using
             features extracted from a TIN. It is particularly useful in
             situations where the source data used in the TIN is not available,
             and the amount of data stored in the TIN proves to be too large
             for the TIN. The terrain's scalability will allow improved
             display performance and faster analysis. The script is designed
             to work as a script tool with 5 input arguments.
****************************************************************************"""
# Import system modules
import arcpy

# Set local variables
tin = arcpy.GetParameterAsText(0) # TIN used to create terrain
gdbLocation = arcpy.GetParameterAsText(1) # Folder that will store terran GDB
gdbName = arcpy.GetParameterAsText(2) # Name of terrain GDB
fdName = arcpy.GetParameterAsText(3) # Name of feature dataset
terrainName = arcpy.GetParameterAsText(4) # Name of terrain

try:
    # Create the file gdb that will store the feature dataset
    arcpy.management.CreateFileGDB(gdbLocation, gdbName)
    gdb = '{0}/{1}'.format(gdbLocation, gdbName)
    # Obtain spatial reference from TIN
    SR = arcpy.Describe(tin).spatialReference
    # Create the feature dataset that will store the terrain
    arcpy.management.CreateFeatureDataset(gdb, fdName, SR)
    fd = '{0}/{1}'.format(gdb, fdName)
    # Export TIN elements to feature classes for terrain
    arcpy.AddMessage("Exporting TIN footprint to define terrain boundary...")
    boundary = "{0}/boundary".format(fd)
    # Execute TinDomain
    arcpy.ddd.TinDomain(tin, tinDomain, 'POLYGON')
    arcpy.AddMessage("Exporting TIN breaklines...")
    breaklines = "{0}/breaklines".format(fd)
    # Execute TinLine
    arcpy.ddd.TinLine(tin, breaklines, "Code")
    arcpy.AddMessage("Exporting TIN nodes...")
    masspoints = "{0}/masspoints".format(fd)
    # Execute TinNode
    arcpy.ddd.TinNode(sourceTIN, TIN_nodes)
    arcpy.AddMessage("Creating terrain dataset...")
    terrain = "terrain_from_tin"
    # Execute CreateTerrain
    arcpy.ddd.CreateTerrain(fd, terrainName, 10, 50000, "",
                            "WINDOWSIZE", "ZMEAN", "NONE", 1)
    arcpy.AddMessage("Adding terrain pyramid levels...")
    terrain = "{0}/{1}".format(fd, terrainName)
    pyramids = ["20 5000", "25 10000", "35 25000", "50 50000"]
    # Execute AddTerrainPyramidLevel
    arcpy.ddd.AddTerrainPyramidLevel(terrain, "", pyramids)
    arcpy.AddMessage("Adding features to terrain...")
    inFeatures = "{0} Shape softclip 1 0 10 true false boundary_embed <None> "\
             "false; {1} Shape masspoints 1 0 50 true false points_embed "\
             "<None> false; {2} Shape softline 1 0 25 false false lines_embed "\
             "<None> false".format(boundary, masspoints, breaklines)
    # Execute AddFeatureClassToTerrain
    arcpy.ddd.AddFeatureClassToTerrain(terrain, inFeatures)
    arcpy.AddMessage("Building terrain...")
    # Execute BuildTerrain
    arcpy.ddd.BuildTerrain(terrain, "NO_UPDATE_EXTENT")
    arcpy.GetMessages()

except arcpy.ExecuteError:
    print(arcpy.GetMessages())
except Exception as err:
    print(err)

相关主题