skyline的TerraExplorer api for js二次开发时,图层中的features无法获取或者features对象没有包含任何单个feature。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26991807/article/details/78010119

由于skyline是以流的形式进行加载图层(为了响应更快),浏览哪里就显示哪里,要获取该图层的要素features集合的话,默认情况下图层是不加载的,图层不加载的话,图层中对应的features自然也获取不到。除非你手动去浏览该图层所在的位置令其加载,但是进行二次开发时要获取features就必须能让他全部一次性加载出来,手动浏览的情况也不现实。我们可以采取关闭流的方式来进行加载,也就是,先关闭流再进行图层加载。


//代码1 :关闭流加载图层
                featureLayer.Streaming=false; //关闭流 
                featureLayer.Load();//加载图层

此时解决了图层加载的问题,但是注意:在工程树上图层已经存在的layer(比如引入的发布数据),该图层可直接通过图层名获取的要素图层。代码如下:


//代码2 :获取树上的图层
         var groupID = sgworld.ProjectTree.FindItem(layerName);
         var featureLayer=sgworld.ProjectTree.GetLayer(groupID);
         ........关闭流和加载图层等操作
         ..........
// 代码3:获取features集合 
         var features=featureLayer.FeatureGroups.Polyline.GetCurrentFeatures();//此时你会发现获取的features.Count是0。

         也就是说features对象里面是没有内容的。本人经过多次调试发现原来,这种情况 必须先设置图层为visible可视,不然图层还是不会进行加载的,可能也是skyline为了提高渲染速度才这样设计的,在客户没有要求显示时(图层加载也就没什么意义),尽量减少不必要的开销,而不对该图层进行加载。故,在关闭流的前面加上一下语句即可:


//代码4:令图层可见
          sgworld.ProjectTree.SetVisibility(groupID,true);

       

          在这种情况下正确的代码运算顺序为:代码2》》代码4》》代码1》》代码3。才能获取到图层中的features集合。
          第二种情况:图层是自己新添加的构建的如: 

featurelayer = sgworld.Creator.CreateFeatureLayer("longjingguoji","FileName=D:\\data\\longjingguoji.shp;TEPlugName=OGR;","");  
//此时无需再进行setvisibilty。只需关闭流再对图层进行refresh即可。
        featurelayer.Streaming = false;  
        featurelayer.Refresh();




猜你喜欢

转载自blog.csdn.net/qq_26991807/article/details/78010119
今日推荐