项目树其实是图层的组织结构,获取图层列表对于我们很重要,有了图层列表我们就可以自定义图层结构比如按区划分图层、按功能、按用途等任意级别的层次结构,可以对图层进行控制比如显示(隐藏)、定位等,那么如何在skyline中获取图层呢?
1.获取图层方法
skyline中提供了ProjectTree接口,该接口实现了项目树的查找、编辑、保存等功能,遍历主要用到下面一个方法:
GetNextItem(ID,CODE):获取一个节点的子节点,根据code的类型可以获取什么样的节点,其中code=11为第一个子节点,code=13为兄弟节点;
2.程序实现
程序实现了图层的缓存,图层树的缓存,用于查找图层、新建图层树等。
- /*
- 获取图层树
- */
- var ProjectTree = {
- playersName:[],
- playersInfo: {},
- pLayerTree:[],//图层树
- /*
- 遍历获取图层树
- container:图层树的容器,例如div,不设置此参数则不加载到指定容器中
- */
- loadProjectTree: function (container) {
- this.playersInfo = {};
- var sgworld = sgworld65;
- //18:The root of the Tree.树的根节点
- var proTree = sgworld.ProjectTree;
- var rootid = proTree.RootID;
- var rootID = proTree.GetNextItem(rootid, 18);
- this.bulidTreeFirst(sgworld, rootID);
- <span style="white-space:pre"> </span>//TODO:若container(div)在这里创建图层树
- },
- bulidTreeFirst: function (sgworld65, current)
- {
- while (current) {
- var fchild = { 'name': '', 'child': [], 'leaf': true };
- //获取树节点的名称
- var itemName = sgworld65.ProjectTree.GetItemName(current);
- //判断子项是否是一个组(为什么判断是否为组呢?因为skyline的数据结构是这样组织的,结构如下:
- //子项-组-图层等)
- if (sgworld65.ProjectTree.IsGroup(current)) {
- fchild.name = itemName;
- if (sgworld65.ProjectTree.IsLayer(current)) {//叶子节点
- var name = sgworld65.ProjectTree.GetItemName(current);
- var layer = sgworld65.ProjectTree.getLayer(current);
- this.playersName.push(name);
- this.playersInfo[name] = layer;
- //fchild.leaf = true;
- fchild.name = name;
- }
- else {//递归遍历
- //获取改组的第一个item
- //
- /*JavaScript
- GetNextItem(ID,Code)
- code=11:第一个item
- */
- fchild.leaf = false;
- //var schild = { 'name': '', 'child': [], 'leaf': true };
- //fchild.child.push(schild);
- var childItem = sgworld65.ProjectTree.GetNextItem(current, 11);
- this.buildTreeChild(sgworld65, childItem, fchild);
- }
- this.pLayerTree.push(fchild);
- }
- //13:获取其兄弟节点
- current = sgworld65.ProjectTree.GetNextItem(current, 13);
- }
- var aa = this.pLayerTree;
- },
- buildTreeChild: function (sgworld65,current,parent) {
- try
- {
- while (current) {
- var fchild = {'name':'','child':[],'leaf':true};
- //获取树节点的名称
- var itemName = sgworld65.ProjectTree.GetItemName(current);
- //判断子项是否是一个组(为什么判断是否为组呢?因为skyline的数据结构是这样组织的,结构如下:
- //子项-组-图层等)
- if (sgworld65.ProjectTree.IsGroup(current)) {
- fchild.name = itemName;
- if (sgworld65.ProjectTree.IsLayer(current)) {//叶子节点
- var name = sgworld65.ProjectTree.GetItemName(current);
- var layer = sgworld65.ProjectTree.getLayer(current);
- this.playersName.push(name);
- this.playersInfo[name] = layer;
- fchild.name = name;
- //fchild.leaf = true;
- }
- else {//递归遍历
- //获取改组的第一个item
- //
- /*JavaScript
- GetNextItem(ID,Code)
- code=11:第一个item
- */
- fchild.leaf = false;
- //var schild = { 'name': '', 'child': [], 'leaf': true };
- //fchild.child.push(schild);
- //this.pLayerTree.push(fchild);
- var childItem = sgworld65.ProjectTree.GetNextItem(current, 11);
- this.buildTreeChild(sgworld65, childItem, fchild);
- }
- parent.child.push(fchild);
- }
- //13:获取其兄弟节点
- current = sgworld65.ProjectTree.GetNextItem(current, 13);
- }
- }
- catch (e) {
- alert(e.message);
- }
- }
- }
- var sgworld65;
- var sgworld;
- function loadFile() {
- var flyPath = "D://开发软件//Skyline//data//mine3D.fly"
- var flyServerPath = "http://www.skylineglobe.com/SkylineGlobeLayers/SG_ExternalFlys/skylineglobe.fly";
- sgworld65 = document.getElementById('SGWorld65');
- sgworld65.attachEvent("OnLoadFinished", onProjectLoadFinished);
- sgworld65.Project.Open(flyServerPath);
- sgworld = sgworld65;
- }
- function onProjectLoadFinished() {
- ProjectTree.loadProjectTree();
- }
结语:到目前学习了skyline的开发过程、导航、创建实体等,重要的(空间,条件)查询、交互还没有写到,后面利用空闲时间在进行摸索,任重而道远。