SkylineV6二次开发培训教程 - 图文

更新时间:2023-12-03 18:06:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Skyline二次开发培训教程

2011年04月

目录

1接口简介 ............................................................................................................................ 3 2 COM介绍 ........................................................................................................................... 3 2.1什么是COM ................................................................................................................ 3 2.2 COM组件 .................................................................................................................... 3 2.3 为什么要介绍COM ................................................................................................... 3 3 创建客户端应用程序 ....................................................................................................... 4 3.1 C#编程环境 ................................................................................................................. 4 3.2 JavaScript编程环境 .................................................................................................. 10 4开发接口应用举例 .......................................................................................................... 19 4.1 ISGWorld6 .................................................................................................................. 19 4.2 IAnalysis6 ................................................................................................................... 21 4.3 IApplication6 .............................................................................................................. 23 4.4 ICommand6 ............................................................................................................... 24 4.5 ICoordServices6 ......................................................................................................... 25 4.6 ICreator6 .................................................................................................................... 27 4.7 IDateTime6 ................................................................................................................ 31 4.8 INavigate6 .................................................................................................................. 32 4.9 IProject6 .................................................................................................................... 33 4.10 IProjectTree6 ........................................................................................................... 34 4.11 ITerrain6 .................................................................................................................. 36 4.12 ITEVersion6 .............................................................................................................. 37 4.13 IWindow6 ................................................................................................................ 38

1接口简介

TerraExplorer API提供了一套强大的接口用来集成TerraExplorer、TerraExplorer Pro 和用户自定义应用。它提供了一些访问外部信息扩展的方法,比如:访问数据库或基础地理空间数据。所有这些以COM协议为基础的API接口都可以通过脚本语言操作(例如vbscript、Javascript),也可以通过非脚本语言来控制操作(例如:C++、VB、Delphi或者.net)。

TerraExplorer也提供了一套ActiveX控件,可以将3D窗口、信息树和导航图以控件对象的方式嵌入到用户自定义的可视化界面中。

2 COM介绍 2.1什么是COM

COM是Microsoft组件对象模型(Component Object Model)的简称。

COM是一个说明如何建立可动态交替更新组件的规范。它提供了客户和组件为保证能够互操作应该遵循的标准。该标准对于组件架构的重要性同其他任何一个具有可交替更新部分的系统是一样的。举个例子,如果没有国家标准(GB),那么各个厂家所生产的零件及产品将不能实现互换性。各个厂家各自为政,若电机上的螺栓坏了,就要买原来厂家生产的螺栓,相当不方便。

2.2 COM组件

COM组件由以Win 32动态连接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。遵循COM规范编写出来的组件将能够满足对组件架构的所有要求。

那么,COM组件有什么好处呢?它到底是什么东西呢?

2.3 为什么要介绍COM

作为传统软件的应用程序在发行之后,使用者要想省略掉其中的某些内容,或者感觉应用程序的某些部分还不够完善,希望得到更好的版本,只有等到软件发行商将新版本重新全部编译并推出后,使用者的这一梦想才能实现。这是传统软件的典型发行方式。

但是,这却严重妨碍了软件使用人员的工作效率,使得使用者想做某件事,而软件却没有相应的实现部分。这使得软件的使用范围大幅度缩小,同时也使得商家频于软件升级方面的应酬,而实际上应用程序的开发进度却丝毫得不到加快。

但是,自从COM出现以后,以上问题就基本上迎刃而解了。

有了COM,软件开发人员就可以在应用程序发行后仍可以对它进行修改或给它加上一些新的特性,这大大方便了使用者,因为应用程序能够在更高的程度上被定制,使应用更加灵活、更具动态性。于是,将可能出现这样的情况:每个使用者都在使用相同的软件,而实际上每个使用者的软件却大相径庭。软件开发人员可以用逐步添加的方式开发程序,而不是每隔一两年将其完全重写一遍,这又在很大程度上加快了应用程序的开发进度。

3 创建客户端应用程序 3.1 C#编程环境

以下步骤为使用ISWorld6接口创建一个C#客户端应用程序(开发环境Visual Studio2010):

1. 添加ActiveX控件到工具箱-设计视图,右击工具箱,选择“选择项”,在“COM组件”标签中选择TE3DWindow Class, TEInformationWindow Class 和TENavigationMap Class,单击确定,

TE3DWindow Class, TEInformation Window Class和

TENavigationMap

Class添加到工具箱中。

2. 设置工程参考-右击解决方案资源管理器中的“引用”,选择“添加引用”/COM 标签,选择“TerraExplorerX 1.0 Type Library”,单击确定,将其添加到引用中。 3. 添加Using指令-在工程中添加”using TerraExplorerX;”

4. 添加控件-将工具箱中的TE3DWindow Class, TEInformationWindow Class 和TENavigationMap Class拖到窗体中,创建用户界面。

5. 创建TerraExplorer对象-SGWorld对象是TE接口的入口点,通过该对象可以访问TE中的其他接口。

This.sgworld=new SGWorld();

在此基础上,可以根据功能需求进行程序开发。以下代码为一个简单例子。

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text;

using System.Windows.Forms;

using TerraExplorerX;

