com.supermap.analyst.spatialanalyst
类 CalculationTerrain

java.lang.Object
  继承者 com.supermap.analyst.spatialanalyst.CalculationTerrain

public class CalculationTerrain
extends java.lang.Object

地形计算类。用于计算栅格表面数据(即 DEM 栅格)的坡向、坡度、表面距离、表面面积、表面体积、剖面、填挖方,极值点查找,以及三维晕渲图、三维正射投影影像的生成。


方法摘要
static void addSteppedListener(SteppedListener l)
          添加一个进度条事件(SteppedEvent)的监听器。
static DatasetGrid calculateAspect(DatasetGrid sourceDatasetGrid, Datasource targetDatasource, java.lang.String targetDatasetName)
          计算坡向,并返回坡向栅格数据集,即坡向图。
static DatasetGrid calculateCurvature(DatasetGrid sourceDatasetGrid, double zFactor, Datasource targetDatasource, java.lang.String averageCurvatureName, java.lang.String profileCurvatureName, java.lang.String planCurvatureName)
          计算曲率,并返回平均曲率栅格数据集。
static DatasetGrid calculateHillShade(DatasetGrid sourceDatasetGrid, ShadowMode shadowMode, double azimuth, double altitudeAngle, double zFactor, Datasource targetDatasource, java.lang.String targetDatasetName)
          生成三维晕渲图。
static DatasetImage calculateOrthoImage(DatasetGrid sourceDatasetGrid, ColorDictionary colorDictionary, java.awt.Color noValueColor, Datasource targetDatasource, java.lang.String targetDatasetName)
          根据给定的高程颜色对照表生成正射三维影像。
static DatasetImage calculateOrthoImage(DatasetGrid sourceDatasetGrid, Colors colors, java.awt.Color noValueColor, Datasource targetDatasource, java.lang.String targetDatasetName)
          根据给定的颜色集合生成正射三维影像。
static DatasetImage calculateOrthoImage(DatasetGrid sourceDatasetGrid, Colors colors, java.awt.Color noValueColor, double zFactor, Datasource targetDatasource, java.lang.String targetDatasetName)
          已过时。 使用 calculateOrthoImage 替代。 生成正射三维影像。
static ProfileResult calculateProfile(DatasetGrid sourceDatasetGrid, GeoLine line)
          剖面分析,根据给定线路查看 DEM 栅格沿该线路的剖面,返回剖面线和采样点坐标。
static ProfileResult calculateProfile(DatasetGrid sourceDatasetGrid, GeoLine line, double resampleTolerance)
          已过时。 使用 calculateProfile()替代。 剖面分析,根据给定线路查看 DEM 栅格沿该线路的剖面,返回剖面线和采样点坐标。
static DatasetGrid calculateSlope(DatasetGrid sourceDatasetGrid, SlopeType slopeType, double zFactor, Datasource targetDatasource, java.lang.String targetDatasetName)
          计算坡度,并返回坡度栅格数据集,即坡度图。
static double computePointAspect(DatasetGrid sourceDatasetGrid, Point2D specifiedPoint)
          计算 DEM 栅格上指定点处的坡向。
static double computePointSlope(DatasetGrid sourceDatasetGrid, Point2D specifiedPoint, SlopeType type, double zFactor)
          计算 DEM 栅格上指定点处的坡度。
static double computeSurfaceArea(DatasetGrid sourceDatasetGrid, GeoRegion region)
          计算表面面积,即计算所选多边形区域内的 DEM 栅格拟合的三维曲面的总的表面面积。
static double computeSurfaceDistance(DatasetGrid sourceDatasetGrid, GeoLine line)
          计算栅格表面距离,即计算在 DEM 栅格拟合的三维曲面上沿指定的线段或折线段的曲面距离。
static double computeSurfaceVolume(DatasetGrid sourceDatasetGrid, GeoRegion region, double baseValue)
          计算表面体积,即计算所选多边形区域内的 DEM 栅格拟合的三维曲面与一个基准平面之间的空间上的体积。
static CutFillResult cutFill(DatasetGrid beforeCutFillDataGrid, DatasetGrid afterCutFillDataGrid, Datasource targetDatasource, java.lang.String targetDatasetName)
          栅格填挖方计算,即对填挖方前、后两个栅格数据集对应像元的计算。
static double cutFill(DatasetGrid sourceDatasetGrid, double volume, boolean isFill)
          反算填挖方,即根据给定的填方或挖方的体积计算填挖后的高程。
static double cutFill(DatasetGrid sourceDatasetGrid, double volume, boolean isFill, GeoRegion region)
          反算填挖方,即根据给定的填方或挖方的体积计算填挖后的高程,可指定一个有效计算区域。
static CutFillResult cutFill(DatasetGrid sourceDatasetGrid, GeoLine3D line3D, double bufferRadius, boolean isRoundHead, Datasource targetDatasource, java.lang.String targetDatasetName)
          斜面填挖方计算。
static CutFillResult cutFill(DatasetGrid sourceDatasetGrid, GeoRegion3D region3D, Datasource targetDatasource, java.lang.String targetDatasetName)
          三维面填挖方计算。
static CutFillResult cutFill(DatasetGrid sourceDatasetGrid, GeoRegion region, double baseAltitude)
          选面填挖方计算。
static CutFillResult cutFill(DatasetGrid srcDatasetGrid, GeoRegion region, double baseAltitude, Datasource targetDatasource, java.lang.String targetDatasetName)
          选面填挖方计算。
static ExtremumInfo findExtremum(DatasetGrid sourceDatasetGrid, GeoRegion region, long maxCount)
          查找极值点,即在栅格数据集中查找指定区域范围的极值点,包括栅格单元值最大的点和最小的点。
static GeoRegion flood(DatasetGrid sourceDataset, double height, GeoRegion validRegion)
          根据指定的高程计算 DEM 栅格的淹没区域。
 TerrainAnalystSetting getAnalystSetting()
          返回地形分析的环境设置对象。
static void removeSteppedListener(SteppedListener l)
          移除一个进度条事件(SteppedEvent)的监听器。
 void setAnalystSetting(TerrainAnalystSetting analystSetting)
          设置地形分析的环境设置对象。
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法详细信息

