返回顶部

1. 漫游问题

u  问题描述

所用产品版本:

TerraExplorer Pro version 5.1.1.f9

具体实现方法:

function cruise(){

                ObjName = "漫游路线\\新苑社区漫游"

                if(ObjName!=null && ObjName!=""){

               

                                globe.root.parentNode().setVisibility(false)

                                var node = globe.root.parentNode().selectSingleNode(ObjName);

                                alert(node.getName());//到此显示正常,可以得到具体node名称

                                if (node != null){

                                    node.setVisibility(true);

                                    node.Play();//提示此方法不被支持

                                }else{

                                                alert("没有定位信息!");

                                }

}

}

u  解决方法

请参考帮助文档中node.innerObj这个属性说明(node.innerObj.Play();InteractiveTutorial.rar附件是一些示例代码。

2. 绘制椭圆问题

u  问题描述

如何在OnFrame事件中给ellipse对象两个半径赋值,

ellipse.Radius = ?;ellipse.Radius2 = ?;

可以实现和skylineV6中一样椭圆会随着鼠标的移动而变化

u  解决方法

OnFrame事件中获取鼠标的坐标信息,转换成空间坐标,再通过GetAimingAnglesGetDistance方法计算鼠标点跟Ellipse对象中心点的位置关系,就可以了。

// 鼠标移动事件

function onFrame() {

        // 根据鼠标坐标获得经纬度

        var position = getSgworldPosition();

            // 获取两点之间相对位置

            var aimingPosition = sgworld.coordservices.GetAimingAngles(ellipse.position, position);

            // 相对角度

            var aimingYaw = aimingPosition.Yaw;

            // 获取两点之间距离

            var distance = sgworld.coordservices.GetDistance(ellipse.position.X, ellipse.position.Y, position.X, position.Y);

            // 获取当前偏离角度

            var yaw = sgworld.Navigate.GetPosition(2).Yaw;

            // 两个角度差转为弧度

            var angleYaw = ((aimingYaw - yaw) * Math.PI) / 180;

            // 求椭圆的长轴和短轴

            ellipse.Radius = distance * Math.sin(angleYaw);

            ellipse.Radius2 = distance * Math.cos(angleYaw);

         

}

3. 绘图问题

u  问题描述

问题是这样的,当我用接口画线的时侯,线一下就出来了,有没有什么办法让画线的过程显示出来,比如点A 到点B 的线段,在绘制的时侯, 是从A出发,一点一点画到 B,就是线前进的动态效果。

u  解决方法

可以参考TerraExplorer Pro\Tools\FreeHand\FreeHand.htmlToolsEditor.html,这里显现了你说的那个效果。 利用画线的接口创建线对象,再通过在OnLButtonDown事件中动态地给这个线对象增加节点就可以了。

4. 关于地图导入的问题

u  问题描述

怎样把ArcGIS的地图信息导入Explorer Pro中。ArcGIS的文件都是.dbf.prj

.shp.shx等格式的,一些属性信息存储在这些文件中,我需要调用这些信息并在地图上显示出来。

u  解决方法

一、加载shp文件,在fly中直接加载就可以了。

二、通过getlayer方法找到加载的shp图层。为Ilayer61

1 使用ILayer61FeatureGroups属性得到IFeatureGroups61

2 通过判断点/线/面获得的IFeatureGroup61

3 通过索引获得 IFeature61

4 通过FeatureAttributes  获得IFeatureAttributes61

5 调用GetFeatureAttribute方法获得属性值
请参考示例代码
IFeatureGroups61  FeatureGroups = layer.FeatureGroups;
IFeatureGroup61   FeatureGroup=FeatureGroups .Point;//

IFeature61 Feature = FeatureGroup[i];

IFeatureAttributes61 FeatureAttributes = Feature .FeatureAttributes ;
string  ss= FeatureAttributes . GetFeatureAttribute(
“”).Value;参数为字段名称。

5. 二维三维联动

u  问题描述

在调用这个函数 vbPlaneGetPosition(pos);的时候老是报错,溢出!我要达到二维三维联动,二维动触发onMapExtentChange事件触发flyto或者setPosition函数,-skyline动触发 Onframe但是Onframe中如何加入条件来区分四是二维先动还是三维先动?

u  解决方法

Index.html是代码,pro可以直接使用control+0打开一个fly文件。

6. Command的几个问题

u  问题描述

问题一:现在version 升级到6.1以后,在API那块也都成了6.1的版本,我看了下TerraExplorer Programmer Guide,需要对API 6.0 client 升级到6.1,这里有两步,第二部我没有弄清楚,所以也不清楚是否已经成功升级到了6.1.

问题二:现在我要做地表面积量算功能,总结出了三个方法,

1)直接用Icommand中的现成的函数,SGWorld.Command.Excute(1037,0);我想找具体的地表面积量算函数,没有找到,只有这个,所以不知道是不是这个。但直接用这个,出来的效果还是version 6.0中的投影面积量算,所以我在这里不太清楚是怎么回事,为什么没有出来Pro中的效果呢,还是我的API没有升级好或者函数写的不对。如果可以直接出来pro中的效果,那个对话框中可不可以修改,最直接的就是把里面的英文改成中文。

