PandaGIS的SkyLine开发教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

PandaGIS的SkyLine开发教程(2)__把三维场景下的3D模型和面对象保存成矢量图层。已有867次阅读2009-05-0911:54虽说TerraExplorer提供了把3D模型和面对象保存成Shp图层的功能,但是能够保存的属性字段是固定的,有的我们需要的属性无法导出到Shp数据中。比如我们把建筑图层导出成Shp图层,其中建筑底部高度这个属性就无法导出。当我们把建筑图层用Shp数据做索引,以流的方式导入三维场景中的时候就会发现我们无法控制建筑的底部高度。在导出面图层的时候也会遇到类似的问题,因此需要写个导出shp图层的工具,能够导出所有需要的属性字段。这里下面提供相关样例代码,使用SkyLine和MapObject的接口进行开发。一、点图层的导出,主要用于导出建筑物图层if(pObj.ObjectType==ObjectTypeCode.OT_MODEL)//确定对象是三维模型{ITerrainModel2pModel=pObjasITerrainModel2;Fieldfld;MapObjects2.Pointpt=newMapObjects2.Point();objectdX=newdouble(),dY=newdouble(),dElevation=newdouble();objectdYaw=newdouble(),dPitch=newdouble(),dRoll=newdouble();pModel.GetPosition(outdX,outdY,outdElevation,outdYaw,outdPitch,outdRoll);pt.X=(double)dX;pt.Y=(double)dY;recs.AddNew();fld=recs.Fields.Item(Shape);fld.Value=pt;fld=recs.Fields.Item(Name);fld.Value=m_InformationTree.GetItemName(iItemID);fld=recs.Fields.Item(FILENAME);//修改模型的路径if(textBox1.Text.Trim()!=&&textBox2.Text.Trim()!=&&textBox1.Text.Trim()!=null&&textBox2.Text.Trim()!=null){stringFileName=pModel.ModelFileName;if(FileName.Contains(textBox1.Text.Trim())){fld.Value=FileName.Replace(textBox1.Text.Trim(),textBox2.Text.Trim());}else{MessageBox.Show(原有对象路径中不含有字符串:+textBox1.Text.Trim()+,请重新输入。);return;}}else{fld.Value=pModel.ModelFileName;}fld=recs.Fields.Item(ALTITUDE);fld.Value=dElevation;fld=recs.Fields.Item(YAW);fld.Value=dYaw;;fld=recs.Fields.Item(PITCH);fld.Value=dPitch;fld=recs.Fields.Item(ROLL);fld.Value=dRoll;fld=recs.Fields.Item(SCALE);fld.Value=pModel.ScaleFactor;fld=recs.Fields.Item(TOOLTIP);fld.Value=pModel.ToolTipText;fld=recs.Fields.Item(DISTANCE);fld.Value=pModel.Distance;fld=recs.Fields.Item(MAXDIST);fld.Value=pModel.MaxVisibilityDistance;fld=recs.Fields.Item(MINDIST);fld.Value=pModel.MinVisibilityDistance;recs.Update();}二、面图层的可用于导出道路面图层等。if(pObj.ObjectType==ObjectTypeCode.OT_POLYGON)//确定是对象是多边形对象{MapObjects2.Polygonply=newPolygon();Fieldfld;ITerrainPolyline5pPolygon=(TerraExplorerX.ITerrainPolyline5)m_InformationTree.GetObjectEx(iItemID,(object));objectdX=newdouble(),dY=newdouble(),dElevation=newdouble();objectdYaw=newdouble(),dPitch=newdouble(),dRoll=newdouble();pPolygon.GetPosition(outdX,outdY,outdElevation,outdYaw,outdPitch,outdRoll);MapObjects2.Pointpt=newMapObjects2.Point();//新建点objectdouX,douY,douH;MapObjects2.Pointspts=newPoints();//新建点集intintNumPoint=pPolygon.NumOfVertices;for(inti=0;iintNumPoint;i++){pPolygon.GetVertex(i,outdouX,outdouH,outdouY);pt.X=(double)douX;pt.Y=(double)douY;pts.Add(pt);}ply.Parts.Add(pts);//添加点集recs.AddNew();fld=recs.Fields.Item(Shape);fld.Value=ply;fld=recs.Fields.Item(Name);fld.Value=m_InformationTree.GetItemName(iItemID);fld=recs.Fields.Item(TextureFil);if(textBox1.Text.Trim()!=&&textBox2.Text.Trim()!=&&textBox1.Text.Trim()!=null&&textBox2.Text.Trim()!=null){stringFileName=pPolygon.TextureFileName;if(FileName.Contains(textBox1.Text.Trim())){fld.Value=FileName.Replace(textBox1.Text.Trim(),textBox2.Text.Trim());}else{MessageBox.Show(原有对象路径中不含有字符串:+textBox1.Text.Trim()+,请重新输入。);return;}}else{fld.Value=pPolygon.TextureFileName;}fld=recs.Fields.Item(TilingMeth);switch(pPolygon.TextureTilingMethod.ToString()){caseTM_TILES_PER_AXIS:fld.Value=TM_TILES_PER_AXIS;break;caseTM_METERS_PER_TILE:fld.Value=TM_METERS_PER_TILE;break;default:break;}fld=recs.Fields.Item(TextureX);fld.Value=pPolygon.TextureScaleX;fld=recs.Fields.Item(TextureY);fld.Value=pPolygon.TextureScaleY;fld=recs.Fields.Item(TextureR);fld.Value=pPolygon.TextureRotateAngle;fld=recs.Fields.Item(ToolTip);fld.Value=pPolygon.ToolTipText;fld=recs.Fields.Item(Distance);fld.Value=pPolygon.Distance;fld=recs.Fields.Item(MaxDistan);fld.Value=pPolygon.MaxVisibilityDistance;fld=recs.Fields.Item(MinDistan);fld.Value=pPolygon.MinVisibilityDistance;fld=recs.Fields.Item(AltitudeMe);switch(pPolygon.HeightStyle){caseHeightStyleCode.HS_POLYGON_TERRAIN_RELATIVE:fld.Value=相对于地面;break;caseHeightStyleCode.HSC_TERRAIN_ABSOLUTE:fld.Value=绝对高度;break;caseHeightStyleCode.HS_POLYGON_PIVOT_RELATIVE:fld.Value=相对于支点;break;caseHeightStyleCode.HS_ON_TERRAIN:fld.Value=沿地面;break;default:break;}fld=recs.Fields.Item(Altitude);fld.Value=dElevation;recs.Update();}PandaGIS的SkyLine开发教程(3)__根据道路中心线矢量图层在三维场景中自动铺路已有913次阅读2009-05-0911:54对于三维场景中的道路的铺设,大多使用TerraExplorerPro中提供的工具进行铺设,但是也要一条一条的在三维场景中画。如果我们有道路中心线矢量图层,那么这一切将变得非常简单,我们根据道路中心线图层可以自动的在三维场景中铺路。整个过程基本上可以分为三步:第一步:把道理中心线图层导入三维场景中,检测中心线图层是否与地形相匹配,对于有问题的线进行修改,并导出新的道路中心线图层。第二步:使用道路导入工具自动在三维场景中生成道路面。下面我会重点讲怎么根据道路中心线生成道路面,并附带样例代码。第三步:把道路的道路面保存成Shp面图层,最后以流的方式导入道路面图层。关于道路面图层的保存可以参考SkyLine开发(2)中的讲解。链接地址:=7892&extra=page%3D1这里开始讲根据道路中心线生成三维场景中的道路面的方法,我们使用了SkyLine的接口和MapObject的接口进行开发。首先对道路中心线进行解析,得到中心线的坐标串和属性(如道路等级,路宽等),再根据道路中心线的空间信息把中心线扩展成具有一定宽度的面,根据属性信息对道路的宽度和道路纹理进行赋值,然后在三维场景中生成道路。当然对于道路交叉口等复杂路段我们还需要手动调整。下面提供相关样例代码,其中根据道路中心线生成面的方法稍微复杂,其实也就是根据线生成缓冲区的过程,其余都很容易看懂。虽然MapObjct提供了缓冲计算的接口,可以根据线生产面,但是在线的两端也做了半圆缓冲,自然不符合生成三维场景中道路的要求,所以我们使用SkyLine的相关接口进行缓冲计算。//渲染道路privatevoidbtnBuildRoad_Click(objectsender,EventArgse){MapLayerlyrTemp=newMapLayer();lyrTemp=(MapLayer)axMap1.

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功