getAnalystSetting

public TerrainAnalystSetting getAnalystSetting()
返回地形分析的环境设置对象。

返回:
地形分析的基本环境设置对象。

setAnalystSetting

public void setAnalystSetting(TerrainAnalystSetting analystSetting)
设置地形分析的环境设置对象。

参数:
analystSetting - 地形分析的环境设置对象。

calculateSlope

public static DatasetGrid calculateSlope(DatasetGrid sourceDatasetGrid,
                                         SlopeType slopeType,
                                         double zFactor,
                                         Datasource targetDatasource,
                                         java.lang.String targetDatasetName)
计算坡度,并返回坡度栅格数据集,即坡度图。

坡度是地表面上某一点的切面和水平面所成的夹角。坡度值越大,表示地势越陡峭。如下图所示,设坡度的角度值为 θ:

其中,H 为垂直距离,L 为水平距离。则有 tanθ = H/L,而坡度百分数 = (H/L) * 100。

但对于 DEM 栅格,通常是以待计算单元格及其周围相邻的八个单元格作为计算单元,由水平方向高程变化率 fx 和垂直方向高程变化率 fy 来计算坡度,即:

其中,fx 和 fy 通过三阶反距离平方权差分法计算得出。对待计算单元格及其相邻的八个单元格进行编码,fx 和 fy 的计算公式如下:

坡度可以用角度、弧度或百分数来表示。以使用角度为例,坡度计算的结果范围为 0~90 度。弧度与角度具有换算关系:弧度 =(角度/180)* Π;这里需要注意坡度百分数的计算公式为:

如果待计算单元格为无值,则计算结果也为无值。需要注意,对于位于 DEM 栅格的边缘的单元格,其 3 × 3 邻域包含了位于数据集范围之外的单元格,对于这些单元格,将使用待计算单元格的高程值来计算,因此,得出的坡度可能比实际要小。对于周围单元格中的无值,也采用相同的方式处理。

新生成的坡度数据集是一个和原数据集等大且分辨率相同的数据集。下图为计算坡度的一个实例。

注意:

计算坡度时,要求待计算的栅格值(即高程)的单位与 x,y 坐标的单位相同。如果不一致,可通过高程缩放系数(方法中对应 zFactor 参数)来调整。

但注意,当高程值单位与坐标单位间的换算无法通过固定值来调节时,则需要通过其他途径对数据进行处理。最常见的情况之一是 DEM 栅格采用地理坐标系时,单位为度,而高程值单位为米,此时建议对 DEM 栅格进行投影转换,将 x,y 坐标转换为平面坐标,否则zFactor值需要进行转换(1米约等于0.00001度)。

参数:
sourceDatasetGrid - 指定的的待计算坡度的 DEM 栅格。
slopeType - 指定的坡度的单位类型。
zFactor - 指定的高程缩放系数。该值是指在 DEM 栅格中,栅格值(Z 坐标,即高程值)相对于 X 和 Y 坐标的单位变换系数。通常有 X,Y,Z 都参加的计算中,需要将高程值乘以一个高程缩放系数,使得三者单位一致。例如,X、Y 方向上的单位是米,而 Z 方向的单位是英尺,由于 1 英尺等于 0.3048 米,则需要指定缩放系数为 0.3048。如果设置为 1.0,表示不缩放(投影坐标系下)。
targetDatasource - 指定的存储结果数据集的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
坡度栅格数据集。
示例:
以下代码示范了如何对给定的 DEM 栅格计算坡度,并返回计算结果(一个栅格数据集)。
 public DatasetGrid gridSlopeCalculate(DatasetGrid sourceDatasetGrid,
                Datasource targetDatasource) {
        //设置结果栅格数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除
        String targetDatasetName = "gridSlope";
        if (targetDatasource.getDatasets().contains(targetDatasetName)) {
                targetDatasource.getDatasets().delete(targetDatasetName);
        }
 
        //调用坡度计算方法,并获取计算结果栅格数据集
        DatasetGrid resultDatasetGrid = CalculationTerrain.calculateSlope(
                        sourceDatasetGrid, SlopeType.DEGREE, 1.0, targetDatasource,
                        targetDatasetName);
 
        return resultDatasetGrid;
 }
 

calculateAspect

public static DatasetGrid calculateAspect(DatasetGrid sourceDatasetGrid,
                                          Datasource targetDatasource,
                                          java.lang.String targetDatasetName)
计算坡向,并返回坡向栅格数据集,即坡向图。

坡向是指坡面的朝向,它表示地形表面某处最陡的下坡方向。坡向反映了斜坡所面对的方向,任意斜坡的倾斜方向可取 0~360 度中的任意方向,所以坡向计算的结果范围为 0~360 度。从正北方向(0 度)开始顺时针计算,如下图所示:

在 DEM 栅格中计算坡向时,是以待计算单元格及其周围相邻的八个单元格作为计算单元,通过水平高程变化率 fx 和垂直高程变化率 fy 计算坡向,即:

其中,fx 和 fy 通过三阶反距离平方权差分法计算得出。对待计算单元格及其相邻的八个单元格进行编码,fx 和 fy 的计算公式如下:

如果待计算单元格为无值,则计算结果也为无值。需要注意,对于位于 DEM 栅格的边缘的单元格,其 3 × 3 邻域包含了位于数据集范围之外的单元格,对于这些单元格,将使用待计算单元格的高程值来计算。对于周围单元格中的无值,也采用相同的方式处理。

注意:水平的坡没有方向,被赋值为 -1。

新生成的坡向数据集是一个和原数据集等大且分辨率相同的数据集。下图为计算坡向的一个实例。