2)直接用Icommand中的现成的函数,SGWorld.Command.Excute(1012,5);,直接用这个可以调出来话多边形的对话框,但之后我不知道怎么获得PolygonGeometry属性,也不知道怎么获得其他属性比如 linecolorfillcolor并手动用代码修改这些参数的值,所以我觉得这样是不是不对呢,因为那个create中的createpolygon函数都是已知了那些参数以后,才能创建polygon,不知道这个反过来是否行的通,如果可以,怎么写呢?得到Geometry变量以后,我就可以直接用MeasureTerrainSurface(PiGeometry,SampleInterval);这个函数直接得出所化多边形地表面积。

3)直接在屏幕上画多边形,捕捉到各个定点,组成一个数组,然后创建一个PolygonGeometry,然后再计算多边形地表面积。不过这个可能就写代码就比较多。

u  解决方法

1.command ID1165。但是在ICommand61的列表中确实没有找到实现表面积量算的对应方法,这个我已经反馈给Skyline公司。

2.通过SGWorld.Command.Excute(1012,5)方法创建的多边形,你可以通过ProjectTree里面的FindItem或者GetNextItem方法找到这个多边形对象,进而得到它的Geometry

3.我给你直接在屏幕上画多边形的代码;

7. 地形修改对象

u  问题描述

您好,现在的情形这样的

1)我在TerraExplorer pro中创建了一个修改地形的对象,保存在fly文件中,我想在代码中通过 sgworld.Analysis.CalculateVolume(ID,10);计算这个对象的体积,我的疑问是:这个对象的ID如何获得?

2)当我通过代码创建地形修改对象时,有个参数geometry,这个参数如何设置?

3)当创建好对象后,修改部分的材质通过哪个对象修改呢?

4)我得到了ITerraExplorerObject6 对象,可是通过sgworld.Analysis.CalculateVolume

(objITerraExplorerObject6, 0.5);计算体积的时候总是提示:值不在预期范围内。以下是我的代码,走到红色部分的时候提示值不在预期范围内

    SGWorld sgworld = new SGWorld();
            int mID = sgworld.ProjectTree.FindItem("
\\Modify");
            string objectID= sgworld.ProjectTree.GetTerraObjectID(mID);
            ITerraExplorerObject6 objITerraExplorerObject6 = sgworld.Creator.GetObject(objectID);          
            IVolumeAnalysisInfo6 objIVolumeAnalysisInfo6 = sgworld.Analysis.CalculateVolume(objITerraExplorerObject6, 0.5);
            string volumn = "
体积是" + objIVolumeAnalysisInfo6.AddedCubicMeters;
            this.label2.Text = volumn.ToString();

5)我的fly文件中有多个地形修改对象,我要计算这几个地形修改对象的体积,我通过什么途径把这些对象罗列出来呢

u  解决方法

1)对象的ID,指的是objectid,GetTerraObjectID方法可以获得objectID.

2)创建geometry对象的方法,请参阅帮助文档中的 IGeometryCreator.

