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!