参数:
sourceDatasetGrid - 指定的待计算坡向的 DEM 栅格。
targetDatasource - 指定的存储结果数据集的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
坡向栅格数据集。
示例:
以下代码示范了如何对给定的 DEM 栅格计算坡向,并返回计算结果(一个栅格数据集)。
 public DatasetGrid gridAspectCalculate(DatasetGrid sourceDatasetGrid,
                Datasource targetDatasource) {
        //设置结果栅格数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除
        String targetDatasetName = "gridAspect";
        if (targetDatasource.getDatasets().contains(targetDatasetName)) {
                targetDatasource.getDatasets().delete(targetDatasetName);
        }
 
        //调用坡向计算方法,并获取计算结果栅格数据集
        DatasetGrid resultDatasetGrid = CalculationTerrain.calculateAspect(
                        sourceDatasetGrid, targetDatasource, targetDatasetName);
 
        return resultDatasetGrid;
 }
 

calculateCurvature

public static DatasetGrid calculateCurvature(DatasetGrid sourceDatasetGrid,
                                             double zFactor,
                                             Datasource targetDatasource,
                                             java.lang.String averageCurvatureName,
                                             java.lang.String profileCurvatureName,
                                             java.lang.String planCurvatureName)
计算曲率,并返回平均曲率栅格数据集。

输出结果为地形栅格每个像元的表面曲率,是通过将目标像元与八个相邻像元拟合为二次曲面,再对此拟合曲面求(0,0)位置处的曲率而得。 地形曲率是表达地形曲面结构的主要参数之一。

可供选择的输出曲率类型为:剖面曲率(即沿最大斜率方向的曲率)和平面曲率(即垂直于最大斜率方向的曲率)。

新生成的三种曲率数据集都是和原数据集等大且分辨率相同的数据集。

对于全部三种曲率结果,曲率为正说明像元所处的表面向上凸,曲率为负说明像元所处的表面开口朝上凹入,曲率为 0 说明像元所处的表面是平坦的。

曲面的平均曲率Ca、剖面曲率Cp、平面曲率Cc的计算公式分别为:

其中,fx、fy、fxx、fyy、fxy为 目标像元e4与八个相邻像元拟合成的二阶曲面的各阶偏导数。它们在e4处的取值如下:

注意:

计算曲率时,要求地形栅格值(即高程值)的单位与 x,y 坐标的单位相同。如果不一致,可通过高程缩放系数(方法中对应 zFactor 参数)来调整。

但注意,当高程值单位与坐标单位间的换算无法通过固定值来调节时,则需要通过其他途径对数据进行处理。最常见的情况之一是 DEM 栅格采用地理坐标系时,单位为度,而高程值单位为米,此时建议对 DEM 栅格进行投影转换,将 x,y 坐标转换为平面坐标。

如果待计算单元格为无值,则计算结果也为无值。需要注意,对于位于栅格数据集边缘的单元格, 其3 × 3邻域包含了位于数据集范围之外的单元格,对于这些单元格,将使用待计算单元格的高程值来计算, 因此,得出的曲率可能比实际要小。对于周围单元格中的无值,也采用相同的方式处理。

参数:
sourceDatasetGrid - 指定的待计算曲率的 DEM 栅格。
zFactor - 指定的高程缩放系数。该值是指在 DEM 栅格中,栅格值(Z 坐标,即高程值)相对于 X 和 Y 坐标的单位变换系数。通常有 X,Y,Z 都参加的计算中,需要将高程值乘以一个高程缩放系数,使得三者单位一致。例如,X、Y 方向上的单位是米,而 Z 方向的单位是英尺,由于 1 英尺等于 0.3048 米,则需要指定缩放系数为 0.3048。如果设置为 1.0,表示不缩放(投影坐标系下)。
targetDatasource - 指定的存储结果数据集的数据源。
averageCurvatureName - 指定的平均曲率结果数据集的名称。
profileCurvatureName - 指定的剖面曲率结果数据集的名称。可选参数,如不需要剖面曲率,此参数可设为null。
planCurvatureName - 指定的平面曲率结果数据集的名称。可选参数,如不需要平面曲率,此参数可设为null。
返回:
平均曲率栅格数据集。

computeSurfaceDistance

public static double computeSurfaceDistance(DatasetGrid sourceDatasetGrid,
                                            GeoLine line)
计算栅格表面距离,即计算在 DEM 栅格拟合的三维曲面上沿指定的线段或折线段的曲面距离。

注意:

  1. 表面量算所量算的距离是曲面上的,因而比平面上的值要大。
  2. 当用于量算的线超出了 DEM 栅格的范围时,会先按数据集范围对线对象进行裁剪,按照位于数据集范围内的那部分线来计算表面距离。

参数:
sourceDatasetGrid - 指定的待计算表面距离的 DEM 栅格。
line - 指定的用于计算表面距离的二维线。
返回:
表面距离的值。单位为米。
示例:
请参见 CalculationTerrain.computeSurfaceArea() 方法的示例。

computeSurfaceVolume

public static double computeSurfaceVolume(DatasetGrid sourceDatasetGrid,
                                          GeoRegion region,
                                          double baseValue)
计算表面体积,即计算所选多边形区域内的 DEM 栅格拟合的三维曲面与一个基准平面之间的空间上的体积。

参数:
sourceDatasetGrid - 指定的待计算体积的 DEM 栅格。
region - 指定的用于计算体积的多边形。
baseValue - 指定的基准平面的值。单位与待计算的 DEM 栅格的栅格值单位相同。
返回:
表面体积的值。单位为平方米乘以被计算的 DEM 栅格的栅格值的单位。
示例:
请参见 CalculationTerrain.computeSurfaceArea() 方法的示例。

computeSurfaceArea

public static double computeSurfaceArea(DatasetGrid sourceDatasetGrid,
                                        GeoRegion region)
计算表面面积,即计算所选多边形区域内的 DEM 栅格拟合的三维曲面的总的表面面积。

