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()的方法,比较简单,只是为了演示。
1
private 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, true, null, "");
12
Map2D.selection.FromRecordset(objRd2d);
13
Map2D.Refresh();
14
}
15
else
16
{
17
MessageBox.Show("Selection Count=0 ");
18
}
19
}
20
}
21
private 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, true, null, ""); 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
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, True, Nothing, "") '通过SmID将3D和2D联系起来
Map2D.Selection.FromRecordset objRd2d '2D高亮显示
Map2D.Refresh
Else
MsgBox "Selection Count=0 "
End If
End If
End Sub
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, True, Nothing, "") '通过SmID将3D和2D联系起来
Map2D.Selection.FromRecordset objRd2d '2D高亮显示
Map2D.Refresh
Else
MsgBox "Selection Count=0 "
End If
End If
End Sub
效果图


浙公网安备 33010602011771号