skyline开发资料汇总.docx
- 文档编号:30432011
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:42
- 大小:41.18KB
skyline开发资料汇总.docx
《skyline开发资料汇总.docx》由会员分享,可在线阅读,更多相关《skyline开发资料汇总.docx(42页珍藏版)》请在冰豆网上搜索。
skyline开发资料汇总
一、开发入门(c#):
经过几个月的摸索,对skyline的开发有了一定的了解。
入门的阶段总是让人郁闷,现将本人的经验进行简单的总结,方便自己,方便他人。
本文是个人的经验总结,如果有不同的见解,欢迎各位朋友一起讨论。
欢迎转载本文,转载是请注明本文地址
本文包括两方面的内容,一方面是介绍skyline开发帮助文档,另一方面是根据帮助文档编写一个skyline的例程。
一、帮助文档介绍
安装好skylinepro后,在安装目录下可以找到开发帮助文档ProgrammersGuide.chm
我是把软件安装在C盘,C:
\ProgramFiles\Skyline\TerraExplorerPro\Help。
帮助文档共有七个章节,skylin桌面开发主要是用到第三章和第四章。
1、TerraExplorerCoClassInterfaces
TerraExplorerClass类是创建TerraExplorer组件类的入口,TerraExplorerCoClassInterfaces中所有的接口都实现了TerraExplorerClass类。
以获得IInformationTree5对象为例,代码如下:
TerraExplorer terraExplorer=newTerraExplorerClass();
IInformationTree5 iInformationTree5=newTerraExplorerClass();
以上两行代码,就可以得到iInformationTree5实例了,就可以调用iInformationTree5的方法。
其他组件类接口的使用方法都是类似的。
TerraExplorerClass除了能实现组件类接口,也能直接实例化。
TerraExplorerClass terraExplorerClass=newTerraExplorerClass();
terraExplorerClass对象提供了丰富的方法,最常用的就是Invoke方法了,这个方法实际上是和IMenu接口的Invoke方法是一样的,只要传入菜单命令ID,就可以调用skyline已经封装好的很多功能了,菜单命令可以参考开发帮助IMenu接口的介绍。
2、ITerraExplorerObject5Interfaces
主要是介绍创建TerraExplorer各种对象的接口。
以上接口不能通过直接实现,必须通过组件类实例的方法创建。
实现ITerrainPolyline接口的代码如下:
方法一:
ITerrainPolyline iTerrainPolyline= null;
iTerrainPolyline=terraExplorerClass.CreatePolyline(null,Color,HeightStyleCode.HS_ON_TERRAIN,groupID,“线的名称”);
方法二:
IObjectManager51 iObjectManager51=(IObjectManager51)terraExplorer;
ITerrainPolyline iTerrainPolyline= null;
iTerrainPolyline=iObjectManager51.CreatePolyline(null,Color,HeightStyleCode.HS_ON_TERRAIN,groupID,“线的名称”);
二、开发实例——路线转移
路线转移功能,可以通过鼠标画一个转移的路线,双击鼠标结束画线。
创建好路线之后,再创建一个动态对象,动态对象以之前创建好的路线作为运动的轨迹。
1、创建私有变量
privateTerraExplorerClassterraExplorerClass;
ITerrainPolyline iTerrainPolyline= null;
2、创建路线
iTerrainPolyline=terraExplorerClass.CreatePolyline(null,Color,HeightStyleCode.HS_ON_TERRAIN,groupID,“路线”);
//创建鼠标左键委托
this.terraExplorerClass.OnLButtonDown+=new_ITerraExplorerEvents5_OnLButtonDownEventHandler(TE_OnLButtonDown);
//创建鼠标双击委托
this.terraExplorerClass.OnLButtonDblClk+=new_ITerraExplorerEvents5_OnLButtonDblClkEventHandler(TE_OnLButtonDblClk);
this.TE.SetMouseInputMode(MouseInputMode.MI_COM_CLIENT);
3、私有方法
///
///添加线坐标
///
///
///
///
///
voidTE_OnLButtonDown(intFlags,intX,intY,refobjectpbHandled)
{
objectx,y,flag;
doubleterrainX,terrainY,terrainH;
//获得鼠标坐标
this.terraExplorerClass.GetMouseInfo(outflag,outx,outy);
//将鼠标坐标转为地理坐标
this.terraExplorerClass.IRender3_ScreenToTerrain(Convert.ToInt32(x),Convert.ToInt32(y),outterrainX,outterrainY,outterrainH);
//将地理坐标添加到鼠标点击创建的线中
iTerrainPolyline.AddVertex(terrainX,newPolylineHeigh,terrainY,(int)flag);
}
///
///双击结束
///
///
///
///
///
voidTE_OnLButtonDblClk(intFlags,intX,intY,refobjectpbHandled)
{
this.terraExplorerClass.OnLButtonDown-=new_ITerraExplorerEvents5_OnLButtonDownEventHandler(TE_OnLButtonDown);
this.terraExplorerClass.OnLButtonDblClk-=new_ITerraExplorerEvents5_OnLButtonDblClkEventHandler(TE_OnLButtonDblClk);
this.terraExplorerClass.SetMouseInputMode(MouseInputMode.MI_FREE_FLIGHT);
}
///
///根据对象名称获取ItemID
///
///
///
///
publicstaticintGetItemIDByName(stringName)
{
intItemID=terraExplorerClass.GetNextItem(0,ItemCode.CHILD);
while(ItemID!
=0)
{
stringitemName=terraExplorerClass.GetItemName(ItemID);
if(itemName.Equals(Name))
{
returnItemID;
}
ItemID=terraExplorerClass.GetNextItem(ItemID,ItemCode.NEXT);
}
returnItemID;
}
4、创建动态对象,并与创建好的路线作为运动的轨迹
//创建动态对象
IObjectManager51objectCar=newTerraExplorerClass();
stringfilename=@".\data\小车.xpc";
ITerrainDynamicObject5iTDynamicObject=objectCar.CreateDynamicObject(DynamicMotionStyle.MOTION_GROUND_VEHICLE,
DynamicObjectType.DYNAMIC_3D_MODEL,filename,2.0,HeightStyleCode.HS_ON_TERRAIN,gorupID,obejectName);
iTDynamicObject.TurnSpeed=200;
iTDynamicObject.Distance=300;
iTDynamicObject.CircularRoute=0;
iTDynamicObject.ScaleFactor=3;
//添加路线里面的坐标
intitemID=this.GetItemIDByName(“路线”);
ITerrainPolyline5 iTerrainPolyline5=terraExplorerClass.GetObjectEx(itemID,"ITerrainPolyline5");
//添加路线里的坐标点
intNumofPoint=iTerrainPolyline5.NumOfVertices;
objectX,Height,Y;
for(inti=0;i<=NumofPoint-1;i++)
{
iTerrainPolyline5.GetVertex(i,outX,outHeight,outY);
iTerrainDynamicObject5.AddWaypoint((double)X,(double)Height,(double)Y,speed,i);
}
//视角定位至路线的第一个点
terraExplorerClass.FlyTo((double)X,(double)Y,(double)Height,123,0,-90,"FlyToLocation");
//飞至该路线
terraExplorerClass.FlyToObject(iTerrainDynamicObject5.ID,ActionCode.AC_PLAY);
三、小结
TerraExplorerClass是skyline开发的起点,本身能实例化,也实现了TerraExplorer接口和所有的组件类接口。
应该说TerraExplorerClass是skyline开发最重要的一个类了,如果要做成插件式的三维系统,只要实例化TerraExplorerClass,并将其对象声明为公共变量,就可以与地图窗口和树控件进行交互了。
二、如何创建飞机
由于本人很忙,没能及时回复,跟大家说声对不起,代码已经更新!
go!
///
///创建飞机时的左键事件
///
///
///
///
///
privatevoidTE_OnLButtonDown(intL,intdoubleX,intdoubleY,refobjectpbHandled)
{
pbHandled=true;
clsStaticValue.isRbtnInUse=true;
switch(click_int)
{
case1:
{
if(IsOrNotDraw==1)
{
if(IsOrNotCreated==1)
{
intgroup_id=m_InformationTree.CreateGroup("飞行路径1",0);
stringfilepath=System.Windows.Forms.Application.StartupPath+@"\model\747.xpc";
IObjectManager51AirPlane=newTerraExplorerClass();
m_TDynamicObject1=AirPlane.CreateDynamicObject(DynamicMotionStyle.MOTION_AIRPLANE,
DynamicObjectType.DYNAMIC_3D_MODEL,filepath,2.0,HeightStyleCode.HSC_TERRAIN_RELATIVE,group_id,"747");
m_TDynamicObject1.CircularRoute=1;
m_TDynamicObject1.ToolTipText="OK";
m_TDynamicObject1.ScaleFactor=1;
m_TDynamicObject1.TurnSpeed=50;
m_TDynamicObject1.Visible=1;
m_Menu.Invoke(34200);
IsOrNotCreated=0;
i=1;
}
m_Render.ScreenToTerrain((int)doubleX,(int)doubleY,outdoublex,outdoubley,outdoubleheight);
m_TDynamicObject1.AddWaypoint(doublex,500.0,doubley,300.0,i-1);
if(i==1)
{
dFromX=doublex;
dFromY=doubley;
dFromHeight=doubleheight;
m_TPolyline1=m_ObjectManager.CreatePolyline(0,0x0000ffff,HeightStyleCode.HSC_TERRAIN_ABSOLUTE,0,"");
m_TPolyline1.ExistInBasicTree=0;
m_TPolyline1.LineWidth=0;
m_TPolyline1.AddVertex(dFromX,dFromHeight,dFromY,0);
m_VerIndex=0;
m_TE.OnFrame+=new_ITerraExplorerEvents5_OnFrameEventHandler(m_TE_OnFrame);//鼠标移动事件
}
dToX=doublex;
dToY=doubley;
dToHeight=doubleheight;
m_TPolyline1.AddVertex(dToX,dToHeight,dToY,0);
m_VerIndex=m_VerIndex+1;
dFromX=dToX;
dFromY=dToY;
i=i+1;
ObjectlongFlags,x1,y1;
m_Render.GetMouseInfo(outlongFlags,outx1,outy1);
m_TE.OnRButtonDown+=new_ITerraExplorerEvents5_OnRButtonDownEventHandler(TE_OnRButtonDown);
}
else
{
break;
}
}
break;
}
//thrownewException("Themethodoroperationisnotimplemented.");
}
三、关于TerraExplorerPro的贴图方法
TerraExplorerPro提供三种贴图方法,“terraintexture”、“singlecolor”和“imageinthefile”,采用这三种方法贴图,文件的运行速度是不一样的。
用单色(singlecolor)代替的影响是在FLY文件打开的时候读入数据的速度会变慢,但是运行速度是最快的;其次是采用文件贴图(imageinthefile),由于在漫游时不断的在解析,在拥有大量模型的三维场景中会影响运行速度,因此建筑物的纹理采用影像本身即TerrainTexture,运行速度是最慢的。
四、Create3DPolygon
斑竹您好:
我通过程序Create3DPolygon,在程序3D窗口中创建对象成功,然后我保存fly,从TerraExplorerPro打开后发现节点超过10个的对象不显示了,请斑竹指点;程序代码如下:
ITerrain3DPolygon5XiaoShi=iObj5.Create3DPolygon(0,4,0,0,0,HeightStyleCode.HSC_TERRAIN_ABSOLUTE,ItemID,Name);
for(intj=0;j { string[]ArrJWD=strJWD[j].Split(','); JD=Convert.ToDouble(ArrJWD[0].ToString()); WD=Convert.ToDouble(ArrJWD[1].ToString()); XiaoShi.AddVertex(JD,YXDMG,WD,0); } 谢谢您,这两天忙别的没登陆回复;下面是全部代码,Group(ItemID)中共有17个对象生成,但在Skyline中就剩下4个了;下面坐标串是一条记录的经纬度串,即JWDC=Convert.ToString(objRecordSet2.GetFieldValue("经纬度串"));估计不是strJWD的问题了; stringXS=boBox2.Text; intItemID=this.iInfo5.FindItem(XS); if(ItemID! =0) { iInfo5.DeleteItem(ItemID); ItemID=iInfo5.CreateGroup(XS,0); } if(ItemID==0) { ItemID=iInfo5.CreateGroup(XS,0); } objRecordSet1=objDtv.Query("",true,null,""); intRecordCount=objRecordSet1.RecordCount; stringWYBS=""; stringDescription=""; stringName=""; stringJWDC=""; doubleYXDMG=0; for(inti=1;i<=RecordCount;i++) { objRecordSet2=objDtv.Query("SMID="+i,true,null,""); Name=Convert.ToString(objRecordSet2.GetFieldValue("SMID")); JWDC=Convert.ToString(objRecordSet2.GetFieldValue("经纬度串")); YXDMG=Convert.ToDouble(objRecordSet2.GetFieldValue("影像地面高"))-4; string[]strJWD=JWDC.Split('|'); doubleJD=0,WD=0; ITerrainBuilding5XiaoShi=iObj5.CreateBuilding(0,0,BuildingStyleCode.BS_POLYGONS,HeightStyleCode.HSC_TERRAIN_ABSOLUTE,ItemID,Name); for(intj=0;j { string[]ArrJWD=strJWD[j].Split(','); JD=Convert.ToDouble(ArrJWD[0].ToString()); WD=Convert.ToDouble(ArrJWD[1].ToString()); XiaoShi.AddVertex(JD,YXDMG,WD,0); } } MessageBox.Show("结束! "); 116.654098435319,40.0855222861305|116.654100067961,40.0855187167824| 116.654099458493,40.08550380117|116.654101174728,40.085501990316| 116.654100720976,40.085491177809|116.654097071719,40.0854889198497| 116.654082951325,40.0854889511107|116.654079497885,40.0854911930992| 116.654079939555,40.0855019965855|116.654081803195,40.0855037929093| 116.65408241237,40.0855186995138|116.654084349287,40.0855222903903| 116.654098435319,40.0855222861305 五.1三维场景下的矢量数据查询 使用SkyLine平台进行三维GIS系统开发,可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- skyline 开发 资料 汇总