参数:
sourceDatasetGrid - 指定的待计算表面面积的 DEM 栅格。
region - 指定的用于计算表面面积的多边形。
返回:
表面面积的值。单位为平方米。返回 -1 表示计算失败。
示例:
以下代码示范了如何通过给定的 DEM 栅格,计算栅格表面面积。实现的方式是在跟踪图层上绘制一个多边形,计算该多边形内的栅格表面面积。 使用本示例代码需确保在你的工程中存在名为 “m_mapControl”的地图控件(MapControl),名为“m_datasource ”的数据源,及名为"travel"的 DEM 栅格 ,并确保地图控件与工作空间相关联。注意:符合以上条件不代表能够获得正确结果,你还需要使用合适的数据。
 //计算表面面积按钮单击事件
 public void buttonComputeSurfaceAreaClick() {
        //设置MapControl的绘制方式
        m_mapControl.setTrackMode(TrackMode.TRACK);
 
        //设置MapControl的操作状态
        m_mapControl.setAction(Action.CREATEPOLYGON);
 
        //设置正在绘制的对象的风格
        GeoStyle style = new GeoStyle();
        //style.setFillForeColor(Color.getHSBColor(255, 255, 0));
 
        style.setFillForeColor(Color.YELLOW);
        style.setFillBackOpaque(true);
        style.setFillOpaqueRate(50);
        m_mapControl.setTrackingStyle(style);
 }
 
 //调用computeSurfaceArea()方法计算表面面积
 public void calculateSurfaceArea(DatasetGrid sourceDatasetGrid,
                GeoRegion geoRegion) {
        Double result = CalculationTerrain.computeSurfaceArea(sourceDatasetGrid,
                        geoRegion);
 
        JOptionPane.showMessageDialog(null, "表面积为:" + result.toString());
 }
 
 //跟踪绘制结束事件
 public void tracked(TrackedEvent event) {
        m_mapControl.getMap().getTrackingLayer().clear();
        m_mapControl.getMap().getTrackingLayer().add(event.getGeometry(), "多边形");
 
        //获取跟踪图层上的Geometry
        GeoRegion geoRegion = (GeoRegion) m_mapControl.getMap().getTrackingLayer()
                        .get(0);
 
        //设置源 DEM 栅格
        DatasetGrid sourceDatasetGrid = (DatasetGrid) m_datasource.getDatasets()
                        .get("travel");
 
        calculateSurfaceArea(sourceDatasetGrid, geoRegion);
 
        m_mapControl.getMap().getTrackingLayer().clear();
 }
 

findExtremum

public static ExtremumInfo findExtremum(DatasetGrid sourceDatasetGrid,
                                        GeoRegion region,
                                        long maxCount)
查找极值点,即在栅格数据集中查找指定区域范围的极值点,包括栅格单元值最大的点和最小的点。

通过在指定栅格数据集的查找区域范围,就可以得出该区域范围内的栅格单元值最大点的坐标和栅格值以及最小点的坐标和栅格值。如果不指定范围,即设置 region 参数为 null,则在整个栅格数据集范围内查找。

参数:
sourceDatasetGrid - 指定的待查找极值的栅格数据集。
region - 指定的进行极值查找的区域范围。
maxCount - 指定的期望查找到极值点的最大个数。
返回:
极值信息。

cutFill

public static CutFillResult cutFill(DatasetGrid beforeCutFillDataGrid,
                                    DatasetGrid afterCutFillDataGrid,
                                    Datasource targetDatasource,
                                    java.lang.String targetDatasetName)
栅格填挖方计算,即对填挖方前、后两个栅格数据集对应像元的计算。

地表经常由于沉积和侵蚀等作用引起表面物质的迁移,表现为地表某些区域的表面物质增加,某些区域的表面物质减少。在工程中,通常将表面物质的减少称为“挖方”,而将表面物质的增加称为“填方”。

栅格填挖方计算要求输入两个栅格数据集:填挖方前的栅格数据集和填挖方后的栅格数据集,生成的结果数据集的每个像元值为其两个输入数据集对应像元值的变化值。如果像元值为正,表示该像元处的表面物质减少;如果像元值为负,表示该像元处的表面物质增加。填挖方的计算方法如下图所示:

通过该图可以发现,结果数据集=填挖方前栅格数据集-填挖方后栅格数据集。

对于输入的两个栅格数据集及结果数据集有几点内容需要注意:

1. 要求两个输入的栅格数据集有相同的坐标和投影系统,以保证同一个地点有相同的坐标,如果两个输入的栅格数据集的坐标系统不一致,则很有可能产生错误的结果。

2. 理论上,要求输入的两个栅格数据集的空间范围也是一致的。对于空间范围不一致的两个栅格数据集,只计算其重叠区域的表面填挖方的结果。

3. 在其中一个栅格数据集的像元为空值处,计算结果数据集该像元值也为空值。

参数:
beforeCutFillDataGrid - 指定的填挖方前的栅格数据集。
afterCutFillDataGrid - 指定的填挖方后的栅格数据集。
targetDatasource - 指定的存放结果数据集的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
填挖方结果信息。

cutFill

public static CutFillResult cutFill(DatasetGrid srcDatasetGrid,
                                    GeoRegion region,
                                    double baseAltitude,
                                    Datasource targetDatasource,
                                    java.lang.String targetDatasetName)
选面填挖方计算。

当需要将一个高低起伏的区域夷为平地时,用户可以通过指定高低起伏的区域以及夷为平地的高程,利用该方法进行选面填挖方计算,计算出填方面积,挖方面积、 填方量以及挖方量。

参数:
srcDatasetGrid - 指定的待填挖的栅格数据集。
region - 指定的填挖方区域。
baseAltitude - 指定的填挖方区域的结果高程。单位与待填挖的栅格数据集的栅格值单位相同。
targetDatasource - 指定的存放结果数据集的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
填挖方结果信息。
示例:
以下代码示范了如何进行选面填挖方操作,获取填挖方结果信息。示例中输出填挖方的基本结果信息,并返回结果数据集。
 public DatasetGrid calculateCutFillByRegion(DatasetGrid sourceDatasetGrid,
                GeoRegion geoRegion, Datasource targetDatasource) {
        //设置结果栅格数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除
        String targetDatasetName = "cutFillResult";
        if (targetDatasource.getDatasets().contains(targetDatasetName)) {
                targetDatasource.getDatasets().delete(targetDatasetName);
        }
 
        //设置填挖方区域的高程值
        Double baseAltitude = 100.0;
 
        //调用选面填挖方方法,并获取填挖方结果信息
        CutFillResult cutFillResult = CalculationTerrain.cutFill(sourceDatasetGrid,
                        geoRegion, baseAltitude, targetDatasource, targetDatasetName);
 
        Double cutArea = cutFillResult.getCutArea();
        Double cutVolume = cutFillResult.getCutVolume();
        Double fillArea = cutFillResult.getFillArea();
        Double fillVolume = cutFillResult.getFillVolume();
        Double remainderArea = cutFillResult.getRemainderArea();
 
        DatasetGrid resultDatasetGrid = cutFillResult.getCutFillGridResult();
 
        String result = "挖掘面积:" + cutArea + "\n挖掘体积:" + cutVolume + "\n填充面积:"
                        + fillArea + "\n填充体积:" + fillVolume + "\n未进行填挖方的面积:"
                        + remainderArea;
        JOptionPane.showMessageDialog(null, result);
 
        return resultDatasetGrid;
 }
 