namespace Test {

public partial class Form1 : Form {

public Form1() {

InitializeComponent(); sgworld = null; tCreate = null; LBPos = null; tWindow = null; tNavigate = null; myPolylin = null; myPolygon = null; bMove = false; geoPoints = null; pixelToWorld = null; tProjectTree = null; tAnalysis = null; tCoordServices = null;

LBPos = new List(); operateType = 0; }

private SGWorld sgworld; private ICreator6 tCreate; private IWindow6 tWindow; private INavigate6 tNavigate; private IAnalysis6 tAnalysis;

private IProjectTree6 tProjectTree;

private ICoordServices6 tCoordServices;

private int operateType;

private ITerrainPolyline6 myPolylin; private ITerrainPolygon6 myPolygon; private bool bMove;

private List LBPos; private double[] geoPoints;

private IWorldPointInfo6 pixelToWorld;

private void Form1_Load(object sender, EventArgs e) {

if (sgworld == null) {

sgworld = new SGWorld(); sgworld.OnLButtonUp += new

_ISGWorld6Events_OnLButtonUpEventHandler(sgworld_OnLButtonUp); sgworld.OnRButtonUp += new

_ISGWorld6Events_OnRButtonUpEventHandler(sgworld_OnRButtonUp); sgworld.OnFrame += new

_ISGWorld6Events_OnFrameEventHandler(sgworld_OnFrame);

tCreate = sgworld.Creator; tWindow = sgworld.Window; tNavigate = sgworld.Navigate; tProjectTree = sgworld.ProjectTree; tAnalysis = sgworld.Analysis; tCoordServices = sgworld.CoordServices; }

sgworld.Open(@\培训教材\\data\\San Francisco样例数据\\Default.fly\); tWindow.HideMessageBarText(); }

bool sgworld_OnLButtonUp(int Flags, int X, int Y) {

if (operateType > 0) {

IWorldPointInfo6 worldPoint = tWindow.PixelToWorld(X, Y, WorldPointType.WPT_ALL); IPosition6 pos = worldPoint.Position; LBPos.Add(pos);

List points = new List(); foreach (IPosition6 temppos in LBPos) {

points.Add(temppos.X);

points.Add(temppos.Y);

points.Add(temppos.Altitude); }

geoPoints = points.ToArray(); switch (operateType) {

case 1: case 2:

bMove = true; break; case 3:

var location= tCreate.CreateLocation(LBPos[0], 0, \); operateType = 0;

tWindow.SetInputMode(MouseInputMode.MI_FREE_FLIGHT, \, false); location.Position .Pitch = -45; location.Position.Distance = 80000; tNavigate.FlyTo(location, ActionCode.AC_FLYTO); break; case 4:

ITerrainLabel6 label= tCreate.CreateLabel(LBPos[0], \, \, null , 0,

\标签\);

operateType = 0; tWindow.SetInputMode(MouseInputMode.MI_FREE_FLIGHT, \, false); break; case 5: pixelToWorld = tWindow.PixelToWorld(X, Y, WorldPointType.WPT_MODEL );

operateType = 0; tWindow.SetInputMode(MouseInputMode.MI_FREE_FLIGHT, \, false);/ if (pixelToWorld == null) {

MessageBox.Show(\对象类型选择错误\); } else {

MessageBox .Show (\+pixelToWorld .ObjectID +\ position:\+pixelToWorld .Position .X +\ type:\+pixelToWorld .Type .ToString ()); } break; } }

return false; } void sgworld_OnFrame() {

if (bMove)

{

IMouseInfo6 mouseInfo = tWindow.GetMouseInfo();

IWorldPointInfo6 worldPoint = tWindow.PixelToWorld(mouseInfo.X, mouseInfo.Y, WorldPointType.WPT_ALL);

IPosition6 pos = worldPoint.Position;

double [] movePos = new double [] { pos.X, pos.Y, pos.Altitude };

double [] tempPos = new double[geoPoints.Length + 3]; geoPoints.CopyTo(tempPos, 0);

movePos.CopyTo(tempPos, geoPoints.Length); switch (operateType) {

case 1:

if (myPolylin != null) {

tCreate.DeleteObject(myPolylin.ID); }

myPolylin = tCreate.CreatePolylineFromArray(tempPos, Color.Red, AltitudeTypeCode.ATC_ON_TERRAIN, 0, \); break; case 2: if (myPolygon != null )

{

tCreate.DeleteObject(myPolygon.ID); }

if (tempPos.Length >= 9) { ILinearRing lineRing = tCreate.GeometryCreator.CreateLinearRingGeometry(tempPos);//创建环必须大于等于三个点

myPolygon = tCreate.CreatePolygon(lineRing, Color.Red, Color.White, AltitudeTypeCode.ATC_ON_TERRAIN, 0, \); } break; } } }

bool sgworld_OnRButtonUp(int Flags, int X, int Y) {

if (operateType > 0) {

switch (operateType) {

case 1:

if (myPolylin != null) {

tCreate.DeleteObject(myPolylin.ID); myPolylin = null; }

ITerrainPolyline6 Polylin = tCreate.CreatePolylineFromArray(geoPoints, Color.White, AltitudeTypeCode.ATC_ON_TERRAIN, 0, \);

Polylin.SaveInFlyFile = true; operateType = 0; bMove = false;

tWindow.SetInputMode(MouseInputMode.MI_FREE_FLIGHT , \, false);

break; case 2:

if (myPolygon !=null ) {

tCreate.DeleteObject (myPolygon .ID ); myPolygon =null ; } ILinearRing lineRing = tCreate.GeometryCreator.CreateLinearRingGeometry(geoPoints); ITerrainPolygon6 Polygon = tCreate.CreatePolygon(lineRing, Color.Red, Color.White, AltitudeTypeCode.ATC_ON_TERRAIN, 0, \);

Polygon.SaveInFlyFile = true; operateType =0; bMove =false ;

tWindow .SetInputMode (MouseInputMode .MI_FREE_FLIGHT ,\,false ); break ; } }

return true; }

private void btnPolyline_Click(object sender, EventArgs e) {

operateType = 1;

tWindow.SetInputMode(MouseInputMode.MI_COM_CLIENT, \, false); LBPos = new List(); }

private void btnPolygon_Click(object sender, EventArgs e) {

operateType = 2;

tWindow.SetInputMode(MouseInputMode .MI_COM_CLIENT,\,false ); LBPos = new List(); }

private void btnLocation_Click(object sender, EventArgs e) {

operateType = 3;

tWindow.SetInputMode(MouseInputMode .MI_COM_CLIENT ,\,false ); LBPos = new List(); }

private void btnLabel_Click(object sender, EventArgs e) {

operateType = 4;

tWindow.SetInputMode(MouseInputMode .MI_COM_CLIENT ,\,false ); LBPos = new List(); } } }