3)修改对象材质,请参阅帮助文档中的 IFillStyle6.

4CalculateVolume  第一个参数是arrobjID

5)可以使用GetNextItem方法遍历树 ,判断对象类型是否是ITerrainModifier6

8. 加载WFS使用API或者AxtiveX如何调用

u  问题描述

你好! 我是山海经纬公司开发人员,想请教一下:

1skyline加载WFS使用API或者AxtiveX如何调用?

2)请问如何编辑创建的对象?

3)那如果我创建了大量的createBox 对象,我只想修改其中的某一个对像的属性,请问(4)我如何获得这个对象,去修改他呢?

5)如何将对象加到指定的组?

u  解决方法

1//------------------------------------------------------------
//
加载矢量数据,根据服务器配置mystrxml参数 
//------------------------------------------------------------
function loadshp()
{   
    var xmlDom;
    var mystrxml = "<PlugData>"+
        "<PlugType>wfs</PlugType>"+
        "<LayerName>SDEYJ.K050_river_l-1028</LayerName>"+
        "<Server>http://192.168.6.32:8800/wfsconnector/com.esri.wfs.Esrimap?</Server>"+  //10.216.21.101:7001
        "<user>admin</user>"+
        "<password>admin</password>"+
        "<TableName></TableName>"+
        "<AttributesToLoad>SDEYJ.K050_river_l-1028.objid</AttributesToLoad>"+
        "<Feature>1</Feature><Annotation>1</Annotation>"+
        "<SaveItems></SaveItems>"+
        "<GroupKey>UTM</GroupKey>"+
        "<SysKey>UTM-48N</SysKey>"+
        "<DatumKey>WGS84</DatumKey>"+
        "<UnitKey>METERS</UnitKey>"+
        "<UseZValue></UseZValue>"+
        "<AltitudeUnit></AltitudeUnit>"+
        "<Reproject>1</Reproject>"+
        "<StreamedLayer>0</StreamedLayer>"+
        "</PlugData>";
    xmlDom = loadXML(mystrxml);
    var IInformationTree = TE.interface("IInformationTree5");
    // alert(xmlDom);
    var groupid = _$SGCreateGroup("
淹没分析");
    var mylayer = IInformationTree.CreateLayer("SDEYJ.K050_river_l-1028",xmlDom.xml,groupid);
    mylayer.Load();
    mylayer.SetVisibilityMinMax(0,3000);
}
function loadXML(xmlname)
{//
加载xml文件
    try
    {
        var xmlobject = null ;
        // convert the string to an XML object
        //
用于 IE 的代码:
        if (window.ActiveXObject)
        {
            var xmlobject =new ActiveXObject("Microsoft.XMLDOM");
            xmlobject.async="false";
            xmlobject.loadXML(xmlname);
        }
        //
用于 Mozilla, Firefox, Opera, 等浏览器的代码:
        else
        {
            var parser=new DOMParser();
            var xmlobject =parser.parseFromString(xmlstring,"text/xml");
        }
        return xmlobject ;
    }
    catch (e)
    {
        alert('error');
        return;
    }
}

2利用createbox方法创建的就是ITerrain3DRectBase6 对象,在帮助文档中可以看到该对象有很多属性,通过这些属性可以修改颜色,高度等。

3)在创建该对象时,请以名称区分这些对象,利用findItem方法可以获得某个对象的itemid,再利用getobject方法获得该对象。

4)您要实现的加入到某个组要用到SGWorld.rootSGNode等接口。

因为5版本的skylinescripting API 不太完善,您最好不要使用那种方式来做项目。最好使用COM API Example codes的示例代码那种方式来写。

9. IE9skyline的支持问题

u  问题描述

运行环境是PRO 6.1(1033)  + WIN7 + IE9.IE9中没有模型被加载,请验证。

u  解决方法

目前proIE9的兼容是有些问题,请不要使用IE9proIE9的兼容也正在改进中。

10. 怎样通过点击鼠标得到该模型的指针或者ID

u  问题描述

我想实现是通过点击鼠标事件,得到所点击该模型的当前参数,比如经度、维度、航向什么的,以信息提示或者对话框的形式展现出来。

