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!
浙公网安备 33010602011771号