3.2 JavaScript编程环境 以下步骤为使用TE接口创建一个JavaScript客户端应用程序:

1. 添加ActiveX控件到网页-通过标记可将3D Window、Information tree、Navigation Map控件嵌入到网页中。 三个控件在Web页中的声明如下:

CLASSID=\height=400 >

CLASSID=\height=300 >

注:三个控件的CLASSID 均是唯一的,使用时请别混淆。每个嵌入的对象ID是可以更改的。

2. 创建TerraExplorer对象-使用标记定义一个TerraExplorer对象或编写函数创建一个TerraExplorer对象。

< OBJECT ID =\style=\

//**********************************************// function CreateSGWorld() {

obj = document.getElementById(\ if (obj == null) {

obj = document.createElement('object');

document.body.appendChild(obj); obj.id = \ obj.name = \ obj.classid = \ }

Var sgworld=CreateSGWorld(); 在此基础上,可以根据功能需求进行程序开发。以下代码为一个简单例子。

脚本开发练习

4开发接口应用举例 4.1 ISGWorld6

ISGWorld6是TE主要接口的入口点。你可以通过这个接口管理应用程序和3D内容,并处理各种事件。

下面的接口可以通过ISGWorld6接口的属性获得: ? IProject6(.Project)-打开工程,管理工程属性和保存工程。

? INavigate6(.Navigate)-通过设置摄像机的位置在3D窗口中导航,并且可以产生复杂的动作,如飞到对象,放大/缩小等。

? IProjectTree6(.ProjectTree)-访问信息树。可以进行组的创建和检索树中的对象。 ? ICreator6(.Creator)-创建和删除所有的图层、对象、位置、几何体、颜色和漫游路径。 ? IAnalysis6(.Analysis)-进行地形分析操作。

? ITerrain6(.Terrain)-公开信息,如正在使用的MPT文件的名称, MPT坐标系和高程信息。

? IWindow6(.Window)-根据屏幕中的点检索3D窗口,创建和管理弹出窗体,创建快照和管理用户界面元素。

? ICommand6(.Command)- 激活TE用户界面操作,如打开/关闭地下模式,开始手动对象编辑。

? ICoordServices6(.CoordServices)-数据坐标系。可以定义坐标系统,将坐标系转换为当前地形坐标系等。

? Events-使用AttachEvent监听TE事件。

提示:以上接口为TEV6.0支持的接口。当使用旧版本进行开发时,请参照相应的开发指南。

属性 Analysis Application Command CoordServices

分析地形的方法。 控制不同的应用级别设置。 访问标准TerraExplorer菜单命令。 提供一系列方法将给定坐标系和其他坐标系进行

转换。 Creator DateTime IgnoreAccelerators Navigate Project ProjectTree Terrain Version Window 方法 AttachEvent DetachEvent GetOptionParam Open SetOptionParam 事件 OnBeforePresentationItemActivation OnCommandValueChanged OnContainerChanged OnCreateBasicKit OnDataTiemChanged OnDrawHUD 创建不同对象的一组方法。 提供相关功能的日期和时间。 定义应用程序执行键盘快捷命令,或是erraExplorer执行键盘快捷命令。 控制摄像机的位置、方向和速度。 访问工程设置并可以打开、保存工程等。 可以操作信息树节点,包括对组、项目和图层的管理。 Iterrain6表示地形信息,如正在使用的MPT文件名称,MPT坐标系统。 返回当前TerraExplorer的版本信息。 与3D窗口交互的一组功能,包括快照,获取屏幕尺寸和像素点信息。 绑定特定功能到事件,当事件发生时调用此功能。 解除使用AttachEvent方法绑定到事件的功能。 返回TerraExplorer参数设置中指定参数的值。 打开指定工程。 设置TerraExplorer参数设置中指定参数的值。 通知客户端漫游路径某步骤被激活。 当一个标准的TerraExplorer菜单命令值改变时触发事件。 当在工程自定义容器中执行操作时触发事件。 当项目打包为本地包或网络包时触发事件。 当改变日期和时间时触发事件。 帧被渲染后,但HUD层被绘制前,触发事件。当使用IWindow6.SetHUDLayer方法更新HUD图层时触发该事件。 一个Fly文件关闭后触发事件。 文件正在被关闭时触发事件。 当Fly文件被保存时触发事件。 刷新每帧时触发该事件,允许客户端执行任何操作(如,移动对象)。 当TerraExplorer输入模式改变时触发事件(例如从自由飞行模式转换到测量模式) 当图层不是预先存储到本地客户端而是以流方式传送时触发事件。 当用户双击鼠标左键时触发事件。 当用户按下鼠标左键时触发事件。 当用户释放鼠标左键时触发事件。 当TerraExplorer加载完Fly文件后触发事件。 OnFileClosed OnFileClosing OnFileSave OnFrame OnInputModeChanged OnLayerStreaming OnLButtonDblClk OnLButtonDown OnLButtonUp OnLoadFinished

OnMButtonDblClk OnMButtonDown OnMButtonUp OnMouseWheel OnObjectAction 当用户双击鼠标中键时触发事件。 当用户按下鼠标中键时触发事件。 当用户释放鼠标中键时触发事件。 当滚动鼠标滚轮并到达下一个触点时触发事件。 当对对象进行特定操作时(例如,飞到对象)触发事件。 OnPresentationFlyToReachedDestination 如果执行FlyTo操作,当FlyTo完成并且摄像机到达目标位置时触发事件。 OnPresentationPlayTimeAnimationEnded OnPresentationStatuesChanged OnPresentationTreeAction OnRButtonDblClk OnRButtonDown OnRButtonUp OnRenderQualityChanged OnSGWorld OnSGWorldMessage 当漫游路径结束时触发事件。 当漫游路径由一个状态转换到另个状态时触发事件。 当对信息树中的条目进行操作(如,显示/隐藏节点)时触发事件。 当用户双击鼠标右键时触发事件。 当用户按下鼠标右键时触发事件。 当用户释放鼠标右键时触发事件。 当用户查看的地形数据质量更新时触发事件。 当特定不同的TerraExplorer发生时,触发事件。 当一个消息对象将要被激发时触发事件。 4.2 IAnalysis6 IAnalysis6接口包含分析地形的一组方法。 方法 CalculateVolume CreateFloodContinuousWaterRise CreateFloodSingleWaterRise CreateLineOfSight CreateTerrainProfile CreateThreatDome CreateViewshed 分析被选的修改地形对象移除或添加的土方量。 一段时间内当水持续增长,创建一组多边形显示被水淹没的地区。 根据洪水增长量,创建一个多边形显示被水淹没的地区。 为两点之间的可视性创建一个可视化标记。 通过一条路径创建地形剖面图,提供剖面图的相关信息,例如最大最小高程和坡度值。 在地形上创建一个球形对象,威胁球对象表示位于球对象底部雷达可扫描的范围。 根据给定点,创建这个点的可视范围图。

代码示例: 【C#】

//视线分析

private void LineOfSight() {

SGWorld sgworld = new SGWorld(); ICreator6 tCreator=sgworld.Creator; IAnalysis6 tAnalysis=sgworld.Analysis; //观察点

IPosition6 ViewerPosition = tCreator.CreatePosition(-122.40655, 37.78302, 2, AltitudeTypeCode.ATC_ON_TERRAIN, 0, 0, 0, 0); double SampleInterval = 0.1; //目标点

IPosition6[] arrTargetPosition = new IPosition6[2];

arrTargetPosition[0] = tCreator.CreatePosition(-122.40538, 37.78252, 2, AltitudeTypeCode.ATC_ON_TERRAIN, 0, 0, 0, 0);

arrTargetPosition[1] = tCreator.CreatePosition (-122.406053, 37.782231, 0, AltitudeTypeCode.ATC_ON_TERRAIN, 0, 0, 0, 0); ILineOfSight6 lineOfSight = tAnalysis.CreateLineOfSight(ViewerPosition, SampleInterval, arrTargetPosition, 0, \通视分析\); }

【JavaScript】

function CreateSGWorld() {

obj = document.getElementById(\); if (obj == null) { obj = document.createElement('object');

document.body.appendChild(obj); obj.id = \; obj.name = \;

obj.classid = \; }

return obj; }

//单一时刻洪水分析

function CreateFloodSingleAnalysis() { var sgworld = CreateSGWorld(); var tAnalysis = sgworld.Analysis; var tCreator = sgworld.Creator; //创建圆心

var pos = tCreator.CreatePosition(116, 40, 0, 2, 0, 0, 0, 0); //半径

var radius = 100; //洪水上升总高度 var totalFloodRise = 12;

tAnalysis.CreateFloodSingleWaterRise(pos.X, pos.Y, radius, totalFloodRise, 3, 0, \洪水分析\); }

4.3 IApplication6

IApplication6接口可以控制不同的应用程序级别设置,可以返回应用程序数据路径,控制手柄是否可用,添加或移除应用程序容器。

属性 Containers CPUSaveMode DataPath EnableJoystick ExecutablePath SuppressUIErrors

IContainers6表示TerraExplorer应用程序容器。 布尔值,True表示使用用户界面时才进行界面渲染,或是传入参数False时,才进行界面渲染。 返回用户应用程序数据的路径。 布尔值,定义是否启用手柄。 启动应用程序的可执行文件路径,包括文件名。 布尔值,定义是否屏蔽错误消息。 代码示例: 【C#】 //返回应用数据路径(CreateNewFeatureLayer,SameAsKml等方法创建的对象默认保存到该路径) private void AppDate() { SGWorld sgworld = new SGWorld(); IApplication6 tApplication=sgworld.Application; string path = tApplication.DataPath; MessageBox.Show(path); } 【JavaScript】 function CreateSGWorld() { obj = document.getElementById(\); if (obj == null) { obj = document.createElement('object'); document.body.appendChild(obj); obj.id = \; obj.name = \;

obj.classid = \; }