我的问题就是怎样通过点击鼠标得到该模型的指针或者ID?

u  解决方法

使用GetMouseInfo()方法获得鼠标当前点击的位置。

使用PixelToWorld()方法可以得到IWorldPointInfo61类型的对象,里面有ObjectIDPosition属性。

11. 垂直距离测量和视域分析问题

u  问题描述

u  解决方法

1 .slopeHorizontal Elevation的关系:Tanslope = Elevation/Horizontal slope为第一个点到最后一个点的坡度角。

2 .关于怎么绘制垂直距离:您可以使用下列思路来实现。

  第一个点的x1 y 1 z1  第二个点的x2 y 2 z2。垂直距离绘制中,垂直的线为(x1y1z1)和(x1,y1,z2)的连线。

3 .视域分析

视域分析API需要已知两个点,类似于pro中的视域分析操作,具体可参照pro中的操作。

pts[0]为第一个点;pts[1]为第二个点。

                             viewerPosition = pts[0];

                            viewerPosition.Altitude = 2;

                            viewerPosition.Distance = tCoordServices.GetDistance(viewerPosition.X, viewerPosition.Y, pts[1].X, pts[1].Y);

                            IPosition6 angle = tCoordServices.GetAimingAngles(viewerPosition, pts[1]);

                            viewerPosition.Yaw = 360 - angle.Yaw;

viewerPosition.AltitudeType = AltitudeTypeCode.ATC_TERRAIN_RELATIVE;

                            tAnalysis.CreateViewshed(viewerPosition, 53, 2, 1, 0, null, null, 0, "视域分析");

12. 如何给创建对象的Message设置窗口大小

u  问题描述

我使用的创建方法:

var message = sgworld.Creator.CreateMessage(5, msgData, type, false);

如何给创建对象的Message设置窗口大小。

u  解决方法

 使用CreatePopupMessage()创建弹出框

IPopupMessage61 WidthHeight置宽度和高度

 

 

13. 捕获信息树事件

u  问题描述

如上图所示,左边的是我在模型上标记的地名。比如我想得到点击“甘溪”的事件,我用的js开发B/S系统。我怎样才能得到这个事件。我是想做一个点击地名后,不仅模型有相应的操作,而且还可以调出我自己的数据,

所以我想知道要得到这个事件,是不是需要设置什么属性,然后具体什么代码可以实现,最好附上示例代码。

u  解决方法

这边没有现成的示例代码,具体要用到的函数AttachEvent来连接OnProjectTreeAction事件。

C#

 

void OnProjectTreeAction(

      int ItemID,

      IAction6 Action)

第一个参数 是您要操作的对象的itemID。第二个参数是状态。您要实现的功能写在OnProjectTreeAction函数里面即可。

你可以先自己写一下,如有问题请进一步沟通。

14. 加载模型后,有些属性找不到

u  问题描述

加载模型后,有些属性找不到:

1Shadow :  model.shadow.Show 对象不支持此操作;

2Model Type : model.ModelType 始终为0 

3pro属性窗口中 Animation api没有提供;

4pro属性窗口中 Maintain Aspect Ration api没有提供;

(静态模型.bmp)

 

u  解决方法

 1 模型的Shadow属性(请确认是否已经创建):

    model.Shadow.CreateShadow();

     model.Shadow.Show=true;

2  model.ModelType 始终为0 为软件bug

3  ModelType为只读属性,所以不可以来设置,但是想设置为Animation 可以在创建模型的时候来设置。

4  Maintain Aspect Ration 属性来控制模型是否等比缩放。

   API中使用这四个属性来设置。如果想等比缩放请设置ScaleFactor。如果想沿某轴缩放,请分别设置ScaleX/Y/Z的值。

15. 如何遍历shp文件对象

u  问题描述

如何遍历shp文件内的对象呢? skyline有接口或方法吗?还是需要使用esri的接口?

u  解决方法

如果是遍历shp文件,就需要在信息树中遍历,IInformationTree.GetNextItem方法。

16. 流方式显示卡的问题

u  问题描述

