描述
在不改变基本几何形状的情况下,通过移除相对多余的折点来简化线。
插图
使用方法
此工具为不同目的使用不同的简化算法:
- POINT_REMOVE 算法 - 可以识别并移除相对多余的折点来简化数据并以较小的比例显示。 这是此工具中最快的简化算法。 这种算法通常用于数据压缩或粗糙的简化。 随着容差的增大,生成的线中有棱角的部分将显著增加。 此种算法基于道格拉斯-普克算法:Douglas, David and Peucker, Thomas, "Algorithms for the reduction of the number of points required to represent a digitized line or its caricature," The Canadian Cartographer 10(2), 112–122 (1973)。
- BEND_SIMPLIFY 算法 - 可以识别并消除相对不太重要的折弯来简化数据并以较小的比例显示。 相比于 POINT_REMOVE 算法,这种算法生成的结果更接近输入几何,但可能需要更多的处理时间。 这种算法基于 Wang, Zeshen and Müller, Jean-Claude, "Line Generalization Based on Analysis of Shape Characteristics," Cartography and Geographic Information Systems 25(1), 3–15 (1998) 中定义的算法。
- WEIGHTED_AREA 算法 - 可以识别每个折点有效区域的三角形。 随后采用一系列度量对这些三角形进行加权以对比每个面积的平面度、偏度和凸度。 通过加权后的面积指导移除相应折点以简化线,同时尽可能多地保留特性。 这种算法基于 Zhou, Sheng and Jones, Christopher B., "Shape-Aware Line Generalisation with Weighted Effective Area," in Fisher, Peter F. (Ed.), Developments in Spatial Handling: 11th International Symposium on Spatial Handling, 369–80 (2005) 中定义的算法。
- EFFECTIVE_AREA 算法 - 可通过识别每个折点的有效三角形面积来指导移除折点以简化线,同时尽可能多地保留特性。 此算法基于 Visvalingam, M. and Whyatt, J. D., "Line Generalisation by Repeated Elimination of the Smallest Area," Cartographic Information Systems Research Group (CISRG) Discussion Paper 10, The University of Hull (1992) 中定义的算法。
简化容差参数值用于确定简化程度。 容差越大,生成的几何越粗糙。 容差越小,生成的几何越接近输入几何。 MinSimpTol 和 MaxSimpTol 字段都将被添加至输出以存储使用过的容差。
- 对于 POINT_REMOVE 算法,容差是创建的每个折点和新线之间的最大允许垂直距离。
- 对于 BEND_SIMPLIFY 算法,容差是近似于有效折弯的圆的直径。
- 对于 WEIGHTED_AREA 算法,容差面积是由三个相邻折点定义的有效三角形的面积。 三角形越偏离等边三角形,则它的重量越大,被移除的可能性越小。
- 对于 EFFECTIVE_AREA 算法,容差面积是由三个相邻折点定义的有效三角形的面积。
使用保留折叠点参数(Python 中的 collapsed_point_option)来创建一个输出点要素类,以存储小于数据空间容差的所有线的端点。 已派生点输出;将使用与输出要素类参数值(Python 中的 out_feature_class)相同的名称和位置,但带有 _Pnt 后缀。 输出线要素类包含输入要素类中的所有字段。 输出点要素类不包含以下任何字段。
输出线要素类具有正确的拓扑。 输入数据中的任何拓扑错误都会在输出线要素类中标记出来。 输出要素类包括含有相应输入要素 ID 和输入拓扑错误的两个附加字段:InLine_FID 和 SimLnFlag。 SimLnFlag 值为 1 表示存在拓扑错误;值为 0(零)表示不存在错误。
使用输入障碍图层参数来标识不得被简化线越过的要素。 障碍要素可以是点、线或面。
处理大型数据集可能会超出内存限制。 在这类情况下,考虑通过在制图分区环境设置中确定一个相关的面要素类来通过分区处理输入数据。 将按顺序处理分区边界定义的数据部分。 生成的要素类无缝,而且在分区边界一致。 有关详细信息,请参阅使用分区概化大型数据集。
语法
arcpy.cartography.SimplifyLine(in_features, out_feature_class, algorithm, tolerance, {error_resolving_option}, {collapsed_point_option}, {error_checking_option}, {in_barriers})
参数 | 说明 | 数据类型 |
in_features | 要简化的输入线要素。 | Feature Layer |
out_feature_class | 简化后的输出线要素类。 其中包含输入要素类中的所有字段。 输出线要素类具有正确的拓扑。 该工具不会引入拓扑错误,但输入数据中的拓扑错误会在输出线要素类中标记出来。 输出要素类包括含有相应输入要素 ID 和输入拓扑错误或差异的两个附加字段:InLine_FID 和 SimLnFlag。 SimLnFlag 值 1 表示存在输入拓扑错误;值 0(零)表示不存在输入错误。 | Feature Class |
algorithm | 指定线的简化算法。
| String |
tolerance | 容差用于确定简化程度。 可以选择首选单位;否则,将使用输入单位。 MinSimpTol 和 MaxSimpTol 字段将被添加至输出以存储在执行处理时使用过的容差。
| Linear Unit |
error_resolving_option (可选) | Boolean | |
collapsed_point_option (可选) | 指定是否创建输出点要素类以存储小于空间容差的所有线的端点。 已派生点输出;将使用与 out_feature_class 参数相同的名称和位置,但带有 _Pnt 后缀。
| Boolean |
error_checking_option (可选) | Boolean | |
in_barriers [in_barriers,...] (可选) | 包含充当简化中障碍的要素的输入。 生成的简化线不会接触或越过障碍要素。 例如,在简化等值线时,将点高度要素输入作为障碍可确保简化等值线不会越过这些点进行简化。 输出不会违反测量点高度所述的高程。 | Feature Layer |
派生输出
名称 | 说明 | 数据类型 |
out_point_feature_class | 如果使用保留折叠点参数(Python 中的 collapsed_point_option),则将创建一个输出点要素类,用于存储小于数据空间容差的所有线的端点。 | Feature Class |
代码示例
SimplifyLine 示例 1(Python 窗口)
以下 Python 窗口脚本演示了如何在即时模式下使用 SimplifyLine 函数。
import arcpy
import arcpy.cartography as CA
arcpy.env.workspace = "C:/data"
CA.SimplifyLine("roads.shp",
"C:/output/output.gdb/simplified_roads",
"POINT_REMOVE",
20)
SimplifyLine 示例 2(独立脚本)
以下独立脚本演示了如何使用 SimplifyLine 函数。
# Name: SimplifyLine_Example2.py
# Description: Simplify line features from two feature classes, rivers and coastlines,
# while maintaining their connections
# Import system modules
import arcpy
import arcpy.management as DM
import arcpy.cartography as CA
# Set environment settings
arcpy.env.workspace = "C:/data/Portland.gdb/Hydrography"
# Set local variables
inRiverFeatures = "rivers"
inCoastlineFeatures = "coastlines"
mergedFeatures = "C:/data/PortlandOutput.gdb/merged_lines"
simplifiedFeatures = "C:/data/PortlandOutput.gdb/merged_lines_simplified"
tempLayer = "tempLyr"
outRiverFeatureClass = "C:/data/PortlandOutput.gdb/rivers_final"
outCoastlineFeatureClass = "C:/data/PortlandOutput.gdb/coastlines_final"
# Merge rivers and coastlines into one feature class,
# assuming that they have a common f-code field
# with value 40 for rivers and 80 for coastlines.
DM.Merge(inRiverFeatures, inCoastlineFeatures, mergedFeatures)
# Simplify all lines.
CA.SimplifyLine(mergedFeatures,
simplifiedFeatures,
"BEND_SIMPLIFY",
100,
"KEEP_COLLAPSED_POINTS")
# Select rivers and coastlines by their f-code values
# and put them in separate feature classes.
DM.MakeFeatureLayer(simplifiedFeatures, tempLayer, "f-code = 40")
DM.CopyFeatures(tempLayer, outRiverFeatureClass)
DM.MakeFeatureLayer(simplifiedFeatures, tempLayer, "f-code = 80")
DM.CopyFeatures(tempLayer, outCoastlineFeatureClass)
环境
许可信息
- Basic: 否
- Standard: 是
- Advanced: 是