return obj; }

function GetAppPath() {

var sgworld = CreateSGWorld();

var tApplication=sgworld.Application;

var sAppPath = tApplication.DataPath; confirm(sAppPath);

}

4.4 ICommand6

ICommand6接口可以访问TerraExplorer菜单的标准命令,提供菜单命令状态的信息并能够执行命令。

方法 CanExecute Execute GetValue IsChecked 检查指定命令是否能够执行。 执行一个TerraExplorer命令。 返回对象的指定属性值。 返回命令的选择状态。 代码示例: 【C#】 //实现导航模式中的拖拽模式 private void DragMode() { SGWorld sgworld = new SGWorld(); ICommand6 tCommand = sgworld.Command; if (!tCommand.CanExecute(1049, 0)) { MessageBox.Show(\命令无法使用\); return; } tCommand.Execute(1049,0); } 【JavaScript】 function CreateSGWorld() { obj = document.getElementById(\); if (obj == null) {

obj = document.createElement('object');

document.body.appendChild(obj);

obj.id = \; obj.name = \;

obj.classid = \; }

return obj; }

//打开/关闭地下模式

function UnderGroundMode() {

var sgworld = CreateSGWorld();

var tCommand=sgworld.Command; if (!tCommand.CanExecute(1027, 0)) { alert(\命令不能执行\); return; }

tCommand.Execute(1027,0); }

4.5 ICoordServices6 ICoordServices6接口提供了一套方法进行给定坐标系和其他坐标系的重投影。使用SourceCoordinateSystem属性定义应用程序的坐标系。一旦客户端设置了坐标系,客户端使用数据的坐标系都从原始坐标系转换为地形坐标系。可以使用ITerrain6.CoordinateSystem获取地形坐标系。 TerraExplorer Pro也提供了许多方法完成高级地理相关任务,如计算点之间的角度和距离。这些方法适用于全球数据库(全球数据库的单位是度),也适用于其他数据库。