当以流方式导入shp文件到skyline时,虽然只打开12个文件,但还是感觉有点卡。如果再填充颜色,就更卡了。你们在处理这个问题上有什么技巧和方法呢?shp数据主要是二调数据!

u  解决方法

你好,一般情况下,如果加载的面状要素,单个面边界节点过多会影响速度,比如加载美国各州地图,每个州的节点就特别少,加载特别快。 中国各省边界节点过多,为了使速度加快,需要对节点进行抽稀。是否是这种情况导致变慢?

在优化方面除了上述抽稀节点之外,还可以调节 Max. Streaming AltitudeSuggested Block WidthLite Objects这几个值看看效果。

17. 阴影分析

u  问题描述

我是一名从事skyline二次开发的技术人员,现在用.netcs框架下做一个阴影效果分析,但用到以下语句IObjectManager.SetObjectParam(ITerrainModel5.ID201true) 执行效率异常慢,而且有些模型还一直在执行等待着,我想请问一下这是什么原因。能否提供一个CS框架下的阴影分析的一些demo呢?

u  解决方法

同样的模型数据情况下,在TerrraExplorer Pro中执行阴影分析时(直接利用Pro里面的阴影分析工具)效率如何?

程序执行的时候,选择了多少模型进行分析,这些也是跟效率相关的。

SkylineV6版本中,三维模型对象增加了IShadow6,可以使用里面的CreateShadow方法创建阴影效果,很方便。

18. 分屏显示技术

u  问题描述

上周参加贵公司的培训,现在所做的项目中急需分屏显示技术,希望技术人员能给予一定的技术支持,提供点思路和demo

u  解决方法

程序的实现原理:在主程序中,启动两个分别嵌入Skyline控件的应用程序,分别加载各自对应的FLY文件,两个程序可以通过读写一配置文件来显示联动效果,其中一个为主,负责往配置文件中写信息,另一个程序为副,负责从配置文件中读取信息,配置文件中的信息可以包括:观察点的坐标、角度等;

也可以通过其他方式实现两个程序间的通信:

 C#开发实现方式:

1.1. 新建一个WinForm程序,里面嵌入一个Skyline的控件,用来加载FLY文件,生成一个EXE文件;

1.2.再新建一个WinForm程序,在需要调用多球对比的地方,调用前面生成的EXE或者调用多个前面的那种EXE文件;

这样就可以同时出现两个分别嵌有Skyline三维控件的系统界面了,就可以进一步联动了。

 public Process p22 = new Process();
     p22.StartInfo.FileName = Application.StartupPath + mbexe
    p22.Start();

19. 关于动态加载模型问题

u  问题描述

skyline研发的过程中,遇到点小问题,希望能帮助解答。

首先,我通过如下方法动态加载模型

        string modelPath = Application.StartupPath + @"\..\Data\DymaticModel\Model-Car\Untitled.xpl2";
                IPosition6 pos = sgworld.Creator.CreatePosition(a.Longitude, a.Latitude, a.Height, AltitudeTypeCode.ATC_ON_TERRAIN, 0, 0, 0, 0);
                double sacle = 10;
                ModelTypeCode modeltype = ModelTypeCode.MT_NORMAL;
                //int groupID = 0;

         ITerrainModel6 model= sgworld.Creator.CreateModel(pos, modelPath, sacle, modeltype, groupID, "");

        string strID1 = model.ID;

        加载完模型后,想通过点击窗口中的模型获取模型对象,代码如下:

       IWorldPointInfo6 pos = sgworld.Window.PixelToWorld(X, Y, WorldPointType.WPT_MODEL);
            string strID = pos.ObjectID;

结果发现对于同一个模型strID1strID2不相等。当采用单个模型做实验时,该值是相等的,但是当加的模型比较多的时候,大概几十个吧,模型大小大概在2.3M左右,这时系统速度明显不太顺畅,有的模型取消前面的勾时,3D窗口中的模型仍然可见,不知道是怎么回事,是不是还要刷新一下?也没有看到刷新3D窗口的接口。 而且,在上述情况下,所得到的strID1strID2的值是不一样的,strID1的值为"0_862","0_863","0_864"...,而strID2的值为"0_102","0_103","0_104"....

  但是只加载一个模型的时候,上述值是相等的。请问这是为什么?怎么样才到知道单击模型是选择的是哪个窗口?还有选择模型时能否像pro里面那样用黄色框框框住模型?

