com.supermap.realspace.spatialanalyst

类 GridMatchAnalyst


  • 已过时。

    @Deprecated
    public class GridMatchAnalyst
    extends Object
    地形模型匹配类。用于使 DEM 地形数据与三维模型贴合。
    • 什么是地形模型匹配?

      将 DEM 栅格数据(地形数据)添加到三维场景中,地形就会显现出来。然后将模型叠加到地形上来就可以构建真实的三维场景。但是有时会出现这种问题:由于模型的底部是平整的,整体位于同一高程,而其所处地形却是有起伏的,就会造成模型和地形不能严丝合缝,很容易出现模型的一部分被埋或是漂浮于地形之上,使得三维效果不够理想和真实,如下图所示。

      尽管三维场景的贴地高度模式可以使地形与模型贴合,但是仍不能避免模型部分被掩埋的情形出现。而地形匹配就是用于解决这类问题,它通过将模型所覆盖的地形区域修改为一个平面,从而使模型底部能够与地面贴合。下图是匹配后的地形与模型的叠加显示效果。

    • 如何匹配?

      使用 gridMatch 方法可以进行地形模型匹配处理。该方法通过对地形数据进行修改,包括填挖方和平滑过渡,来实现地形与模型贴合。该方法支持直接处理 CAD 模型数据,也支持面数据(将模型覆盖范围绘制为矢量面),并支持处理多个模型。地形模型匹配的处理的过程为:

      1. 首先,系统按照模型底部的高程值(关于模型底部高程的确定,请参见 gridMath 方法),对其所覆盖的地形区域进行填方或挖方,使该范围地形高程与模型底部高程一致,此时模型覆盖的地形区域成为了一个平面;

      2. 经过上一步后,模型边缘处地形可能出现突然上升或下降,因此需要对模型与地形的接合部分进行平滑过渡。如下图所示,图中蓝色平面示意模型的底部平面,该平面对应的地形区域的周围以 R 为缓冲区半径扩大出一个区域(图中绿色区域),这部分区域就是需要进行平滑过渡的区域。

      假设计算过渡区域中单元格 A 的高程值,单元格 B 为模型底部对应的地形的边界上距离单元格 A 最近的单元格,系统会依据以下公式计算单元格 A 平滑过渡处理后的高程值:

      上面的公式中,HA 为匹配后地形上过渡区域单元格 A 的高程值,hA 为匹配前地形上单元格 A 的高程值,HB 为模型底部高程值,hB 为匹配前地形上单元格 B 处的高程值,r 为 单元格 A 和 B 的平面最短直线距离,r‘ 为单元格 B 到过渡区域边界的平面最短直线距离。

      公式中的幂次 n 是影响过渡区域缓冲效果的关键,该计算公式主要利用了幂函数(X 的 n 次幂函数)在0到1范围内的曲线的特性,一般 n 的取值在(0,3]范围内时过渡效果较为理想。下图为 n 分别取值1/2、2、3时,幂函数在0到1范围内的曲线。

      使用该公式计算地形过渡区域的特点是既能够保持过渡区域的原始地貌特征,又能够进行一定程度的平滑,使模型与周边地形产生自然过渡的效果。下图展示了地形模型匹配前后地形上过渡区域的三维显示效果。

      3. 通过步骤2中的公式计算出过渡区域每个单元格的高程值后,就得到了完成匹配后的地形数据。

    • 方法详细资料

      • gridMatch

        @Deprecated
        public static DatasetGrid gridMatch(DatasetGrid sourceDatasetGrid,
                                                         DatasetVector sourceDatasetVector,
                                                         Datasource targetDatasource,
                                                         String targetDatasetName,
                                                         String altiFieldName,
                                                         double radius,
                                                         double exp)
        已过时。 此方法已废弃,请使用支持进度监听的新方法 GridMatchAnalyst.gridMatch(DatasetGrid ,DatasetVector ,Datasource ,String ,String ,double ,double , SteppedListener... ) 替换。
        地形模型匹配,根据模型的高程对 DEM 地形进行修改(填挖)使之与模型贴合。
        • 模型底部高程如何确定?
        • 该方法支持输入两种模型数据(sourceDatasetVector 参数):CAD 数据集和矢量面数据集。输入 CAD 数据集,该方法将直接处理模型与地形的匹配,输入面数据集时,实际上是将模型底部或者模型所覆盖的区域绘制成了矢量面来进行地形模型匹配。地形模型匹配时,会根据模型底部或面对象的高程对其所覆盖的地形区域进行填方或者挖方,模型底部或面对象的高程通过以下方式获得:

          1. 当输入 CAD 数据集时,模型底部的高程是由模型的包围盒的中心点所对应的地形位置的高程决定,需要将 altiFieldName 参数设置为空字符串(注意不是 null)
          2. 如果输入的是一个矢量面数据集时,可通过 altiFieldName 参数指定一个属性字段作为面对象的高程值,也可以将 altiFieldName 参数设置为空字符串(注意不是null),那么系统会计算该面对象的最小外接矩形(Bounds)的中心位置所对应的地形栅格单元格的高程值作为进行匹配的高程。
        • 模型数据的选择
          1. 由于 CAD 模型的包围盒的底面总是一个矩形,往往与模型实际覆盖范围不一致,包含了一些透明区域,如下图所示,是在三维场景中选中一个 CAD 模型时的状态,很明显,模型的包围盒所覆盖的地形范围比模型实际覆盖范围要大,该方法在进行地形模型匹配时,将会按照模型的包围盒的范围对地形进行修改,因此可能会导致地形处理不理想。因此应尽量选择模型的包围盒与模型实际范围一致的 CAD 模型数据,或者将模型底部区域绘制为矢量面作为输入数据。
          2. 当输入的模型数据中的 CAD 模型或者面对象出现相交时,地形模型匹配的结果可能不正确。所以最好使用没有相交现象的数据作为地形模型匹配的输入数据。
        • 注意:
        • 当直接使用 CAD 模型进行地形模型匹配时,由于根据模型包围盒中心对应的地形高程对地形进行填挖,因此可能出现匹配后的地形与模型不能贴合,这时可通过设置高度模式(GeoStyle3D.setAltitudeMode 方法)和底部高程(GeoStyle3D.setBottomAltitude 方法)等使模型与地面贴合,从而获得更好的显示效果。

        参数:
        sourceDatasetGrid - 指定的与三维模型进行匹配的地形数据,即 DEM 栅格数据。
        sourceDatasetVector - 指定的模型数据。可以是 CAD 数据集或面数据集。
        targetDatasource - 指定的用于存储结果数据集的数据源。
        targetDatasetName - 指定的结果数据集的名称。
        altiFieldName - 指定的模型数据的高程字段。详细说明见备注部分。
        radius - 指定的过渡区域的半径,单位为米。半径的起点为模型对应地形的边缘,对该过渡地带的地形进行平滑过渡处理。有效值范围为大于等于0,设置为0表示不进行平滑过渡处理。
        exp - 指定的幂次。有效值范围为大于等于0。设置为负数会抛出异常。为0使表示不对模型周围的缓冲地带进行平滑过渡。建议范围为(0,3]。
        返回:
        根据模型进行匹配后的 DEM 数据集。
      • gridMatch

        public static DatasetGrid gridMatch(DatasetGrid sourceDatasetGrid,
                                            DatasetVector sourceDatasetVector,
                                            Datasource targetDatasource,
                                            String targetDatasetName,
                                            String altiFieldName,
                                            double radius,
                                            double exp,
                                            SteppedListener... listeners)
        已过时。 
        地形模型匹配,根据模型的高程对 DEM 地形进行修改(填挖)使之与模型贴合。
        • 模型底部高程如何确定?
        • 该方法支持输入两种模型数据(sourceDatasetVector 参数):CAD 数据集和矢量面数据集。输入 CAD 数据集,该方法将直接处理模型与地形的匹配,输入面数据集时,实际上是将模型底部或者模型所覆盖的区域绘制成了矢量面来进行地形模型匹配。地形模型匹配时,会根据模型底部或面对象的高程对其所覆盖的地形区域进行填方或者挖方,模型底部或面对象的高程通过以下方式获得:

          1. 当输入 CAD 数据集时,模型底部的高程是由模型的包围盒的中心点所对应的地形位置的高程决定,需要将 altiFieldName 参数设置为空字符串(注意不是 null)
          2. 如果输入的是一个矢量面数据集时,可通过 altiFieldName 参数指定一个属性字段作为面对象的高程值,也可以将 altiFieldName 参数设置为空字符串(注意不是null),那么系统会计算该面对象的最小外接矩形(Bounds)的中心位置所对应的地形栅格单元格的高程值作为进行匹配的高程。
        • 模型数据的选择
          1. 由于 CAD 模型的包围盒的底面总是一个矩形,往往与模型实际覆盖范围不一致,包含了一些透明区域,如下图所示,是在三维场景中选中一个 CAD 模型时的状态,很明显,模型的包围盒所覆盖的地形范围比模型实际覆盖范围要大,该方法在进行地形模型匹配时,将会按照模型的包围盒的范围对地形进行修改,因此可能会导致地形处理不理想。因此应尽量选择模型的包围盒与模型实际范围一致的 CAD 模型数据,或者将模型底部区域绘制为矢量面作为输入数据。
          2. 当输入的模型数据中的 CAD 模型或者面对象出现相交时,地形模型匹配的结果可能不正确。所以最好使用没有相交现象的数据作为地形模型匹配的输入数据。
        • 注意:
        • 当直接使用 CAD 模型进行地形模型匹配时,由于根据模型包围盒中心对应的地形高程对地形进行填挖,因此可能出现匹配后的地形与模型不能贴合,这时可通过设置高度模式(GeoStyle3D.setAltitudeMode 方法)和底部高程(GeoStyle3D.setBottomAltitude 方法)等使模型与地面贴合,从而获得更好的显示效果。

        参数:
        sourceDatasetGrid - 指定的与三维模型进行匹配的地形数据,即 DEM 栅格数据。
        sourceDatasetVector - 指定的模型数据。可以是 CAD 数据集或面数据集。
        targetDatasource - 指定的用于存储结果数据集的数据源。
        targetDatasetName - 指定的结果数据集的名称。
        altiFieldName - 指定的模型数据的高程字段。详细说明见备注部分。
        radius - 指定的过渡区域的半径,单位为米。半径的起点为模型对应地形的边缘,对该过渡地带的地形进行平滑过渡处理。有效值范围为大于等于0,设置为0表示不进行平滑过渡处理。
        exp - 指定的幂次。有效值范围为大于等于0。设置为负数会抛出异常。为0使表示不对模型周围的缓冲地带进行平滑过渡。建议范围为(0,3]。
        listeners - 用于接收进度条事件的监听器。
        返回:
        根据模型进行匹配后的 DEM 数据集。
      • addSteppedListener

        public static void addSteppedListener(SteppedListener l)
        已过时。 
        添加一个进度条事件(SteppedEvent)的监听器。
        参数:
        l - 一个用于接收进度条事件的监听器。
      • removeSteppedListener

        public static void removeSteppedListener(SteppedListener l)
        已过时。 
        移除一个进度条事件(SteppedEvent)的监听器。
        参数:
        l - 一个用于接收进度条事件的监听器。

Copyright © 2021–2024 SuperMap. All rights reserved.