属性 SourceCoordinateSystem 方法 ChooseCSDialog CovertCoordinateToMGRS ConvertMGRSToCoordinate CreateCoordinateSystem GetAimingAngles GetDistance GetDistance3D MoveCoord MoveCoordEx Reproject

IcoordinateSystem6代表源坐标系。 打开一个高级对话框,允许用户选择、查看、编辑和创建一个坐标系。 将一个地形数据库坐标系转换为军事格网参考坐标系。 将给定的军事格网参考坐标系转换为地形数据库的坐标系。 打开一个高级对话框,允许用户创建一个坐标系。 返回两个指定三维坐标点之间的角度。 返回两个指定坐标点之间的水平距离。 返回两个指定点之间的空间距离。 通过东西偏移和南北偏移移动一个二维坐标。 可以为坐标系定义一个方向,通过指定前后,左右和上下偏移移动一个三维坐标。 将一个给定坐标系转换为另一个坐标系。 代码示例: 【C#】

//打开坐标系对话框

private void OpenCSDialog() {

SGWorld sgworld = new SGWorld();

ICoordServices6 tCoordServices= sgworld.CoordServices;

string bstrWkt = \;

string SourceWkt = \; //选择的坐标系

bstrWkt = tCoordServices.ChooseCSDialog(\坐标系对话框\, SourceWkt); MessageBox.Show(bstrWkt); }

【JavaScript】

function CreateSGWorld() {

obj = document.getElementById(\); if (obj == null) {

obj = document.createElement('object');

document.body.appendChild(obj); obj.id = \; obj.name = \;

obj.classid = \; }

return obj; }

//转换单点坐标 function CoordConvert(x, y) { var sgworld = CreateSGWorld(); var tCoordServices = sgworld.CoordServices; //WKT格式坐标系:Beijing54 var sToCoordSystem = \

1954\\\

1954\\\4532925199433]],PROJECTION[\\\00000.0000000000],PARAMETER[\\\_Meridian\\\ETER[\\\3-Degree,GK Zone 39N,Beijing 1954,METERS\\\;

var ToCoordSystem = tCoordServices.CreateCoordinateSystem(sToCoordSystem); //EPSG格式坐标系:WGS84

var fromCoordSystem = tCoordServices.CreateCoordinateSystem(\); fromCoordSystem.InitFromEPSG(4326);

var point= tCoordServices.Reproject(fromCoordSystem, ToCoordSystem, x, y); confirm(\ + x + \ + y + \ Beijing54:\ + point.X + \ \ + point.Y); }

4.6 ICreator6

ICreator6接口负责在工程中创建对象。它由创建不同对象的方法组成。客户端可以利用返回的接口进一步控制对象(例如,改变对象位置或者颜色)。

通过Icreator6创建的每个对象在TE Pro中都有唯一标识ID(IterraExplorerObject6.ID属性)。客户端可以使用ID利用Icreator6接口的GetObject()方得到对象接口。客户端可以通过两种方式获得ID:

1. 通过客户端创建对象,在释放对象之前保存对象ID。 2. 通过遍历信息树,将ItemID转换为objectID。

方法 GeometryCreator Create3DArrow Create3DPolygon CreateArc CreateArrow CreateBox CreateBuilding CreateCircle CreateColor CreateCone CreateCylinder CreateDynamicObject CreateElevationLayer CreateEllipse CreateFeatureLayer CreateFromStream CreateHoleOnTerrain CreateImageLabel CreateImageryLayer CreateLabel CreateLabelStyle CreateLocation CreateLocationHere CreateMessage CreateModel CreateNewFeatureLayer CreatePointCloudModel IGeometryCreator 包含创建几何体对象的方法。 创建ITerrain3DArrow6, 表示三维窗口中的三维箭头。 创建 ITerrain3DPolygon6, 表示三维窗口中三维多边形 创建 ITerrainArc6,表示三维窗口中的弧。 创建ITerrainArrow6, 表示三维窗口中的二维箭头。 创建ITerrain3DRectBase6,表示三维窗口中的盒子。 创建ITerrainBuilding6, 表示三维窗口中的建筑物。 创建ITerrainRegularPolygon6, 表示三维窗口中的环。 创建IColor6, 表示由RGB和Alpha自定义的颜色。 创建ITerrain3DRegBase6,表示三维窗口中的圆锥体。 创建ITerrain3DRegBase6, 表示三维窗口中的圆柱体。 创建ITerrainDynamicObject6, 表示三维窗口中的动态对象。 创建ITerrainRasterLayer6, 表示三维窗口中的高程图层。 创建ITerrainEllipse6, 表示三维窗口中的椭圆。 创建ILayer6, 表示三维窗口中的特征图层。 创建ITerraExplorerObject6, 表示流图层。 创建ITerrainHole6,表示三维窗口中在地形上创建的洞对象。 创建ITerrainImageLabel6 表示三维窗口中的图像标签。 创建ITerrainRasterLayer6, 表示三维窗口中的影像图层。 创建ITerrainLabel6, 表示三维窗口中的标签。 创建ILabelStyle6, 为本文和图片标签定义了标签样式。 创建ITerrainLocation6, 表示三维窗口中的兴趣点。 创建ITerrainLocation6, 表示当前摄像机的位置。 创建 ITerraExplorerMessage6,表示在容器中显示的信息对象。 创建ITerrainModel6,表示模型对象,从文件直接导入。 创建 ILayer6, 表示创建一个新的特征图层。 创建ITerrainPointCloudModel6,表示点云图层,从文件直接导入。

CreatePolygon CreatePolygonFromArray CreatePolyline CreatePolylineFromArray CreatePopupMessage CreatePosition CreatePresentation CreatePyramid CreateRectangle CreateRegularPolygon CreateRouteWaypoint CreateSphere CreateTerrainModifier CreateTextLabel CreateTreeHotlink CreateVideoOnTerrain DeleteObject GetObject 创建 ITerrainPolygon6。 创建ITerrainPolygon6,表示由点组成的多边形。 创建IerrainPolyline6, 表示三维窗口中的线。 创建ITerrainPolyline6, 表示由点组成的线。 创建IPopupMessage6, 表示浮动浏览器或弹出窗口显示的信息。 创建IPosition6, 表示坐标位置。 创建 IPresentation6, 表示漫游路径。 创建 ITerrain3DRectBase6,表示三维窗口中的金字塔。 创建ITerrainRectangle6, 表示三维窗口中的矩形。 创建ITerrainRegularPolygon6,表示三维窗口中的规则多边形。 创建IRouteWaypoint6,表示创建的路径点。 创建ITerrainSphere6, 表示创建的球体。 创建ITerrainModifier6,表示编辑地形多边形。 创建ITerrainLabel6,表示创建的标签。 创建ITreeHotlink6 ,表示创建的热链接。 创建ITerrainVideo6, 表示依附在地形上的视频。 删除地形中的一个对象。 根据ObjectID返回对象。 代码示例: 【C#】 //创建圆 private void CreateCircle() { string tMsg = String.Empty; IPosition6 cPos = null; IColor6 cFillColor = null; ITerrainRegularPolygon6 cCircle = null; ITerraExplorerMessage6 cMessage = null; try { SGWorld sgworld = new SGWorld();

//创建位置

double dXCoord = -122.49460; double dYCoord = 37.78816; double dAltitude = 100.0;

AltitudeTypeCode eAltitudeTypeCode =

AltitudeTypeCode.ATC_TERRAIN_RELATIVE;

double dYaw = 0.0; double dPitch = 0.0; double dRoll = 0.0;

double dDistance = 5000;

cPos = sgworld.Creator.CreatePosition(dXCoord, dYCoord, dAltitude,

eAltitudeTypeCode, dYaw, dPitch, dRoll, dDistance);

//创建颜色 int nRed = 0; int nGreen = 255; int nBlue = 0;

int nAlpha = 0x7F; // 50% 透明度 cFillColor = sgworld.Creator.CreateColor(nRed, nGreen, nBlue, nAlpha);

uint nLineColor = 0xFFFF0000;

double dCircleRadius = 200; // 单位米 //创建圆

cCircle = sgworld.Creator.CreateCircle(cPos, dCircleRadius, nLineColor, FillColor,

0, \);

// 创建信息

MsgClient6 eMsgClient = MsgClient6.MC_POPUP; string tMessage = \; MsgType eMsgType = MsgType.TYPE_TEXT; bool bIsBringToFront = true;

cMessage = sgworld.Creator.CreateMessage(eMsgClient, tMessage, eMsgType,bIsBringToFront);

//圆添加信息 cCircle.Message.MessageID = cMessage.ID;

IPosition6 cFlyToPos = cPos.Copy(); cFlyToPos.Pitch = -89.0; sgworld.Navigate.FlyTo(cFlyToPos, ActionCode.AC_FLYTO); }

