skyline中遍历fly工程树

在skyline二次开发过程中,做空间分析总是要去读取工程中的shp图层。假设想获取工程树中“建筑物”图层,图层结构如下:

传统的方法是:

var itemId=SGWorld.ProjectTree.FindItem("图层\中模\建筑物");
var layer=SGWorld.ProjectTree.GetLayer(itemId);

这样有个坏处是,工程树配好了不能再改了。或者说一旦改fly文件的工程树结构了,就得改代码。否则就无法获取“建筑物“。这样有个想法是,在fly工程首次加载的时候,就遍历工程树,把所有的shp图层、以及图层在工程树的图层名存放在数组中。

代码如下:

//遍历工程树,将所有的layer图层、图层名都存放在数组中
    var players=new Array();
var playersName=new Array();
function BuildTreeRecursive(current) { SGWorld = TE.ISGWorld61(); try{ while (current > 0) { itemName = SGWorld.ProjectTree.GetItemName(current); if (itemName != "地形修改" && itemName != "位置" && itemName != "PresentationRoute") { if (SGWorld.ProjectTree.IsGroup(current)) { if (SGWorld.ProjectTree.IsLayer(current)) { var name = SGWorld.ProjectTree.GetItemName(current); var layer = SGWorld.ProjectTree.GetLayer(current); playersName[playersName.length] = name; players[players.length] = layer; } else { var childItem = SGWorld.ProjectTree.GetNextItem(current, 11);//CHILD – 11,The first child item of ItemID. TR.BuildTreeRecursive(childItem); } } } current = SGWorld.ProjectTree.GetNextItem(current, 13); } } catch (e) { alert(e)} }

 我们在上面的基础上再添加一个方法,就是根据图层名获取图层:

//下面是根据工程树中layer图层的名字获取layer
    function GetLayerByLayerGroupName(layerGroupName) {
        if (playersName.length>0) {
            for (i = 0; i < playersName.length; i++) {
                if (playersName[i] == layerGroupName)
                    return players[i];
            }
        }
        else { alert("图层名数组为空,请检查TR.BuildTreeRecursive()方法是否执行"); }
    };

这样的话,我们在空间分析时,要找建筑物图层,就可以调用上面的方法就可以了,如下:

var layerGroupName="建筑物";
var buildLayer=GetLayerByLayerGroupName(layerGroupName);

  上面返回的buildLayer就是建筑物图层。

欢迎关注:www.skylinecn.com!

原文地址:https://www.cnblogs.com/pengjw/p/3447531.html