cutFill

public static CutFillResult cutFill(DatasetGrid sourceDatasetGrid,
                                    GeoRegion3D region3D,
                                    Datasource targetDatasource,
                                    java.lang.String targetDatasetName)
三维面填挖方计算。

一个高低起伏的区域,可以根据这个区域填挖方后的三维面,利用三维面填挖方计算出需要填方的面积,挖方的面积、填方量以及挖方量。

参数:
srcDatasetGrid - 指定的待填挖的栅格数据集。
region3D - 指定的三维面对象。
targetDatasource - 指定的存放结果数据集的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
填挖方结果信息。
示例:
以下代码示范了如何进行三维面填挖方操作,获取填挖方结果信息。示例中输出填挖方的基本结果信息,并返回结果数据集。
 public DatasetGrid calculateCutFillByRegion(DatasetGrid sourceDatasetGrid,
                GeoRegion3D geoRegion3D, Datasource targetDatasource) {
        //设置结果栅格数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除
        String targetDatasetName = "cutFillResult";
        if (targetDatasource.getDatasets().contains(targetDatasetName)) {
                targetDatasource.getDatasets().delete(targetDatasetName);
        }
 
        //调用三维面填挖方方法,并获取填挖方结果信息
        CutFillResult cutFillResult = CalculationTerrain.cutFill(sourceDatasetGrid,
                        geoRegion3D, targetDatasource, targetDatasetName);
 
        Double cutArea = cutFillResult.getCutArea();
        Double cutVolume = cutFillResult.getCutVolume();
        Double fillArea = cutFillResult.getFillArea();
        Double fillVolume = cutFillResult.getFillVolume();
        Double remainderArea = cutFillResult.getRemainderArea();
 
        DatasetGrid resultDatasetGrid = cutFillResult.getCutFillGridResult();
 
        String result = "挖掘面积:" + cutArea + "\n挖掘体积:" + cutVolume + "\n填充面积:"
                        + fillArea + "\n填充体积:" + fillVolume + "\n未进行填挖方的面积:"
                        + remainderArea;
        JOptionPane.showMessageDialog(null, result);
 
        return resultDatasetGrid;
 }
 

cutFill

public static CutFillResult cutFill(DatasetGrid sourceDatasetGrid,
                                    GeoLine3D line3D,
                                    double bufferRadius,
                                    boolean isRoundHead,
                                    Datasource targetDatasource,
                                    java.lang.String targetDatasetName)
斜面填挖方计算。

斜面填挖方功能是统计在一个地形表面创建一个斜面所需要的填挖量。其原理与选面填挖方相似。

参数:
sourceDatasetGrid - 指定的待填挖方的栅格数据集。
line3D - 指定的填挖方路线。
bufferRadius - 指定的填挖方线路的缓冲区半径。单位与待填挖的栅格数据集的坐标系单位相同。
isRoundHead - 指定是否使用圆头缓冲为填挖方路线创建缓冲区。
targetDatasource - 指定的存放结果数据集的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
填挖方结果信息。
示例:
以下代码示范了如何进行斜面填挖方操作,获取填挖方结果信息。该方法通过一条三维几何线(GeoLine3D)来确定斜面填挖方的路线。 示例中输出填挖方的基本结果信息,并返回结果数据集。
 public DatasetGrid CutFillBySlope(DatasetGrid sourceDatasetGrid,
                GeoLine3D line3D, Datasource targetDatasource) {
        //设置结果栅格数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除
        String targetDatasetName = "cutFillBySlope";
        if (targetDatasource.getDatasets().contains(targetDatasetName)) {
                targetDatasource.getDatasets().delete(targetDatasetName);
        }
 
        //调用斜面填挖方方法,并获取填挖方结果信息
        CutFillResult cutFillResult = CalculationTerrain.cutFill(sourceDatasetGrid,
                        line3D, 100.0, false, targetDatasource, targetDatasetName);
 
        Double cutArea = cutFillResult.getCutArea();
        Double cutVolume = cutFillResult.getCutVolume();
        Double fillArea = cutFillResult.getFillArea();
        Double fillVolume = cutFillResult.getFillVolume();
        Double remainderArea = cutFillResult.getRemainderArea();
 
        DatasetGrid resultDatasetGrid = cutFillResult.getCutFillGridResult();
 
        String result = "挖掘面积:" + cutArea + "\n挖掘体积:" + cutVolume + "\n填充面积:"
                        + fillArea + "\n填充体积:" + fillVolume + "\n未进行填挖方的面积:"
                        + remainderArea;
        JOptionPane.showMessageDialog(null, result);
 
        return resultDatasetGrid;
 }
 

calculateHillShade

public static DatasetGrid calculateHillShade(DatasetGrid sourceDatasetGrid,
                                             ShadowMode shadowMode,
                                             double azimuth,
                                             double altitudeAngle,
                                             double zFactor,
                                             Datasource targetDatasource,
                                             java.lang.String targetDatasetName)
生成三维晕渲图。

三维晕渲图是指通过模拟实际地表的本影与落影的方式反映地形起伏状况的栅格图。通过采用假想的光源照射地表,结合栅格数据得到的坡度坡向信息, 得到各像元的灰度值,面向光源的斜坡的灰度值较高,背向光源的灰度值较低,即为阴影区,从而形象表现出实际地表的地貌和地势。 由栅格数据计算得出的这种山体阴影图往往具有非常逼真的立体效果,因而称其为三维晕渲图。