catch (Exception ex) {

tMsg = String.Format(\程序异常:{0}\, ex.Message); MessageBox.Show(tMsg); } }

【JavaScript】

function CreateSGWorld() {

obj = document.getElementById(\); if (obj == null) {

obj = document.createElement('object');

document.body.appendChild(obj);

obj.id = \; obj.name = \;

obj.classid = \; }

return obj; }

function CreatePolygon2() { try {

var sgworld = CreateSGWorld();

//创建点数组,x,y,z

var cVerticesArray = new Array(

-122.415025, 37.76059, 10, -122.415868, 37.760546, 11, -122.415922, 37.761244, 12, -122.415592, 37.761254, 13, -122.415557, 37.760973, 14, -122.415081, 37.76099, 15 );

// 创建环

var cRing = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(cVerticesArray); //创建多边形几何体 var cPolygonGeometry = sgworld.Creator.GeometryCreator.CreatePolygonGeometry(cRing, null);

var nLineColor = 0xFF00FF00; var nFillColor = 0x7FFF0000; var eAltitudeTypeCode = 0; //AltitudeTypeCode.ATC_TERRAIN_RELATIVE; //创建多边形

var cPolygon = sgworld.Creator.CreatePolygon(cPolygonGeometry, nLineColor, nFillColor, eAltitudeTypeCode, 0, \); //飞到多边形

var cFlyToPos = cPolygon.Position.Copy(); cFlyToPos.Pitch = -89.0;

sgworld.Navigate.FlyTo(cFlyToPos); }

catch (e) {

alert(\ + e.description); } }

4.7 IDateTime6

IDateTime接口可以提供相关功能的日期和时间信息。接口公开了控制时间和日期,时间模式和时间范围的属性。该接口也可以进行时区设置,控制太阳的显示。参数改变可以作用于当前工程状态,但不会保存到FLY文件中。为了将改变保存到工程中,需要使用IProject6.Settings。

属性 Current DisplaySun FixedLocalTime TimeRangeEnd TimeRangeStart TimeZoneDisplayName TimeZoomKey TimeZoneMode TimeZoneXML 方法 SetMode 表示当前使用的全局日期和时间。 表示是否将太阳作为光源。 基于一个特定选择的时间设置照射在地形的光线。 表示日期和时间范围结束的时间点。 表示日期和时间范围开始的时间点。 当前时区的描述,例如,“(GMT-09:00) Alaska“。 当前时区的键值,例如,“Alaska Standard Time“。 定义目前的时区。 XML定义了操作系统中可使用的时区。 设置日期和时间模式。 代码示例: 【C#】 //显示工程当前时区 private void GetTimeZoneDisplayName() { string TimeZoneDisplayName = sgworld.DateTime.TimeZoneDisplayName; MessageBox.Show(TimeZoneDisplayName); } 【JavaScript】 //显示工程当前时区 function GetTimeZoneDisplayName()

