欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏SuperMap应用与开发SO开发 → 正文
城市三维
07-11-01 09:58:19 作者: 出处:超图

功能简介:

    本程序实现带坐标的DGN数据的转入,线数据转入面数据,及其三维贴图的实现,同时贴图的图片可由用户改变

数据来源:当前目录下的dgn\datasource1.sdb和datasource1.sdd文件

    所用SuperMap Objects 组件、对象的主要属性和方法:

控  件 及 对  象 属  性 方  法
SuperWorkspace DataSources  OpenDatasource
SuperMap Layers  AddDataset
Super3D  ActiveDataset,AltitudeField  
SuperWksManager    Connect

功能实现:

 

    本程序把带坐标的DGN图层转入进SuperMap后,坐标还保留,当把线数据集转成面数据集后,Z坐标保留,为了以后面数据集
生成3D提供高程字段,同时用户可以创建字段,如本示范中创建了TEXTURE字段,以作三维贴图之用。

线数据集转成面数据集

转入后保留Z坐标的面数据集

  • DGN数据的转入
Private Sub btnOK_Click() 'DGN数据集的转入
Dim DS As soDataSource
Dim objDataPump As soDataPump '数据泵对象
Dim result As Boolean

sDsName = Form3.Combo1.Text
Set DS = Form1.Workspace.Datasources(1)
If DS Is Nothing Then
    MsgBox ("错误,数据源为空")
    Exit Sub
End If
Set objDataPump = DS.DataPump
If objDataPump Is Nothing Then
    MsgBox "数据泵为空!"
    Exit Sub
End If
With objDataPump
   .FileName = Form3.Text1.Text
   .FileType = scfDGN
   .ShowProgress = True
   .Compressed = False
   .ImportAsCADDataset = False
   .DatasetPoint = IIf(Form3.Check1.Value = vbChecked, Form3.Text2.Text, "")'//是否转入点图层
   .DatasetLine = IIf(Form3.Check2.Value = vbChecked, Form3.Text3.Text, "")'//是否转入线图层
   .DatasetRegion = IIf(Form3.Check3.Value = vbChecked, Form3.Text4.Text, "")'//是否转入面图层
   .DatasetText = IIf(Form3.Check4.Value = vbChecked, Form3.Text5.Text, "")'//是否转入文本图层
   
   Form1.Workspace.DgnColorMappingTable = Form4.Combo4.Text'颜色对照表
   Form1.Workspace.StyleMappingTable = Form4.Combo3.Text'对照表
    '取得Dgn单位
    Select Case Form4.Combo1.ListIndex
          Case 0
                objDataPump.DgnUnits = scdMain    'DGN主单位
          Case 1
                objDataPump.DgnUnits = scdSub     'DGN从单位
          Case 2
                objDataPump.DgnUnits = scdUOR     '最小分辨率
    End Select
    '取得缺省单位
    Dim defaultunits As String
    Call SetUnit(Form4.Combo2.Text, defaultunits)'调用设定单位函数
    objDataPump.defaultunits = Val(defaultunits)
End With

result = objDataPump.Import
If Not (result) Then
    MsgBox "文件转入失败!", vbInformation
    Set objDataPump = Nothing
    Exit Sub
End If

Form1.WkspManager.Refresh'更新wksaManger控件
Set DS = Nothing
Set objDataPump = Nothing
Me.Hide
End Sub
  • 线数据集转成面数据集
转换成面数据集后,同时保留线数据集中的Z坐标。

生成三维渲染

三维渲染效果图