三维晕渲图在描述地表三维状况和地形分析中都具有比较重要的价值,当将其他专题信息叠加在三维晕渲图之上时,将会更加提高三维晕渲图的应用价值和直观效果。

在生成三维晕渲图时,需要指定假想光源的位置,该位置由光源的方位角和高度角确定。方位角确定光源的方向,高度角是光源照射时倾斜角度。例如,当光源的方位角为 315 度,高度角为 45 度时,其与地表的相对位置如下图所示。

三维晕渲图有三种类型:渲染阴影效果、渲染效果和阴影效果,通过 ShadowMode 类来指定。

参数:
sourceDatasetGrid - 指定的待生成三维晕渲图的 DEM 栅格。
shadowMode - 指定的三维晕渲图的渲染类型。
azimuth - 指定的光源方位角。用于确定光源的方向,是从光源所在位置的正北方向线起,依顺时针方向到光源与目标方向线的夹角,范围为 0-360 度,以正北方向为 0 度,依顺时针方向递增。

altitudeAngle - 指定的光源高度角。用于确定光源照射的倾斜角度,是光源与目标的方向线与水平面间的夹角,范围为 0-90 度。当光源高度角为 90 度时,光源正射地表。

zFactor - 指定的高程缩放系数。该值是指在 DEM 栅格中,栅格值(Z 坐标,即高程值)相对于 X 和 Y 坐标的单位变换系数。通常有 X,Y,Z 都参加的计算中,需要将高程值乘以一个高程缩放系数,使得三者单位一致。例如,X、Y 方向上的单位是米,而 Z 方向的单位是英尺,由于 1 英尺等于 0.3048 米,则需要指定缩放系数为 0.3048。如果设置为 1.0,表示不缩放(投影坐标系下)。
targetDatasource - 指定的用于存储输出结果的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
生成的三维晕渲图。
示例:
以下代码示范了如何对给定的 DEM 栅格计算三维晕渲图,并返回计算结果(一个栅格数据集)。本示例中使用的渲染方式为渲染和阴影( ShadowMode.IlluminationAndShado)。
 public DatasetGrid hillShadeCalculate(DatasetGrid sourceDatasetGrid,
                Datasource targetDatasource) {
        //设置结果栅格数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除
        String targetDatasetName = "hillShade";
        if (targetDatasource.getDatasets().contains(targetDatasetName)) {
                targetDatasource.getDatasets().delete(targetDatasetName);
        }
 
        //设置光源的方位角和高度角
        double azimuth = 300.0;
        double altitudeAngle = 60.0;
 
        //调用三维晕渲图计算方法,并获取计算结果栅格数据集
        DatasetGrid resultDatasetGrid = CalculationTerrain.calculateHillShade(
                        sourceDatasetGrid, ShadowMode.IllUMINATION_AND_SHADOW, azimuth,
                        altitudeAngle, 1.0, targetDatasource, targetDatasetName);
 
        return resultDatasetGrid;
 }
 

calculateOrthoImage

public static DatasetImage calculateOrthoImage(DatasetGrid sourceDatasetGrid,
                                               Colors colors,
                                               java.awt.Color noValueColor,
                                               double zFactor,
                                               Datasource targetDatasource,
                                               java.lang.String targetDatasetName)
已过时。 使用 calculateOrthoImage 替代。 生成正射三维影像。

根据给定的颜色集合生成正射三维影像。

该方法是通过周边邻近栅格的高程计算每个栅格点的合理日照强度,再结合栅格点的高程所对应的颜色表中的基础颜色,将DEM渲染为正射影像。

参数:
sourceDatasetGrid - 指定的待计算三维正射影像的 DEM 栅格。
colors - 指定的三维投影后的颜色表。
noValueColor - 指定的无值栅格的颜色。
zFactor - 指定的高程缩放系数。该值是指在 DEM 栅格中,栅格值(Z 坐标,即高程值)相对于 X 和 Y 坐标的单位变换系数。通常有 X,Y,Z 都参加的计算中,需要将高程值乘以一个高程缩放系数,使得三者单位一致。例如,X、Y 方向上的单位是米,而 Z 方向的单位是英尺,由于 1 英尺等于 0.3048 米,则需要指定缩放系数为 0.3048。如果设置为 1.0,表示不缩放(投影坐标系下)。
targetDatasource - 指定的用于存储输出结果的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
三维正射影像。
示例:
以下代码示范了如何对给定的 DEM 栅格计算三维正射影像,并返回计算结果(一个影像数据集)。
 public DatasetImage orthoImageCalculate(DatasetGrid sourceDatasetGrid,
                Datasource targetDatasource) {
        //设置结果栅格数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除
        String targetDatasetName = "orthoImage";
        if (targetDatasource.getDatasets().contains(targetDatasetName)) {
                targetDatasource.getDatasets().delete(targetDatasetName);
        }
 
        //创建正射影像的颜色集合
        Colors colors = new Colors();
        colors = Colors.makeGradient(20, ColorGradientType.TERRAIN, true);
 
        //设置无值的颜色
        Color noValueColor=new Color(215,215,215);
 
        //调用三维正射影像计算方法,并获取计算结果影像数据集
        DatasetImage resultDatasetIamge = CalculationTerrain
                        .calculateOrthoImage(sourceDatasetGrid, colors, noValueColor, 1.0,
                                        targetDatasource, targetDatasetName);
 
        return resultDatasetIamge;
 }
 

calculateOrthoImage

public static DatasetImage calculateOrthoImage(DatasetGrid sourceDatasetGrid,
                                               Colors colors,
                                               java.awt.Color noValueColor,
                                               Datasource targetDatasource,
                                               java.lang.String targetDatasetName)
根据给定的颜色集合生成正射三维影像。

该方法是通过周边邻近栅格的高程计算每个栅格点的合理日照强度,再结合栅格点的高程所对应的颜色表中的基础颜色,将DEM渲染为正射影像。

