1:三维GIS发展现状
三维GIS产业方兴未艾,无论是从视觉效果,还是实际应用功能都有了长足的发展。然而人们已经不仅仅满足与绚丽的三维场景,而将飞禽走兽老虎机的注意力将集中在三维GIS所实现的功能上。笔者归纳以下几个方面依然还是业界努力的方向:
(1):三维批量数据的获取
相对于二维GIS而言,三维GIS增加了城市空间对象的第三维信息,导致描述空间对象的几何数据(形状、位置、大小)剧增,如何快速自动的获取城市空间对象的3d几何、影像纹理、语义属性数据等。目前主要的方法集中在摄影测量、激光扫描、移动测绘、多数据源集成等方面。
(2):城市三维可视化模型的建立
早期人们将航空影像和DEM叠加构造地形景观,可进行任意浏览。现在的三维模型利用二维GIS的平面位置及高度信息,另外添加一些信息(如房屋高度、墙面纹理),同时使用规则几何体(如长方体、三棱体等)来表达城市建筑物。但这种方法仅仅是对建筑物进行了表达,没有考虑到地形DEM的因素,因而是不完整的。
(3):三维空间数据模型
上述三维城市模型的构建还没有完全具备GIS系统完备的数据模型,所作的工作主要侧重于三维数据的采集及可视化,较少顾及三维空间实体及空间的相互关系。但是对于各种各样的GIS用户来说,往往需要直接将三维模型作为交互式查询和分析的媒体。即GIS中的三维模型不仅仅可是实现可视化而且还能交互操作。因此,空间分析和交互操作才是三维模型的主要功能,而可视化只是其中不可缺少的组件。三维GIS所采用的数据模型,应该不仅能表达几何信息,而且能直接或间接地描述拓扑关系,在纹理映射方面,应具有操纵栅格影像的能力。总而言之,迄今为止没有一个比较成熟、得到人们公认的数据模型,这严重制约着三维GIS的发展。
二维GIS具有很强的分析功能,例如缓冲分析、路径分析、平面测量、空间索查询、渲染分析等,但它缺乏有效地三维空间表达能力。三维GIS提供了二维GIS所不具备的功能,例如体积测量、三维建模、纹理贴图、模拟飞行、视角判断等。三维GIS在给用户带来可视化分析功能的同时,却失去了二维GIS分析特色。如何实现两者的互动,很多学者进行了相关的研究。本系统是基于.NET2.0框架下利用ArcEngine的二维功能和skyline的三维功能,将二维GIS和三维GIS进行集成并实现联动。从而实现在同一框架体系下使两者优势互补,最大程度地发挥系统功能。
2:开发设计思路:
本系统的设计思路是将在arcgis中存储并展示的二维数据与在TerraExplorer Pro中加载的三维数据,依靠C#语言,以Microsoft Visual Studio为程序开发平台,集成ArcEngine和Skyline TerraExplorer API分别提供的接口和ActiveX控件统一到一个系统中,并且通过编程使得“将屏幕坐标与地理坐标相互联接”的思想得以实现,最终得到二三维联动的效果。设计思路如图1:
图1 二三维联动设计思路图
二维空间数据主要是由Arcmap中得shp文件来组织。在二维GIS开发过程中,利用ArcEngine插件中Mapcontro控件调用shp文件来实现二维GIS功能。
三维空间数据由3DMAX建模最终导入Skyline的方式,地形建模的方法主要是采用在某地区的DEM数据的基础上叠加遥感影像来完成三维地形的显示。对于大区域的建筑群进行三维建模时,需要对不同类型的建筑物进行分别建模,提高效率。对于城市片区内部的建筑以简单纹理的体块表示;沿街的主要建筑需要在体块的基础上添加照片纹理,增强真实感;对于结构复杂或者重要的标志性建筑可使用3DSMAX进行单独建模,赋以精细的结构和纹理。
3:数据准备
3.1:数据获取及处理
3.1.1二维影像数据
二维数据影响采用航空摄影测量的方式获取。通过拍摄规划区域有重叠的航片,选取一定数量的控制点,采用航天远景内业加密软件“APStudio”内定向、外定向,最终实现绝对定向,拼接完成正摄影像图。
3.1.2三维建筑模型纹理数据获取与处理
建筑物的纹理包括侧面和顶面两部分,分别通过近景数码照片提取和影像提取的方式。试验区内拍摄有大量的建筑近景照片,需要在Photoshop中对近景照片进行处理,主要是综合利用裁剪、拼接、自由变换和拉伸等一些基本操作。根据试验可以得出:处理后的照片最好保存为JPG格式,以减少数据量,同时图像的分辨率应调整为2的幂次方,图像的大小也应该尽量小于100KB。而建筑模型的顶面纹理则是从遥感影像中采集的。
3.2:虚拟场景的构建
3.2.1:3dmax建模流程
(1):导入矢量闭合多边形,在CAD图导入3DMAX中作底图,在3DMAX中以导入的多边形为基准再勾画相同的多边形作为地基轮廓。
(2):如果没有矢量文件,在影像上截取建筑物地图,通过测量确定截取图片的长宽比例,按照这个比例在3DMAX中创建一个box,将截取的图片贴在这个box上确定建筑物的长宽比例。
(3):根据截取的影像进行轮廓线的勾画,确定建筑物的结构。
(4):根据高度信息进行挤压(Extrude)建立模型,根据拍摄的建筑物照片制作贴图并依附于建立的三维模型。具体步骤为:在次物体状态下为物体的各个面赋材质:使用EDITPOLY选择物体的面,而后将材质赋予该面,然后在该面仍在选择状态下,加一UVWMAP修改器,调整坐标,而后加一EDITPOLY进行一次塌陷,物体上每一个面如此往复操作。
3.2.2:导入skyline关键步骤
对于海量三维模型导入,Skyline采用的了将模型同点层矢量数据以名称或ID进行关联方式,批量将大量模型一次导入到TerraExplorer Pro中。这种实现方式的关键,是获取到每个.X模型的中心点坐标并记录到相关点对象的属性字段中,同时,以模型唯一名称为关联字段,进行点层数据关联三维模型的导入。
模型工作流程:
(1):模型输出。输出格式为.X文件
(2):.xpl格式模型的获取
(3):根据模型中心点坐标制作shp文件
(4):在TEPro中根据Shp文件批量导入.XPL模型
4:系统功能实现
本系统二维部分在Visual Studio2008.net环境下,用C#与ArcGIS Engine组件实现。三维部分是采用的SkyLine的TerraExplorer Pro提供的部分二次开发接口,定义三维界面,并实现部分功能。它们都提供com组件,添加到工具箱直接加载即可。
ArcGIS Engine提供了ToMapPoint方法可以获得当前鼠标所在位置的地理坐标,通过TerraExplorer Pro的TerraExplorerX.IPlane5接口的MovePosition方法可以将三维窗口的中心点移到该地理坐标,即可实现二维控制三维。同样TerraExplorer Pro同样提供了TerraExplorerX.IPlane5接口的ScreenToWorld方法获得当前鼠标所在位置的地理坐标,而ArcGIS Engine提供的CenterAt的方法,不能对二维窗口比例尺缩放,必须重绘二维窗口的Extent,三维控制二维也完成了,整个系统的核心部分也就实现了。程序运行的主界面如图2所示:
图2 程序运行主界面
互动关键代码如下:
private void MainForm_Load(object sender, EventArgs e)
{
//get the MapControl
m_mapControl = (IMapControl3)axMapControl1.Object;
//disable the Save menu (since there is no document yet)
menuSaveDoc.Enabled = false;
//三维加载
objTerraExplorer = new TerraExplorerClass();
objTerraExplorer.Load(@"K:\***\***.fly");
}
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
int X = 0;
int Y = 0;
IPoint pt = axMapControl1.ToMapPoint(e.x, e.y);
MoveMapTo(pt.X, pt.Y);
//地图刷新
this.axMapControl1.Refresh();
TerraExplorerX.TerraExplorer TE;
TE = new TerraExplorerX.TerraExplorer();
TerraExplorerX.IPlane5 pIPlane;
pIPlane = TE as TerraExplorerX.IPlane5;
//定义各个参数的变量
double dobjH = 20;
double dYaw = 30;
double dPitch = 320;
double dRoll = 0;
double dCameraDeltaYaw = 0;
double dCameraDeltaPitch = 0;
int Flags = 0;
double pX = Convert.ToDouble(pt.X);
double pY = Convert.ToDouble(pt.Y);
////将三维窗口中心点坐标移到二维窗口中心点坐标转换到的地理坐标上
pIPlane.MovePosition(pX, pY, dobjH, dYaw, dPitch, dRoll, dCameraDeltaYaw, dCameraDeltaPitch, Flags);
TerraExplorerX.IRender5 pIRender;
pIRender = TE as TerraExplorerX.IRender5;
TerraExplorerX.IObjectManager51 pIObjectManager;
pIObjectManager = TE as TerraExplorerX.IObjectManager51;
TerraExplorerX.ITENavigationMap5 pITENavigationMap;
pITENavigationMap = TE as TerraExplorerX.ITENavigationMap5;
TerraExplorerX.IInformationTree5 pIInformationTree;
pIInformationTree = TE as TerraExplorerX.IInformationTree5;
object objType = 63;
object objX = 0;
object objY = 0;
object objH = 0;
object objID = "";
////将地理坐标转换为屏幕坐标
pIRender.ScreenToWorld(X, Y, ref objType, out objX, out objH, out objY, out objID);
string strobjx = Convert.ToString(objX);
string strobjy = Convert.ToString(objY);
double dobjx = Convert.ToDouble(objX);
double dobjy = Convert.ToDouble(objY);
//pCenterpoint.X = dobjx;
//pCenterpoint.Y = dobjy;
//三维和二维移动
MoveMapTo(dobjx, dobjy);
//地图刷新
this.axMapControl1.Refresh();
}
private void MoveMapTo(double X, double Y)
{
IPoint pPointt = new PointClass();
pPointt.X = X;
pPointt.Y = Y;
double dblWidth = this.axMapControl1.Extent.Width;
double dblHeight = this.axMapControl1.Extent.Height;
//画一个矩形
IEnvelope IIEnvelope = new ESRI.ArcGIS.Geometry.EnvelopeClass();
IIEnvelope.UpperLeft.X = pPointt.X - dblWidth / 2;
IIEnvelope.UpperLeft.Y = pPointt.Y - dblHeight / 2;
IIEnvelope.LowerRight.X = pPointt.X + dblWidth / 2;
IIEnvelope.LowerRight.Y = pPointt.Y + dblHeight / 2;
//中心点移到矩形中心
axMapControl1.CenterAt(pPointt);
//将矩形作为二维窗口的窗口
axMapControl1.Extent = IIEnvelope;
5:结论
通过此系统的成功运行,验证了二三维联动机制实现的可能性。但这只是Skyline二次开发中实现的其中一个功能,要实现“全功能”三维地理信息系统,“万里长征只走了第一步”。飞禽走兽老虎机的三维分析的理论和方法还需要做进一步的研究。
参考文献
-
万剑华,潘正风,李清泉.城市三维地理信息系统研究的几个焦点问题[J].测绘通报.2002(7):11-13
-
李建成. 基于ArcEngine的三维GIS的设计与实现[J]. 遥感技术与应用, 2009, 24(3): 395-398.
-
李佼. 基于TerraExplorer Pro的三维城市浏览系统开发[J]. 计算机技术与发展, 2009, 19(6): 240-242.
-
梁吉欣. Skyline在Web三维GIS中的应用研究[J]. 昆明理工大学学报(理工版), 2009, 34(2).
-
王磊, 周云轩. GIS二维、三维空间信息查询功能的实现与应用[J]. 计算机应用研究, 2001, 18(12): 145-148.
-
徐占华,梁建国.基于 Skyline的最短路径分析算法设计与实现[J].城市勘测.2008(4):31-42.