Private Sub Command1_Click() '线数据集转成面数据集
    Dim objgeoline As soGeoLine'定义线对象变量
    Dim objgeoregion As soGeoRegion'定义面对象变量
    Dim objds As soDataSource'定义数据源变量
    Dim objDtVector As soDatasetVector'定义矢量数据集变量
    Dim objSourceRecordSet As soRecordset'定义源记录集变量
    Dim objDestRecordSet As soRecordset'定义目标记录集变量
    Dim rcbounds As soRect'定义一下bounds变量
    Dim FieldInfo As New soFieldInfo'定义一个新的字段信息变量
    Dim i As Integer

  If Form2.Text3.Text <> "" Then
     If Form1.Workspace.Datasources(1).Datasets(Form2.Text2.Text).Type <> scdLine Then
       MsgBox "请选择一个线数据集"
       Exit Sub
     Else
        '//取得源数据源的bounds
        Set objds = Form1.Workspace.Datasources.Item(Text1.Text)
        If objds Is Nothing Then                  '打开源数据源失败
              MsgBox " 打开源数据源失败"
              Exit Sub
        Else
          Set rcbounds = objds.Datasets(Text2.Text).Bounds
        End If
        '判断新数据集名称的合法性,并创建数据集
        Set objds = Form1.Workspace.Datasources(1)  '//取得目标数据源
        If objds Is Nothing Then
              MsgBox "目标数据源为空"
              Exit Sub
        ElseIf objds.IsAvailableDatasetName(Text3.Text) = False Then
              MsgBox "数据集名称非法"
              Text3.SetFocus
              Exit Sub
        Else
             Set objDtVector = objds.CreateDataset(Text3.Text, scdRegion, scoDefault, rcbounds)
        End If
        If objDtVector Is Nothing Then
             MsgBox "数据集为空"
             Exit Sub
        Else
             objDtVector.Open
             Set objDestRecordSet = objDtVector.Query("", True) '取得目标记录集
             If objDestRecordSet Is Nothing Then
                  MsgBox "目标数据集为空"
                  Exit Sub
             End If
        End If
    '取得源记录集(objSourceRecordSet)
         If objds Is Nothing Then                  '打开源数据源失败
               MsgBox "打开源数据源失败"
               Exit Sub
         Else
               Set objDtVector = objds.Datasets.Item(Text2.Text)
               If objDtVector Is Nothing Then      '打开源数据集失败
                     MsgBox "打开源数据集失败"
                     Exit Sub
               Else
                     objDtVector.Open
                     Set objSourceRecordSet = objDtVector.Query("", True)
                     If objSourceRecordSet Is Nothing Then           '查询失败
                           MsgBox "查询失败"
                           Exit Sub
                     End If
               End If
         End If         
      '把源数据集中的Z字段中的值添加到目标数据集中
        Dim objFieldInfo  As soFieldInfo
        Dim fdcount As Integer
        Dim j As Integer
        For j = 1 To objSourceRecordSet.FieldCount        '判断线数据集中是否有Z坐标字段
              Set objFieldInfo = objSourceRecordSet.GetFieldInfo(j)
              If objFieldInfo.Name = "Z" Then zflag = True
        Next j
        If zflag = True Then
            Set objDtVector = Form1.Workspace.Datasources(1).Datasets(Form2.Text3.Text)
            Set fieldname = objSourceRecordSet.GetFieldInfo("Z")
            objDtVector.ClearRecordsets

            If objDtVector.CreateField(fieldname) Then
               Set objDestRecordSet = objDtVector.Query("", True)
               fdcount = objDestRecordSet.FieldCount
            End If
        End If
    End If
End If
'//////////////////////////
'开始转换,把线数据集中的"Z坐标"也转到面数据集中
         objSourceRecordSet.MoveFirst
         objDestRecordSet.MoveFirst
               For i = 1 To objSourceRecordSet.RecordCount
                     Set objgeoline = objSourceRecordSet.GetGeometry()
                     If Not (objgeoline Is Nothing) Then
                           Set objgeoregion = objgeoline.ConvertToRegion()
                           If Not (objgeoregion Is Nothing) Then
                                objDestRecordSet.AddNew objgeoregion  '如果转换成功,则往目标数据集中添加一个
新的面对象
                                objDestRecordSet.Edit
                                objDestRecordSet.SetFieldValue fdcount, objSourceRecordSet.GetFieldValue("Z")
                                objDestRecordSet.Update
                                objSourceRecordSet.MoveNext                               
                           End If
               Next i      

      Form1.WkspManager.Refresh
   '清空释放变量  
      Set objds = Nothing
      Set objDtVector = Nothing
      Set objgeoline = Nothing
      Set objgeoregion = Nothing
      Set objSourceRecordSet = Nothing
      Set objDestRecordSet = Nothing
      Unload Me
End Sub
  • 三维贴图的实现
如要实现贴图的效果,用户必须创建TEXTURE字段,把所贴的图加入到数据库本字段中。
Private Sub Command1_Click()
      Dim objlayer As soLayer
      Dim dMultiple As Double
      
      If Trim$(cmbLayerName.Text) = "" Then
            MsgBox "图层名为空!"
            Exit Sub
      End If
      Set objlayer = Form1.map.Layers(1)
      If objlayer Is Nothing Then
            MsgBox "程序内部错误!", vbInformation
            Exit Sub
      End If
      Form7.Super3D.ActiveDataset = objlayer.Dataset '设定要建立三维的数据集
      Form7.Super3D.Visible = True
       If objlayer.Dataset.Type = scdRegion Then
            Form7.Super3D.AltitudeField = cmbFieldZ.Text  '设定高程字段
            If Trim$(txtScaleZ.Text) = "" Then
                  dMultiple = "1.0"
            ElseIf Val(Trim$(txtScaleZ.Text)) = "0.000000" Then
                  dMultiple = "1.0"
            Else
                  dMultiple = CDbl(txtScaleZ.Text)
            End If
            Form7.Super3D.ScaleZ = dMultiple '设定高程缩放比例
      End If
      Unload Me
      Form7.Show
      Set objlayer = Nothing
End Sub

(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  
    AE中将二维和三维场景导出为图片和图片空间数据文件
    三维场景下坡度、坡向图生成
    三维场景下通视分析
    “嫦娥一号”第一幅月面图像局部三维景观图亮相
    VB中利用OpenGL绘制三维地质构造图
    ArcGIS三维之图片输出
    三维地形可视化开源项目TerraVision

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号