GIS课程设计技术设计书.docx
《GIS课程设计技术设计书.docx》由会员分享,可在线阅读,更多相关《GIS课程设计技术设计书.docx(21页珍藏版)》请在冰豆网上搜索。
![GIS课程设计技术设计书.docx](https://file1.bdocx.com/fileroot1/2023-5/29/389d2eac-9720-4594-aa57-b1348aac1773/389d2eac-9720-4594-aa57-b1348aac17731.gif)
GIS课程设计技术设计书
地球科学与技术学院
《GIS课程设计》作业
——《基于SKETCHUP和ARCENGINE的三维GIS开发》设计文档
教师****************
班级地理信息系统
组员**********************
设计时间2011年8月28至9月21日
基于SKETCHUP和ARCENGINE的三维GIS开发
前言
校园三维GIS系统以虚拟片区为研究区域,建立起了逼真的虚拟表示校园内各类设施的三维可视化平台。
通过基于ArcGis平台建立试验片区二维数据,导入SketchUp中进行三维建模,并通过Gcodatabase数据模型有效地组织和管理包括三维模型数据在内的各种空间数据利用ARCEngine进行系统平台的开发,实现了三维模型数据的可视化,并在可视化的基础上,实现了各类三维空间查询、空间量算及空间分析等功能。
本设计书详细介绍了校园三维GIS系统的总体设计、系统数据库设计以及系统中功能模块的开发。
通过一个实际的开发实例展示了利用SketchUp实现快速场景建模,并利用.NET平台对AicGIS二次开发,完成场景驱动,以实现三维GIS系统的整个流程。
1系统总体设计
校园三维GIS系统旨在提供一个校园三维显示的平台,在该平台上用户可以查看编辑三维建筑物属性、定位兴趣点、量算距离高度以及实现三维空间分析等操作。
系统是采用COM技术在MierosoftVisualStudio.Net开发环境下以ArcEngine提供的SoeneControl作为三维显示平台,TOCControl作为图层导航控件,其他功能通过开发实现,包括模型更新导入功能、属性编辑功能、建筑定位查询功能、三维交互测量功能、三维空间分析功能等。
系统的数据层利用ArcGIS的GeoDatabase数据模型进行三维空间数据的统一管理。
设施
1.1系统开发平台
小区三维GIS系统选择WindowsXP为操作系统,AicGISEngine10为开发平台SketchUP软件为地理要素的的建模平台,采用MierosoftVisualstudio.Net2010为编程开发环境。
ArcGISEngine10由一组核心的AioobjeetS开发包组成,其对象与平台无关,能够在各种编程接口中调用,开发者通过它提供的强大工具构建定制的GIS功能。
所有用ArcGISEngine构建的应用需要ArcGISEngine运行库,它提供了ArcGIS应用的核心功能,这样程序发布时就不要求用户在机器上必须安装ArcGIS,而只安装一个运行库和相应的许可文件,不同级别的功能是由许可文件控制。
通过ArcGISEngine提供的嵌入式的GIS组件,就能向以非Gis为核心的应用程序中嵌入特定GIS功能。
有本试验系统的开发目的与所要实现的功能要求,即侧重于表现小数据量、小范围区域内精细场景的刻画,要求能够支持Tin模型和复杂三维符号的显示等,因此选择采用ArcGISEngine提供的SceneC0ntrol控件进行三维系统的开发。
1.2系统开发框架
系统开发框架的基本思想是利用SketchUP实现校园三维场景建模,利用
ArcGIS平台中ArcGISEngine组件开发包进行二次开发,实现三维场景驱动。
在
校园虚拟三维场景的基础上管理小区内的各类设施,将空间数据、属性数据管理
相结合。
采用基于COM技术的集成开发模式,通过可视化软件开发工具将功能进行集成,形成最终的GIS应用。
图1.1说明了系统的开发框架
图1.1三维GIS试验系统开发框架图
1.3系统功能设计
校园三维GIS系统的主要特点和功能有:
提供友好的操作简单的用户界面,
将地理信息、计算机图像信息以及多媒体信息相结合,增强了通过可视化系统,
能对三维景观进行动态漫游及飞行,从整体上更加直观和综合地对三维景观进行
全方位的浏览,提供距离/面积量算、空间查询、超链接、三维分析等功能。
要求试验系统真实感强、运行效率高。
系统共分为五个功能模块,分别为三维场景浏览模块、信息查询模块、内部实景超链接模块、数据更新模块及空间分析模块。
图1.2为系统功能结构的示意图。
图1.2三维GIS试验系统开发功能图
1.4系统数据库设计
系统采用GcoDatabase数据模型来统一管理空间数据和属性数据。
GeoDatabase是Aic/hifos引入的一种全新的空间数据模型,实际上是建立在DBMS之上的统一的、智能化的空间数据库。
GcoDatabase使用了面向对象的方法,使得要素可以有自己的行为和属性,另外要素类具有继承性、多态性和封装性。
这样,以更加符合自然的行为和人的思维方式去组织数据,更精确的模拟真实世界。
图1.3为地理空间数据模型GcoDatabase组织结构示意图。
图1.3三维GIS试验系统开发数据库设计图
2.SketchUp模型应用于ArcEngine中
虽然户ARCEngine平台支持将其他格式的三维模型作为点、线、多边形三类地图数据的三维标注符号(3DMakerSymbol)显示在三维场景中,这些格式包括邮DsMax创建的*.3ds格式、MultigenCreator建立的*.flt格式以及sketchUp建立的*.5种格式,只要显示时将符号调整到合适位置即可。
但作为符号的话只能视为点状对象进行点缀而已,并不能对其进行GIS分析,与我们用Multipatch存储三维模型数据来做GIS查询分析的初衷相去甚远,故此处不多赘述。
在sketchUp中建好的三维模型需要转换为Multipatch格式才能在户ARCEngine三维场景中直接加载应用以做查询分析。
既可以在户ARCEngine中编码转换,也可以在sketchUp中通过插件转换。
以下详细论述
sketchUpEsri插件转换
本文主要通过sketchUpEs班插件转换生成MultiPatch三维模型,安装好sketchUP6EsRI插件,并将sketchUp6Toofs工具条添加到户JcGIs应用程序界面。
Sketchupesri6具体安装方法:
1安装VS2010,
2安装sketchup6
3.安装sketchupesri6:
第一个组件(GISPlugin)必须放到SketchUpPro6.0程序的安装目录下,例如(D:
\ProgramFiles\Google\GoogleSketchup6\),否则无法在SketchUpPro6.0-Export-3Dmodel-的下拉菜单中没有*.mdb格式。
第二个组件(3DAnalystSketchUp3DSymbolSupport)必须放到ArcGIS程序的安装目录下C:
\ProgramFiles\ArcGis\
安装好SketchUp6ESRI插件后,在ArcMap和ArcScene中会加载一个SketchUp6Tools工具。
此工具的作用是将ArcMap和ArcScene中打开的数据(包括TIN数据、矢量数据、栅格数据)导入到SketchUp中作为底图或者参考图层进行地物或地形的三维建模。
[7]需要说明的是,所有导入到SketchUp的数据均会保留原来与ArcGIS中一致的坐标信息,这样的话将SketchUp的模型或地形导到ArcGIS中时与原来的位置能保持完全一致。
如图1.4所示
同时在SketchUp的Export/3DModels里的ExportType中会多出ESRIMultipatch(*.mdb)项,这样就可以把skp的模型直接导成Multipatch格式。
并且在导出模型的同时可以设置每个multipatch模型的属性信息。
将建好的sketchUp模型通过sketchUp中的Expot-3dModelsl具,把skP
格式的模型直接导成Multipatch格式。
从skecthUp到户ARCGIs数据转换时,每个选中的sketchup对象都以MultiPatch格式输入到已经存在或最新创建的地理数据库中。
在导出模型的同时设置每个MultiPatch模型的属性信息,如建筑物名称、地址、使用者或者建筑物照片。
即可在户JcGIs平台中对模型进行可视化、查询、分析等操作。
图1.5建模图像实例
3系统功能实现
三维Gls辅助校园规划系统利用ArcEngine中的MapContr1、sceneContrI
作为二维、三维功能开发的显示平台,在此基础上编程开发实现工业园规划相应
的功能。
SceneC0ntrDI是嵌入式三维开发组件,负责场景的三维显示以及完成对鼠标操作的响应。
scenecontrol中包含scene,SceneGraph。
scene对象和MaP对象一样负责图层((Layer)的管理,包括图层的添加、移除、显示和隐藏等。
sceneControlI提供助addsxFile方法来导入Scene文档。
sceneContro1通过接口ISceneViewer来进行三维视角及方位的设置,IsceneViewer对象中包含的Camera便是用来完成类似相机镜头的功能,Camera中包含了设定观察者的位置的obs~和选取相机的视角的Target。
3DProp的es用来设置三维要素的一些三维特性,如高度拉伸、图层叠加、光照渲染等功能。
G哪hicsLayer3D则是用来存储场景中的三维符号模型。
以下我们结合工业园规划的实际需要利用这些对象类来创建工业园的三维场景并实现各部分功能。
3.1加载数据
(具体实现代码+贴图)
增加加载数据功能来导入.lyr文件及.SxD文件,主要实现代码如下:
代码:
OPenFileDialogl.Tltle=”AddData,,
OPenFileDialogl.Filter=”LayerFiles(*.lyr){*.lyr}MapDoeuments,,
(*.sxd)1*.sxd,,
OPenFileDialogl.InitialDireetory=”E:
\3Dtest\data\,,
‘直接引用Ar。
scene文档
SeeneViewe汇trll.DocName=“e:
\telnP冶nyseene.sxd”
‘添加一个图层
SeeneViewe尤trl.SceneGraph.Seene.AddLayerPLayer
‘添加一个图形元素
DimPMapAsIBasieMap
SetPMap二SeeneViewerCtrl1.SeeneGraph.Seene
DimPGConAsIGraphiesContainer3D
SetPGCon=PMap.BasieGraphiesLayer
SetPGCon=PGLayer
PGCon.AddElementPElement
Viewer.RedrawFalse
在SeeneControl控件中加入栅格图层
通过SceneControl的一些属性及方法你将增加栅格影像到你的三维系统中。
加载栅格影像到三维GIS系统主要代码如下:
PrivateSubbtl七气ddRasterLayer--Cliek(ByValsenderAsSystem.Objeet,ByValeAs
System.EventArgs)HandlesbtllAddRasterLayer.Cliek
Dilnfile,filePath,fileName,fileExtensionAsStnng
DimlayerAsILayer
DimWSFaetAsIW6rksPaeeFaetory
DlmRasterWOrksPaeeAsIRaster从八〕rksPaee
DimRastefDatasetASIRasterDataset
DimRasterlayerAsIRasterLayer
OPenFileDlalogl,Filter=”RasterFiles(*.tio}*.ti月Allfiles(*.*)}*.*”
If(OPenFileDialogl.ShowDialog()<>DialogResult.OK)ThenExitSub
file=OPenFileDialogl.FileName
WSFact=NewRasterW6rksPaceFaetory
RasterwbrksPace=WSFaet.OPenFromFile(filepath,0)
RasterDataset=Raster从/OrksPaee.OPenRasterDataset(fileName)
Rasterlayer=NewRasterLayer
Rasterlayer.CreateFromDataset(RasterDataset)
layer=Rasterlayer
nl‘seene.AddLayer(layer)
CatchexAsExeePtion
MsgBox(flle+””+ex.Message)
Funetlons.AddLayerTbList(lstLayers,Funetions.GetseeneLayers(m一scene))
EndSub
3.2场景浏览
场景浏览功能只需基于户JcEngine组件而不用做太多的开发,如大柴旦工业
园二维界面的浏览功能(二维地图的平移、放大、缩小)以及scen日ContrDI的三维浏览功能(三维场景的平移、放大、缩小、导航、飞翔等)。
这里不做过多介
绍。
这里主要介绍二维视图三维视图联动功能。
在校园三维场景中,经不经意
的旋转缩放和平移操作往往容易导致方位的迷失,使得迅速定位产生困难。
为了防止在三维漫游或者飞翔时无法准确地定位,我们将工业园的二维底图
作为导航视图加入了MaPcontrl中,使得我们在三维场景中进行实时漫游或者
飞翔时,在二维导航地图中可以实时显示出相应的视点位置,以便对漫游或者飞
翔时的所在位置有个总体的认识。
同时,在二维地图中改变观察位置时,相应地
在三维场景中视点也可以跳到对应的位置。
a放大操作:
通过放大工具在SceneControl中画出矩形框,以屏幕与该矩形框
的长度比或宽度比作为Camera的缩放比率,目标点为该矩形框的中心点,观察者位置不变;
b缩小操作:
通过缩小工具在SceneControl中画出矩形框,以该矩形框与屏幕
的宽度比或长度比作为Camera的缩放比率,目标点为该矩形框的中心点,观察者位置不变;
c全图操作:
以原始Scene的范围作为Camera的视野范围;
d漫游操作:
改变观察者位置的(x、Y、Z)值,改变Camera的视野范围;
e飞行操作:
通过控制鼠标来实现场景的三维飞行速度、方向进行自由浏览。
(具体实现代码+贴图)
3.3属性查询
校园二维界面的以图查属性功能只需基于ArcEngine组件而不用做
太多的开发,这里不做过多介绍。
这里主要介绍大柴旦工业园区三维建筑物的以
图查询属性功能。
为了便于规划设计者全方位地查看三维实体,需要获得地理实体在三维场景中无法直接反映出来的详细属性信息。
由于可供查询的三维地理实体是采用mdb格式存储的,初始存储时只是保存了该地物的类型与唯一ID号,相关的属性数据需要我们自己添加,而且是另外存储在属性表中的。
为了方便与数据库的属性表一一对应,在系统中需要对每一地理实体进行统一编码,以便实现点击查询三维模型时与相关的属性记录对应。
(具体实现代码+贴图)
代码:
MessageBox.Show(“当前点未能查找到任何要素“):
retUrfl;
IDisplay3DpDisplay3D=gyyseeneControl.Seene.SeeneGraphasIDisplay3D:
//显示信息窗体
m_frmldentify.PHit3DSet=PHit3DSet:
m_frmldentify.pDisPlay3D=pDisPlay3D
m_frmldentify.InitFrmldentify():
m_frmldentify.Loeation=System.Windows.Forms.Cursor.Position:
m_frmldentify.Show();
m_rrmxdentiry.Foeus():
//获得焦点
retllrn;
上述代码中,主要是通过LocateMultipte方法获取三维地理实体的Feature
并保存在pHit3DSet中,然后将pHit3DSet中的对象传递给属性显示窗体,获取
三维地理实体的其他属性值,并在该窗体中显示出来。
publievoidInitFrmldentify()
1istBoxLyr.Items.Clear()刀清除图层列表ListBox中的内容
listviewLyrAtribt.Items.Clear():
//清除属性列表Listview中的内容
if(pHit3DSet二二null)
retUrn;
for(inti二0:
i(pHit3DSet.Hits.Count:
xHit3opHit3D二(IHit3D)pHit3DSet.Hits.get一lement(i)
IPointPPoint=PHit3D.Point:
ILayerpLayer=(ILayer)pHit3D.伽ner:
判断是否为要素图层
if(pLayer15IFeatureLayer)
IFeaturepFeature二(IFeature)pHit3D.objeet:
listBoxLyr.Items.Add(pLayer.Name):
//在列表中添加图层名
pDisplay3D.AddFlashFeature(pFeature.
为此,我们新增一个窗体Fnnldenti厅用来弹出相关三维地物的属性信息,
在其中添加一个ListBox控件显示选中的地物,添加一个ListView用来显示详细的地物属性信息。
在SeeneControl的OnMouseDo认叽事件中,添加如下代码:
privatevoidgyyseeneControl一nMouseDown(objeetsender,
ISeeneControlEventsOnMouseDownEvente)
gyyseeneControl.Seene.Clearseleetion();
if(e.button二l从too1Seleeted==9)//左键点击了查询按钮才发生
Frmldentify叱frmldentify=newFrmldentify():
gyyseeneControl.SeeneGraPh.IsNavigating二false:
IHit3osetpHit3DSet;,//获取的Feat盯e保存在pHit3DSet中
gyyseeneControl.SeeneGraph.LoeateMultiple(gyyseeneControl.SeeneGraph.Aetivevie贾er,e.x,e.y,ESRISeenePiekMode.ESRISeenePiekAll,false,outpHit3DSet);
pHit3DSet.onePerLayer():
if(pHit3DSet.Hits,Count二二0)
{i++;//计数i加
else
//不是要素层就从pHit3DSet中删去,因删除后总数减,计数i不加
pHit3DSet.Hits.Remove(i);
pDisPlay3D.FlashFeatures():
}
在Lis旧ox选择了相应的地理实体后,触发115旧oxL几seleeted玩dexChanged()
事件,并在ListView控件中显示该地理实体的详细属性,如图5一8所示。
privatevoidlistBoxLyr_SeleetedlndexChanged(objeetsender,EventArgse)
listviewLyrAtribt.Items.Clear();//消除ListView中的内容
IHit3DpHit3D二(IHit3D)pHit3DSet.Hits.get_Element(listBoxLyr.Seleetedlndex):
IFeaturepFeature=(IFeature)pHit3D.objeet:
刀将选择的图层相应属性添加到ListView中
for(intj二0;j(pFeature.Fields.FieldCount:
j++)
ListViewltem11=newListViewltem():
11.Subltems.Clear():
11.Subltems[0].Text=pFeature.Fields.get_Field(j).N舰e:
11.Subltems.Add(pFeature.get_Value(j).Tostring()):
1istViewLyrAtribt.Items.Add(11):
pDisplay3D.FlashGeometry(PHit3D.伪门er,PHit3D.objeet);
3.3属性编辑
校园规划涉及了大量的属性,方便地管理这些属性数据非常有必要。
属性
编辑功能可以为工业园规划设计及管理人员提供方便的信息更新功能,包括项
目、资源以及设施的修改(或删除)等。
属性编辑的实现主要通过DataGridView控件与数据库作连接,通过数据库设计时建立的属性与模型数据的ID一一对应关系,连接属性数据库后,调用SQL语句更新数据库。
属性编辑的实现主要通过DataGridView控件与数据库作连接,通过数据库
设计时建立的属性与模型数据的ID一一对应关系,连接属性数据库后,调用SQL
语句更新数据库。
(具体实现代码+贴图)
3.4模型交互
有时为了调整规划方案,需要改变建筑的高度、颜色、风格、层数等规划指
标或者替换不同的建筑模型以及其它地理实体,以求建筑物自身及周围环境的协
调,我们需要在三维建模软件中改变建筑的高度、颜色、风格、层数等参数,然
后重新导入到场景中。
(具体实现代码+贴图)
代码:
publievoidAddMultiPatch(IScenepseene,IMultipatehpMultiPatch,StringLayerNa啤,int
eolor)
IGraphies正ayer娜layer=PSeene.BasieGr即hiesLayer:
ILayerEffeetspLayerEffeets二(ILayerEffeets)pGlayer:
PLayerEffeets.TransPareney二9;
IRgbColorpRgbColor二newRgbColorClass():
pRgbColor.邪B二eolor:
IGeometryPGe伽etry=pMultiP水h:
ISimpleLinesymbolpls娜二newSimpleLinesymbol():
Pls犯n.百idth二4:
pls物.Color二(IColor)pRgbColor:
Pls帅.Style二ESRISimpleLinestyle.ES犯SLSSolid:
ISimpleFillsymbolpFsy口二newSimpleFillsymbo1ClasS():
pFsym.Color二(IColor)pRgbColor;
pFsym.Style二ESRISimpleFillstyle.ES刃SFSHoll衅:
pFs帅.outline“Plsym:
IElement因element二newMultiPatehElementClass():
:
IFillshapeElementppolyele配