最后,还有一个问题就是想问一下,在动态加载比较多的模型的时候,怎么样提高系统的显示速度。(比如加载模型时有哪些参数怎么设合适点)。

u  解决方法

Skyline里面的ObjectID是一个唯一值,但这个值是可能发生变化的,尤其是在skyline中进行一些添加删除操作的时候,里面对象的ObjectID是会重新分配的;通过IProjectTree6EditItem可以实现pro里面那样用黄色框框框住模型

模型大小大概在2.3M左右,是单个模型的大小么?建议模型再导入skyline之前先进行优化处理,可以加载skyline安装目录中自带的模型和你们自己的模型对比测试下,skylin自带的模型都是优化过的;

批量操作对象的时候,有控制EnableRedraw属性了么?

大数据量的时候,可以考虑采用加载kml的方式来加载3dmodel

WinForm程序中也可以采用多线程。

另外,机器的显卡推荐最好是512M以上的独立显卡。

20. 无法获得模型的高程

u  问题描述

按照您提供的方法,获取到的高程值为地表的高程,无法获得模型的高程。获取点位置请看图示,为了方便比较,我把代码附上,请您看看是那里的问题?

 <script language="vbscript">      
 dim doubleScreenX,doubleScreenY,isOnScreen,doubleTerrainElevation
 dim CurrCursorX,CurrCursorH,CurrCursorY,CursorObjType,CursorObjectID
 sub getObjectID(TxtX,TxtY,TxtH)
  CursorObjType = 1
        globe.teCore.IRender.WorldToScreen TxtX,TxtH,TxtY,doubleScreenX,doubleScreenY,false,isOnScreen
        globe.teCore.IRender.ScreenToWorld doubleScreenX , doubleScreenY , 0, CurrCursorX,CurrCursorH,CurrCursorY, CursorObjectID
    end sub

</script>

<script type="text/javascript"> 

 getObjectID(116.350861, 39.905278, 0);
 alert("doubleScreenX :" + doubleScreenX  + "\n" +
    "doubleScreenY :" + doubleScreenY  + "\n" +
    "isOnScreen    :" + isOnScreen     + "\n" +
    " CurrCursorX  :" +  CurrCursorX   + "\n" +
    "CurrCursorH   :" + CurrCursorH    + "\n" +
    "CurrCursorY   :" + CurrCursorY    + "\n" +
    "CursorObjType :" + CursorObjType  + "\n" +
    "CursorObjectID:" + CursorObjectID + "\n");

</script>

//TerriaExplorer Pro中使用Information Query Tool 查询该点信息为116.350861, 39.905278, 46.081 Meters (-1.68 Meters AGL)

使用代码获得的数据为:

doubleScreenX :635.5487414488388
doubleScreenY :376.6145585766839
isOnScreen    :true
 CurrCursorX  :116.35095187833646
CurrCursorH   :47.75404357910156
CurrCursorY   :39.90502678342428
CursorObjType :1
CursorObjectID:

 

u  解决方法

关于获取模型高度的问题,下面是关键的几行代码(基于v6.0),经过测试可以获得模型高度。

<script type="text/javascript"> 

  //鼠标左击事件

 function OnLButtonUp(flags, x, y) {

              var worldPointInfo = tWindow.PixelToWorld(x, y, -1);
              var position = worldPointInfo.Position;

              alert(position.X + "    " + position.Y + "    " + position.Altitude);

                  

 }

</script>

关于如何获取模型表面点坐标值的问题,附件是TEP两个版本实现的示例代码,请查看,有问题直接给我打电话联系。

需要注意的几个地方:

1.模型要设置GroundObject属性为True

2. longObjectType要设置为  OBJ_TYPE_3DOBJECT= 1”

3. TEPV5中输出多个参数的方法要通过VBS来实现;而TEPV6则仅用Javascript即可实现;可以参考示例代码查看其区别。