@Deprecated public class GridMatchAnalyst extends Object
什么是地形模型匹配?
将 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中的公式计算出过渡区域每个单元格的高程值后,就得到了完成匹配后的地形数据。
限定符和类型 | 方法和说明 |
---|---|
static void |
addSteppedListener(SteppedListener l)
已过时。
添加一个进度条事件(
SteppedEvent )的监听器。 |
static DatasetGrid |
gridMatch(DatasetGrid sourceDatasetGrid,
DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
String altiFieldName,
double radius,
double exp)
已过时。
|
static DatasetGrid |
gridMatch(DatasetGrid sourceDatasetGrid,
DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
String altiFieldName,
double radius,
double exp,
SteppedListener... listeners)
已过时。
地形模型匹配,根据模型的高程对 DEM 地形进行修改(填挖)使之与模型贴合。
|
static void |
removeSteppedListener(SteppedListener l)
已过时。
移除一个进度条事件(
SteppedEvent )的监听器。 |
@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... )
替换。该方法支持输入两种模型数据(sourceDatasetVector 参数):CAD 数据集和矢量面数据集。输入 CAD 数据集,该方法将直接处理模型与地形的匹配,输入面数据集时,实际上是将模型底部或者模型所覆盖的区域绘制成了矢量面来进行地形模型匹配。地形模型匹配时,会根据模型底部或面对象的高程对其所覆盖的地形区域进行填方或者挖方,模型底部或面对象的高程通过以下方式获得:
当直接使用 CAD 模型进行地形模型匹配时,由于根据模型包围盒中心对应的地形高程对地形进行填挖,因此可能出现匹配后的地形与模型不能贴合,这时可通过设置高度模式(GeoStyle3D.setAltitudeMode
方法)和底部高程(GeoStyle3D.setBottomAltitude
方法)等使模型与地面贴合,从而获得更好的显示效果。
sourceDatasetGrid
- 指定的与三维模型进行匹配的地形数据,即 DEM 栅格数据。sourceDatasetVector
- 指定的模型数据。可以是 CAD 数据集或面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集的名称。altiFieldName
- 指定的模型数据的高程字段。详细说明见备注部分。radius
- 指定的过渡区域的半径,单位为米。半径的起点为模型对应地形的边缘,对该过渡地带的地形进行平滑过渡处理。有效值范围为大于等于0,设置为0表示不进行平滑过渡处理。exp
- 指定的幂次。有效值范围为大于等于0。设置为负数会抛出异常。为0使表示不对模型周围的缓冲地带进行平滑过渡。建议范围为(0,3]。public static DatasetGrid gridMatch(DatasetGrid sourceDatasetGrid, DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, String altiFieldName, double radius, double exp, SteppedListener... listeners)
该方法支持输入两种模型数据(sourceDatasetVector 参数):CAD 数据集和矢量面数据集。输入 CAD 数据集,该方法将直接处理模型与地形的匹配,输入面数据集时,实际上是将模型底部或者模型所覆盖的区域绘制成了矢量面来进行地形模型匹配。地形模型匹配时,会根据模型底部或面对象的高程对其所覆盖的地形区域进行填方或者挖方,模型底部或面对象的高程通过以下方式获得:
当直接使用 CAD 模型进行地形模型匹配时,由于根据模型包围盒中心对应的地形高程对地形进行填挖,因此可能出现匹配后的地形与模型不能贴合,这时可通过设置高度模式(GeoStyle3D.setAltitudeMode
方法)和底部高程(GeoStyle3D.setBottomAltitude
方法)等使模型与地面贴合,从而获得更好的显示效果。
sourceDatasetGrid
- 指定的与三维模型进行匹配的地形数据,即 DEM 栅格数据。sourceDatasetVector
- 指定的模型数据。可以是 CAD 数据集或面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集的名称。altiFieldName
- 指定的模型数据的高程字段。详细说明见备注部分。radius
- 指定的过渡区域的半径,单位为米。半径的起点为模型对应地形的边缘,对该过渡地带的地形进行平滑过渡处理。有效值范围为大于等于0,设置为0表示不进行平滑过渡处理。exp
- 指定的幂次。有效值范围为大于等于0。设置为负数会抛出异常。为0使表示不对模型周围的缓冲地带进行平滑过渡。建议范围为(0,3]。listeners
- 用于接收进度条事件的监听器。public static void addSteppedListener(SteppedListener l)
SteppedEvent
)的监听器。l
- 一个用于接收进度条事件的监听器。public static void removeSteppedListener(SteppedListener l)
SteppedEvent
)的监听器。l
- 一个用于接收进度条事件的监听器。Copyright © 2021–2024 SuperMap. All rights reserved.