SupeMap Objects 5.3二维导航三维测试

有一个需求是希望通过二维的地图导航三维场景的功能,自己简单实现了一下

具体效果如下图

 

 

 

0.实现这个功能,数据是最主要的。
1.在FormLoad时加载三维地图和二维地图,这个就不提了。
2.为了做到实时刷新,并方便的获得点击点的坐标,Super3D控件所提供的事件中,估计只有MouseDown事件是最合适的。
3.实现原理:
(1)在3D窗口中点击,获得点击处所选择的地物,例子中为一个地块,通过HitTestEx()将点击处的地物加载到super3D控件的选择集中,接着通过ToRecordset()的方法加载到记录集中,接着通过Getmetry()方法得到这个选择的地物。
(2)定义一个矢量数据集,获得二维窗口的一个图层(是所获得三维地物所对应的二维地物所在的图层,例子中为索引为4的图层,即地块图层,这个图层的索引是需要设置的,也可以用图层的名称,这个图层的选择应该是二维数据中地图的底图面数据),接着对这个矢量图层使用Query的方法,例子中为.Query("smid=" + objGeometry3d.ID, true, null, ""),objGeometry3d.ID为三维地物的SmID值,通过查询和三维地物相同SMID的二维地物,将两者连接起来。
(3)获得这个二维地物后 就可以将其显示出来了 例子中使用的是map2d.selection.formrecordset()的方法,比较简单,只是为了演示。

 

 1private void map3D_MouseDownEvent(object sender, AxSuper3DLib._DSuper3DEvents_MouseDownEvent e) 
 2        
 3            if (map3D.Action == Super3DLib.se3DAction.sca3DPointSelect) 
 4            
 5                if (map3D.Selection.Count != 0
 6                
 7                    map3D.HitTestEx(e.x, e.y); 
 8                    SuperMapLib.soRecordset objRd3d = map3D.Selection.ToRecordset(false); 
 9                    SuperMapLib.soGeometry objGeometry3d = objRd3d.GetGeometry(); 
10                    SuperMapLib.soDatasetVector objDtv = (SuperMapLib.soDatasetVector)Map2D.Layers[4].Dataset; 
11                    SuperMapLib.soRecordset objRd2d = objDtv.Query("smid=" + objGeometry3d.ID, truenull""); 
12                    Map2D.selection.FromRecordset(objRd2d); 
13                    Map2D.Refresh(); 
14                }
 
15                else 
16                
17                    MessageBox.Show("Selection Count=0 "); 
18                }
 
19            }
 
20        }

21

 

 

//////////////////////////////2008-7-10更新

 

VB版本
原理同上
主要代码
1.数据加载

Private Sub Form_Load()
    
Dim swopend As Boolean '验证是否打开工作空间
    Dim wsName As String '工作空间名称
    Dim respath As String '3D资源路径
    
    wsName 
= App.Path & "\Data\TD.smw"
    respath 
= App.Path & "\Data\Resources"
    swopend 
= axSW.Open(wsName, "")
    
'打开工作空间
    If swopend = True Then
       Map2D.Connect axSW.ObjectHandle
       Map2D.OpenMap 
"TD"
       Map2D.ViewEntire
       Map2D.Refresh
       Map3D.Connect axSW.ObjectHandle
       Map3D.AddResourceLocation (respath)   
'设置三维场景资源路径
       Map3D.OpenScene ("TD3D")              '显示三维场景
       Map3D.Refresh
    
Else
       
MsgBox "Open workspace failed."
    
End If
End Sub

 

2.鼠标点击

 

Private Sub Map3D_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    
Dim objRd2d As soRecordset '2D记录集
    Dim objRd3d As soRecordset '3D记录集
    Dim objGeometry3d As soGeometry '3D窗口选择的地物
    Dim objdtv As soDatasetVector '2D查询用矢量数据集
    If Map3D.Action = Super3DLib.se3DAction.sca3DPointSelect Then
    
       
If Map3D.Selection.Count <> 0 Then
          Map3D.HitTest X, Y
                    
Set objRd3d = Map3D.Selection.ToRecordset(False)
                    
Set objGeometry3d = objRd3d.GetGeometry()
                    
Set objdtv = Map2D.Layers(4).Dataset '4为数据集ID号,根据数据不同而改变
                    Set objRd2d = objdtv.Query("smid=" & objGeometry3d.ID, TrueNothing""'通过SmID将3D和2D联系起来
                    
                    Map2D.Selection.FromRecordset objRd2d 
'2D高亮显示
                    
                    Map2D.Refresh
                
                
Else
                
                    
MsgBox "Selection Count=0 "
                
End If
            
End If
End Sub

 

效果图

posted on 2008-08-16 11:44  _张超  阅读(817)  评论(0)    收藏  举报

导航