|
功能简介:
配准是GIS软件中处理栅格数据常用的一种操作,SuperMap Objects 为栅格数据集的配准提供了5种配准方法。该范例将详细的介绍如何就每一种配准方法进行栅格数据集的配准。这五种配准方法分别为矩形配准、线性配准、二项式配准、双二项式配准、立方配准,其中只有矩形配准不能通过配准对象soTransformation来实现,需要用soDatasetRaster的Register2来配准,其它的几种配准方式在接口上一样,只是用来配准的采样点的数目不同。
数据来源:\..\Data\City3D目录下的city3d.sdb和city3d.sdd两个文件
所用SuperMap Objects 组件、对象的主要属性和方法:
| 控 件 及 对 象 |
属 性 |
方 法 |
| SuperWorkspace |
|
OpenDatasource |
| SuperMap |
TrackingLayer,Layers |
|
| soDatasetRaster |
Register2 |
|
| soTrackingLayer |
EventCount,Event |
AddEvent,ClearEvents |
| soTransformation |
OriginalControlPoints,TargetControlPoints |
Rectify |
| soRect |
Top,Left,Bottom,Right |
|
功能实现:
|
|
|
栅格数据集自身提供了矩形配准的方法,soTransformation对象中的矩形配准还没有完善。实现的思路为:在目标图层上取两个点,也可不从图层上取点,自定义两个点也可以,根据这两个点构造一个矩形对象,然后调用objDatasetRaster.Register2进行配准。本范例是在SuperMap1的跟踪图层上添加两个点实例,根据这两个点来确定生成的矩形对象。矩形配准不进行重采样,也不生成新的数据集。 |
|
 |
|
|
|
Dim objDtRaster As soDatasetRaster '被配准的栅格数据集
Dim bResult As Boolean '配准结果成功变量
'取得要进行配准的影像数据集
If SuperMap2.Layers.Item(1).Dataset.Vector = True Then
MsgBox "没有栅格图数据集用来配准! ", vbInformation
Exit Sub
Else
Set objDtRaster = SuperMap2.Layers.Item(1).Dataset
End If
Dim objRect As New soRect '配准的矩形对象
'根据点实例生成配准矩形对象
objRect.Left = SuperMap1.TrackingLayer.Event(1).x
objRect.Right = SuperMap1.TrackingLayer.Event(1).y
objRect.Bottom = SuperMap1.TrackingLayer.Event(2).x
objRect.Top = SuperMap1.TrackingLayer.Event(2).y
bResult = objDtRaster.Register2(objRect) '配准栅格数据集
If bResult = False Then
MsgBox "配准失败!", vbInformation
Else
MsgBox "配准成功!", vbInformation
End If |
|
|
|
|
|
其它的几种配准方式在实现方法是一样的,区别在于配准点个数的不同和配准方法的差异。这几种配准方法要求有配准源点集合和目标点集合,本范例程序全部从SuperMap的跟踪图层上的点实例获得。如果跟踪图层上的点个数太多或太少就会出现错误,因此需要加判断语句。为了节约版面,在该说明中就不加错误判断语句了,具体的判断方法参考源程序。这几种方式的配准需要经过重采样,生成一个新的栅格数据集。 |
|
 |
|
|
|
下面以线性配准方法为例介绍其它的配准模式,上面的图就是线性配准的结果图: |
|
Dim MidPoint As New soPoint '中间过渡点对象
Dim objTransformation As New soTransformation '配准对象
Dim i As Integer
'生成配准目标点集合
For i = 1 To LsvTarget.ListItems.Count
MidPoint.x = SuperMap1.TrackingLayer.Event(i).x
MidPoint.y = SuperMap1.TrackingLayer.Event(i).y
objTransformation.TargetControlPoints.Add MidPoint
Next
'生成配准源点集合
For i = 1 To LsvSource.ListItems.Count
MidPoint.x = SuperMap1.TrackingLayer.Event(i).x
MidPoint.y = SuperMap1.TrackingLayer.Event(i).y
objTransformation.OriginalControlPoints.Add MidPoint
Next
Dim objDS As soDataSource '保存结果数据集的数据源对象
Dim objDtRaster As soDatasetRaster '用来配准的栅格数据集
Dim bResult As Boolean '配准成功判断变量
'取得要进行配准的影像数据集,和用来保存配准结果数据集的数据源
If SuperMap2.Layers.Item(1).Dataset.Vector = True Then
MsgBox "没有栅格图数据集用来配准! ", vbInformation
Exit Sub
Else
Set objDtRaster = SuperMap2.Layers.Item(1).DatasetSet
objDS = SuperWorkspace1.DataSources(objDtRaster.DataSourceAlias)
End If
Dim strNewDatasetName As String
'生成保存新数据集的名称
strNewDatasetName = InputBox("请输入新数据集名")
If Not objDS.IsAvailableDatasetName(strNewDatasetName) Then
MsgBox "数据集名非法!", vbInformation
Exit Sub
End If
If Trim(strNewDatasetName) = "" Then Exit Sub
'重采样新型线性配准
bResult = objTransformation.Rectify(objDtRaster, objDS, strNewDatasetName, sctLinear )
If bResult = False Then
MsgBox "配准失败!", vbInformation
Else
MsgBox "配准成功!", vbInformation
End If |
|
|
|
在生成配准点的过程中用到了许多SuperMap库中soTrackingLayer对象的基本方法,如:AddEvent、RemoveEvent、ClearEvents,还用到了soGeoEvent的x、y、MoveTo 等方法。 |
(本文已被浏览 次) | | |