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!
skyline中遍历fly工程树的更多相关文章
- Java中遍历Map集合的四种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- java 中遍历hashmap 和hashset 的方法
一.java中遍历hashmap: for (Map.Entry<String, Integer> entry : tempMap.entrySet()) { String ...
- 在 Django 模板中遍历复杂数据结构的关键是句点字符
在 Django 模板中遍历复杂数据结构的关键是句点字符 ( . ). 实例二 mysit/templates/myhtml2.html修改如下 <!DOCTYPE html> <h ...
- Freemarker中遍历List以及内置函数使用
在Freemarker应用中经常会遍历List获取需要的数据,并对需要的数据进行排序加工后呈现给用户. 那么在Freemarker中如何遍历List,并对List中数据进行适当的排序呢?一. Free ...
- asp.net中遍历界面上所有控件进行属性设置
* 使用方法: * 前台页面调用方法,重置: protected void Reset_Click(object sender, EventArgs e) { ...
- Java中遍历Map的几种方法
转自: http://blog.csdn.net/wzb56/article/details/7864911 方法分为两类: 一类是基于map的Entry:map.entrySet(); 一类是基 ...
- VC中遍历目标进程中的模块
VC中遍历目标进程中的模块 MFC代码win32 也可以用 在下面代码进行修改转换就可以了CString strModule; 可以换成 char* 但是MODULEENTRY32结构中的szModu ...
- Java中遍历Map对象的方法
方法一: 在for-each循环中使用entries来遍历 这是最常见的遍历方式,在需要获取key和value时使用. Map<Integer, Integer> map = new Ha ...
- java中遍历map对象的多种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...
随机推荐
- EL fmt标签
c:formate 表达式需要传入的对象为date
- win 7 下安装GIT(亲测有效)
我首先是百度到了这个网站:https://git-scm.com/download/win 当然由于外网访问速度的缓慢 可以直接在百度搜索下载自己对应的版本 这个网站上有下载链接,你可以根据你的系统选 ...
- System.Web.UI.WebControls.FileUpload.cs
ylbtech-System.Web.UI.WebControls.FileUpload.cs 1. 程序集 System.Web, Version=4.0.0.0, Culture=neutral, ...
- transient在java中的作用
java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. trans ...
- 《DSP using MATLAB》Problem 8.36
上代码: function [wpLP, wsLP, alpha] = lp2lpfre(wplp, wslp) % Band-edge frequency conversion from lowpa ...
- multiprocessing多进程(31-04)创建进程的两种方式
一个进程可以寄生多个线程. CPU核数与进程个数是统一的, 若进程多于核数,那么只有等待上一进程执行完才能被执行. ------------------第一种进程创建方式--------------- ...
- Python - 作为浅拷贝的list对象乘法
运行下面这段代码 # !/usr/bin/env python3 # -*- coding=utf-8 -*- temp_a = [[0]*2]*3 temp_b = [[0]*2 for i in ...
- wpf 定时器应用,在界面动态刷新时间
DispatcherTimer = new DispatcherTimer(); Timer.Tick += Timer_Tick; Timer.Interval = TimeSpan.FromSec ...
- Netstat- Linux必学的60个命令
1.作用 检查整个Linux网络状态. 2.格式 netstat [-acCeFghilMnNoprstuvVwx][-A][--ip] 3.主要参数 -a--all:显示所有连线中的Socket. ...
- 在vue项目中使用Nprogress.js进度条
NProgress是一款在网页顶部添加细长进度条的工具,非常轻巧,使用起来也非常便捷,灵感来源于Google, YouTube. 1.安装 $ npm install --save nprogress ...