{

var TimeZoneDisplayName = sgworld.DateTime.TimeZoneDisplayName;

confirm(TimeZoneDisplayName);

}

4.8 INavigate6

INavigate6接口允许你控制摄像机的位置、方向和速度。你也可以设置摄像机如何接近指定对象,控制缩放操作。

属性 FieldOfView Speed 方法 FlyThrough FlyTo GetPosition JumpTo SetPosition Stop ZoomIn ZoomOut ZoomTo 返回或设置摄像机视域范围,单位为度。 返回或设置摄像机接近对象的速度。 保留。目前不用。 摄像机飞到兴趣点。 返回摄像机当前位置和方向。 摄像机直接跳到兴趣点。 设置摄像机的位置和方向。 停止摄像机的运动。 摄像机向前运动,靠近兴趣点。 摄像机向后运动,远离兴趣点。 摄像机运动到距离地面的指定位置。 UndergroundMode 返回或设置地下导航模式的开关,这种方式允许探索地下。

代码示例: 【C#】 // 设置摄像机的位置 private void SetCaraPos() { IPosition6 CaraPos = sgworld.Creator.CreatePosition(118.334, 50.804, 5259726.86, AltitudeTypeCode.ATC_TERRAIN_RELATIVE, 354.826, 270, 0, 0); sgworld.Navigate.SetPosition(CaraPos); } 【JavaScript】 //跳到兴趣点

function JumpTo() {

var Pos =

sgworld.Creator.CreatePosition(118.334,50.804,5259726.86,2,354.826,270,0,0 );

sgworld.Navigate.JumpTo(Pos); }

4.9 IProject6

IProject6接口可以访问工程设置,提供打开、保存工程等基本方法。

属性 FileVersion Name Settings 方法 Close Get_Settings Open Save SaveAs Set_Settings 返回ITEVersionInfo6,表示当前TerraExplorer的版本。 返回当前加载的FLY文件名称。 定义FLY文件工程设置中指定参数的值。C#通过get_ Settings和set_Settings方法实现该属性。 关闭FLY文件或地形数据库。 返回FLY文件工程设置中指定参数的值。这个方法只在C#中公开。 打开一个FLY文件或地形数据库。 保存当前项目为FLY文件。 用一个指定名称将工程保存为FLY文件。 定义FLY文件工程设置中指定参数的值。这个方法只在C#中公开。

代码示例: 【C#】 //打开 fly文件 private void OpenProject() { String tProjectUrl =\; string bIsAsync = false; string tUser = String.Empty; string tPassword = String.Empty; try { SGWorld sgworld = new SGWorld(); sgworld.Project.Open(tProjectUrl,bIsAsync, tUser, tPassword); }

catch (Exception ex) {

MessageBox.Show(ex.Message); }

}

【JavaScript】

function CreateSGWorld() {

obj = document.getElementById(\); if (obj == null) {

obj = document.createElement('object');

document.body.appendChild(obj);

obj.id = \; obj.name = \;

obj.classid = \; }

return obj; }

//打开 fly文件

function OpenProject()