参数:
sourceDatasetGrid - 指定的待计算三维正射影像的 DEM 栅格。
colors - 指定的三维投影后的颜色集合。
noValueColor - 指定的无值栅格的颜色。
targetDatasource - 指定的用于存储输出结果的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
三维正射影像。
示例:
以下代码示范了如何对给定的 DEM 栅格计算三维正射影像,并返回计算结果(一个影像数据集)。
 public DatasetImage orthoImageCalculate(DatasetGrid sourceDatasetGrid,
                Datasource targetDatasource) {
        //设置结果栅格数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除
        String targetDatasetName = "orthoImage";
        if (targetDatasource.getDatasets().contains(targetDatasetName)) {
                targetDatasource.getDatasets().delete(targetDatasetName);
        }
 
        //创建正射影像的颜色集合
        Colors colors = new Colors();
        colors = Colors.makeGradient(20, ColorGradientType.TERRAIN, true);
 
        //设置无值的颜色
        Color noValueColor=new Color(215,215,215);
 
        //调用三维正射影像计算方法,并获取计算结果影像数据集
        DatasetImage resultDatasetIamge = CalculationTerrain
                        .calculateOrthoImage(sourceDatasetGrid, colors, noVauleColor,
                                        targetDatasource, targetDatasetName);
 
        return resultDatasetIamge;
 }
 

calculateOrthoImage

public static DatasetImage calculateOrthoImage(DatasetGrid sourceDatasetGrid,
                                               ColorDictionary colorDictionary,
                                               java.awt.Color noValueColor,
                                               Datasource targetDatasource,
                                               java.lang.String targetDatasetName)
根据给定的高程颜色对照表生成正射三维影像。

有关正射三维影像,请参见另一重载方法 calculateOrthoImage 的介绍。该方法与本方法的区别在于,该方法依照给定的颜色集合(Colors)生成正射三维影像,而本方法允许通过高程颜色对照表(ColorDictionary)指定高程值与颜色的对应关系,能够更加灵活地获得符合预期的正射三维影像。

注意,可以不必在高程颜色对照表中列出待计算栅格的所有栅格值(高程值)及其对应颜色,未在高程颜色对照表中列出的高程值,其在结果影像中的颜色将通过插值得出。

参数:
sourceDatasetGrid - 指定的待计算正射三维影像的 DEM 栅格。
colorDictionary - 指定的高程颜色对照表。
noValueColor - 指定的无值栅格的颜色。
targetDatasource - 指定的用于存储输出结果的数据源。
targetDatasetName - 指定的结果数据集的名称。
返回:
生成的正射三维影像。

calculateProfile

public static ProfileResult calculateProfile(DatasetGrid sourceDatasetGrid,
                                             GeoLine line)
剖面分析,根据给定线路查看 DEM 栅格沿该线路的剖面,返回剖面线和采样点坐标。

给定一条直线或者折线,查看 DEM 栅格沿此线的纵截面,称为剖面分析。剖面分析的结果包含两部分:剖面线和采样点集合。

采样点

剖面分析需要沿给定线路选取一些点,通过这些点所在位置的高程和坐标信息,来展现剖面效果,这些点称为采样点。采样点的选取依照以下规则,可结合下图来了解。

  1. 给定路线途经的每个单元格内只选取一个采样点;
  2. 给定路线的节点都被作为采样点;
  3. 如果路线经过且节点不在该单元格内,则将线路与该单元格两条中心线中交角较大的一条的交点作为采样点。

剖面线和采样点坐标集合

剖面线是剖面分析的结果之一,是一条二维线(GeoLine),它的节点与采样点一一对应,节点的 X 值表示当前采样点到给定线路的起点(也是第一个采样点)的直线距离,Y 值为当前采样点所在位置的高程。而采样点集合给出了所有采样点的位置,使用一个二维集合线对象来存储这些点。剖面线与采样点集合的点是一一对应的,结合剖面线和采样点集合可以知道在某位置的高程以及距离分析的起点的距离。

下图展示了以剖面线的 X 值为横轴,Y 值为纵轴绘制二维坐标系下的剖面线示意图,通过剖面线可以直观的了解沿着给定的线路,地形的高程和地势。

注意:指定的线路必须在 DEM 栅格的数据集范围内,否则可能分析失败。如果采样点位于无值栅格上,则剖面线上对应的点的高程为0。

参数:
sourceDatasetGrid - 指定的待进行剖面分析的 DEM 栅格。
line - 指定的线路,为一条线段或折线。剖面分析给出沿该线路的剖面。
返回:
剖面分析结果。

calculateProfile

@Deprecated
public static ProfileResult calculateProfile(DatasetGrid sourceDatasetGrid,
                                                        GeoLine line,
                                                        double resampleTolerance)
已过时。 使用 calculateProfile()替代。 剖面分析,根据给定线路查看 DEM 栅格沿该线路的剖面,返回剖面线和采样点坐标。

参数:
sourceDatasetGrid - 指定的待进行剖面分析的 DEM 栅格。
line - 指定的线路,为一条线段或折线。剖面分析给出沿该线路的剖面。
resampleTolerance - 指定的重采样容限。预留参数。
返回:
剖面分析结果。

flood

public static GeoRegion flood(DatasetGrid sourceDataset,
                              double height,
                              GeoRegion validRegion)
根据指定的高程计算 DEM 栅格的淹没区域。

淹没区域的计算基于 DEM 栅格数据,根据给定的一个淹没后的水位高程(由参数 height 指定),与 DEM 栅格的值(即高程值)进行比较,凡是高程值低于或等于给定水位的单元格均被划入淹没区域,然后将淹没区域转为矢量面输出,源 DEM 数据并不会被改变。通过淹没区域面对象,很容易统计出被淹没的范围、面积等。

下图是计算水位达到 200 时的淹没区域的一个实例,由原始 DEM 数据和淹没区域的矢量面数据集(紫色区域)叠加而成。

注意:该方法返回的面对象是将所有淹没区域进行合并后的结果。

参数:
sourceDataset - 指定的需要计算淹没区域的 DEM 数据。
height - 指定的淹没后水位的高程值,DEM 数据中小于或等于该值的单元格会划入淹没区域。单位与待分析的 DEM 栅格的栅格值单位相同。
validRegion - 指定的有效计算区域。指定该区域后,只在该区域内计算淹没区域。
返回:
将所有淹没区域合并后的面对象。