{

var tProjectUrl =\; var bIsAsync = false; var tUser = String.Empty; var tPassword = String.Empty; try { Var sgworld = CreateSGWorld(); sgworld.Project.Open(tProjectUrl,bIsAsync, tUser, tPassword); } catch (Exception ex) { MessageBox.Show(ex.Message); } 4.10 IProjectTree6 IProjectTree6接口可以操作信息树,包括管理组、项目和图层。 属性 HiddenGroupID HiddenGroupName 方法 CreateGroup DeleteItem EditItem EditItems EnableRedraw EndEdit ExpandGroup FindItem 保留。目前不用 保留。目前不用。 创建信息树中的组。 删除树中的项目。 (如果项目是地形对象,则将对象从地形数据中删除。 打开属性编辑面板。 打开属性编辑面板,可以编辑多个项目。 是否刷新信息树。 终止编辑项目模式。 展开或折叠组。 使用路径查找项目。 CreateLockedGroup 以锁定方式创建组。 用户不能查看锁定组中的内容。 GetActivationCode 返回设置到指定组的运动状态(飞到,跳到等)。

GetClientData GetGroupEndTime 返回描述组的属性数据的文本字符串。在应用程序中,这个信息是可获得的。 返回组的终止日期和时间。 GetGroupLocation 返回指定组的位置。 GetGroupStartTime 返回组的开始时间和日期。 GetItemName GetLayer GetNextItem GetObject GetVisibility IsGroup IsLayer IsLocked LoadFlyLayer LoadKmlLayer LockGroup RenameGroup SaveAsFly SaveAsKml SelectItem SetClientData SetGroupEndTime 利用ItemID返回项目的名称。 基于ItemID返回Ilayer6接口对象。 返回有指定关系的树项目,例如使用ItemID标识的项目。 返回基于派生的IterraExplorerObject接口的对象接口。 返回信息树中项目的可见状态。 定义信息树中的项目是否是一个组。 定义一个信息树项目是否是一个特征图层。 定义组是否被锁。 加载FLY文件到当前工程,包括文件中的所有对象(位置,路径,超链接) 加载KML文件到当前工程。 将组设置为锁状态,当组被锁后,TE Viewer用户不能展开组,查看组包含的内容。 重命名工程中的组名称。 将指定工程保存为Fly文件。 将指定工程保存为KML文件。 选择信息树中的一个项目。 在组的全局命名空间存储文本字符串。 定义组不可见的日期和时间。 GetTerraObjectID 使用ItemID检索实际对象的ObjectID。 SetActivationCode 定义点击被锁组图标时默认激活执行的操作。 SetGroupLocation 对指定组定义位置参数。 SetGroupStartTime 定义组开始可见的日期和时间。 SetParent SetVisibility ShowSubTree SortGroup 将项目移动到不同的组,并返回项目新ItemID。 设置信息树中的项目是否可见。 保留。 根据排序类型将组中的项目排序。 代码示例: 【C#】

//创建组

private void CreateGroup()

{

IProjectTree6 tProjectTree = sgworld.ProjectTree; tProjectTree.CreateGroup(\临时组\, 0);

int itemID = tProjectTree.FindItem(\临时组\);

string objectID = tProjectTree.GetTerraObjectID(itemID);

}

【JavaScript】

//创建组

function CreateGroup(GroupName, ParentGroupID) {

sgworld .ProjectTree.CreateGroup(GroupName, ParentGroupID);

}

4.11 ITerrain6

ITerrain6接口可以获得地形的相关信息,如mpt最佳显示数据块大小,mpt坐标范围、透明度等。 属性 BestLevelWidth Bottom CoordinateSystem Description Left Levels Name Opacity Right StreamQuality Top 方法 GetGroundHeightInfo

返回最佳地形块宽度(米)。每块是256*256像素。 返回地形数据库右下角Y坐标值。 返回IcoordinateSystem6,表示MPT的坐标系统。 返回用户自定义MPT描述信息。 返回地形数据库左上角X坐标值。 返回影像的分辨率级别,当摄像机接近地面时该值可用于提高视觉质量。 返回本地或远程MPT文件的用户自定义描述。 返回或设置地形的非透明度。 返回地形数据库右下角的X坐标值。 返回流质量等级。 返回地形数据库左上角的Y坐标值。 基于给定的准确等级返回地形上指定坐标的高度。 代码示例: 【C#】 //获取mpt信息 private void GetMptInfo() {

ITerrain6 tTerrain=sgworld .Terrain ;

MessageBox.Show(@\最佳显示数据块大小:\ + tTerrain.BestLevelWidth.ToString() + \坐标范围:\ + tTerrain.Left + \ + tTerrain.Right + \坐标范围:\ + tTerrain.Top + \ + tTerrain.Bottom + \描述信息:\ + tTerrain.Description + \影像级别\ + tTerrain.Levels + \名称\ + tTerrain.Name +

\透明度\ + tTerrain.Opacity +

\流\ + tTerrain.StreamQuality.ToString());

}

【JavaScript】 //获取mpt信息

function CreateMPTInfo() {

Var tTerrain=sgworld.Terrain;

confirm(\最佳显示数据块大小:\ + tTerrain.BestLevelWidth +\ +

\坐标范围:\ + tTerrain.Left +\ + tTerrain.Right +\+ \坐标范围:\ + tTerrain.Top + \ + tTerrain.Bottom +\+ \描述信息:\ + tTerrain.Description +\+ \影像级别:\ + tTerrain.Levels +\+ \名称:\ + tTerrain.Name +\+ \透明度¨¨:\ + tTerrain.Opacity +\+ \流:\ + tTerrain.StreamQuality); } 4.12 ITEVersion6 ITEVersionInfo6接口可以获得TE的版本信息。 属性 Build Freeze Major Minor Type

返回版本号中的第三个数字。 返回版本号括弧中的数字。 返回版本号中的第一数字。 返回版本号中的第二个数字。 返回使用的TerraExplorer家族的应用程序类型:TerraExplorer Pro, TerraExplorer Plus或者是TerraExplorer Viewer。 代码示例: 【C#】 //获取版本信息 private void GetProjectVersion() { ITEVersionInfo6 tVersion = sgworld.Project.FileVersion;

MessageBox.Show(tVersion.Type + \ + tVersion.Major + \ + tVersion.Minor + \ +

tVersion.Build);

}

【JavaScript】 //获取版本信息

function GetVersionInfo() {

Var tVersion=sgworld.Version;

confirm( tVersion.Type + \ + tVersion.Major + \ + tVersion.Minor + \ +

tVersion.Build);

}

4.13 IWindow6

IWindow6接口包含所有与三维窗口互动的相关功能,例如快照,查询对象尺寸和像素信息。

属性 Rect 方法 CenterPixelToWorld GetControls GetInputMode GetMouseInfo GetPopupByCaption GetSnapShot HideMessageBarText PixelFromWorld PixelToWorld RomovePopup IscreenRect6表示SGWorld窗口的大小和位置。 返回窗口中心点真实世界坐标值。 返回当前显示的导航控制方式。 返回当前鼠标输入模式。 返回鼠标点位置信息。 返回指定标题弹出窗口的属性。 返回窗口的快照。 隐藏信息栏中的信息。 返回真实世界坐标值的像素坐标。 返回指定像素的真实世界坐标值。 移除弹出窗口。 RemovePopupByCaption 根据标题删除弹出窗口。 SetHUDLayer 以图形方式显示一个完整的HUD图层。 SetInputMode ShowControls ShowMessageBarText ShowPopup 设置鼠标输入模式。 在三维窗口显示导航控制和(或)图形和纹理信息。 在信息栏中显示的文本信息。 显示弹出窗口。

代码示例: 【C#】 //保存快照为jpg文件 private void GetSnapshot()

{

tWindow=sgworld.Window;

//快照默认保存路径

string snapShotPath= tWindow.GetSnapShot(true, 0, 0, \JPeg75\,0);

MessageBox.Show(snapShotPath );

}

【JavaScript】

//保存快照为bmp文件

function GetSnapShot() {

var tWindow=sgworld.Window;

//快照默认保存路径

var shapShotPath = tWindow.GetSnapShot(true, 0, 0, \, 0);

confirm(shapShotPath);

}

======================================================= 东方道迩Skyline技术支持部

电话:010-62604200

Skyline业务部网站:http://www.skysymbol.com 技术支持邮箱 :skyline@east-dawn.com.cn 技 术 论 坛:http://www.skylinesoft-cn.com

=======================================================

本文来源:https://www.bwwdw.com/article/pzot.html

Top