cutFill

public static double cutFill(DatasetGrid sourceDatasetGrid,
                             double volume,
                             boolean isFill)
反算填挖方,即根据给定的填方或挖方的体积计算填挖后的高程。

反算填挖方用于解决这样一类实际问题:已知填挖前的栅格数据和该数据范围内要填或挖的体积,来推求填方或挖方后的高程值。例如,某建筑施工地的一片区域需要填方,现得知某地可提供体积为 V 的土方,此时使用反算填挖方就可以计算出将这批土填到施工区域后,施工区域的高程是多少。然后可判断是否达到施工需求,是否需要继续填方。

关于“填方”和“挖方”可参见 cutFill 方法的介绍。

参数:
sourceDatasetGrid - 指定的待填挖的栅格数据。
volume - 指定的填或挖的体积。该值为一个大于0的值,如果设置为小于或等于0会抛出异常。单位为平方米乘以待填挖栅格的栅格值单位。
isFill - 指定是否进行填方计算。如果为 true 表示进行填方计算,false 表示进行挖方计算。
返回:
填挖后的高程值。单位与待填挖栅格的栅格值单位一致。

cutFill

public static double cutFill(DatasetGrid sourceDatasetGrid,
                             double volume,
                             boolean isFill,
                             GeoRegion region)
反算填挖方,即根据给定的填方或挖方的体积计算填挖后的高程,可指定一个有效计算区域。

反算填挖方用于解决这样一类实际问题:已知填挖前的栅格数据和该数据范围内要填或挖的体积,来推求填方或挖方后的高程值。例如,某建筑施工地的一片区域需要填方,现得知某地可提供体积为 V 的土方,此时使用反算填挖方就可以计算出将这批土填到施工区域后,施工区域的高程是多少。然后可判断是否达到施工需求,是否需要继续填方。

关于“填方”和“挖方”可参见 cutFill 方法的介绍。

参数:
sourceDatasetGrid - 指定的待填挖的栅格数据。
volume - 指定的填或挖的体积。该值为一个大于0的值,如果设置为小于或等于0会抛出异常。单位为平方米乘以待填挖栅格的栅格值单位。
isFill - 指定是否进行填方计算。如果为 true 表示进行填方计算,false 表示进行挖方计算。
region - 指定的填挖方区域。如果为 null则填挖计算应用于整个栅格区域。
返回:
填挖后的高程值。单位与待填挖栅格的栅格值单位一致。

cutFill

public static CutFillResult cutFill(DatasetGrid sourceDatasetGrid,
                                    GeoRegion region,
                                    double baseAltitude)
选面填挖方计算。不生成结果栅格数据集。

此方法与另一选面填挖方方法(cutFill)的区别在于,前者不生成结果栅格(即 CutFillResult.getCutFillGridResult 方法返回 null),因此分析时间有所降低。

参数:
sourceDatasetGrid - 指定的待填挖的栅格数据集。
region - 指定的填挖方区域。
baseAltitude - 指定的填挖方区域的结果高程。单位与待填挖的栅格数据集的栅格值单位相同。
返回:
填挖方结果信息。

computePointSlope

public static double computePointSlope(DatasetGrid sourceDatasetGrid,
                                       Point2D specifiedPoint,
                                       SlopeType type,
                                       double zFactor)
计算 DEM 栅格上指定点处的坡度。

DEM 栅格上指定点处的坡度,与坡度图(calculateSlope 方法)的计算方法相同,是将该点所在单元格与其周围的相邻的八个单元格所形成的 3 × 3 平面作为计算单元,通过三阶反距离平方权差分法计算水平高程变化率和垂直高程变化率从而得出坡度。更多介绍,请参阅 calculateSlope 方法。

注意:当指定点所在的单元格为无值时,计算结果为 -1,这与生成坡度图不同;当指定的点位于 DEM 栅格的数据集范围之外时,计算结果为 -1。

参数:
sourceDatasetGrid - 指定的 DEM 栅格。
specifiedPoint - 指定的地理坐标点。
type - 指定的坡度单位类型。可以用角度、弧度或百分数来表示。以使用角度为例,坡度计算的结果范围为 0~90 度。
zFactor - 指定的高程缩放系数。该值是指在 DEM 栅格中,栅格值(Z 坐标,即高程值)相对于 X 和 Y 坐标的单位变换系数。通常有 X,Y,Z 都参加的计算中,需要将高程值乘以一个高程缩放系数,使得三者单位一致。例如,X、Y 方向上的单位是米,而 Z 方向的单位是英尺,由于 1 英尺等于 0.3048 米,则需要指定缩放系数为 0.3048。如果设置为 1.0,表示不缩放(投影坐标系下)。
返回:
指定点处的坡度。单位为 type 参数指定的类型。

computePointAspect

public static double computePointAspect(DatasetGrid sourceDatasetGrid,
                                        Point2D specifiedPoint)
计算 DEM 栅格上指定点处的坡向。

DEM 栅格上指定点处的坡向,与坡向图(calculateAspect 方法)的计算方法相同,是将该点所在单元格与其周围的相邻的八个单元格所形成的 3 × 3 平面作为计算单元,通过三阶反距离平方权差分法计算水平高程变化率和垂直高程变化率从而得出坡向。更多介绍,请参阅 calculateAspect 方法。

注意:当指定点所在的单元格为无值时,计算结果为 -1,这与生成坡向图不同;当指定的点位于 DEM 栅格的数据集范围之外时,计算结果为 -1。

参数:
sourceDatasetGrid - 指定的 DEM 栅格。
specifiedPoint - 指定的地理坐标点。
返回:
指定点处的坡向。单位为度。

addSteppedListener

public static void addSteppedListener(SteppedListener l)
添加一个进度条事件(SteppedEvent)的监听器。

参数:
l - 一个用于接收进度条事件的监听器。

removeSteppedListener

public static void removeSteppedListener(SteppedListener l)
移除一个进度条事件(SteppedEvent)的监听器。

参数:
l - 一个用于接收进度条事件的监听器。