首页 / 浏览问题 / 三维GIS / 问题详情
获取场景中所有Features为空
6EXP 2018年01月11日
/**
 * 获取场景中所有模型或者Featrue的信息
 */
function getFeatureInfos(){
	
	var layer3Ds = scene.get_layer3Ds();
	var layer3Ds_count = layer3Ds.get_count();
	console.log("场景具有的图层总数: " + layer3Ds_count);
	
	for(var i = 0; i < layer3Ds_count; i++){
		var layer3D = layer3Ds.get_item(i);
		var layerName = layer3D.get_dataName();
		console.log("图层i: " + i + " 的图层名: " + layerName);
		
		var feature3Ds = layer3D.get_feature3Ds();
		
		var feature3Ds_count = 0;
		if(feature3Ds !== null){
		    feature3Ds_count = feature3Ds.get_count();
		    console.log("图层名为: " + layerName + " 包含的feature3D的总数 feature3Ds_count : " + feature3Ds_count);
		}else{
			console.log("图层名为: " + layerName + " 包含的feature3D的总数为 0。");
		}
	}

}

plugin 三维开发,OSGB场景缓存,尝试获取场景中图层中的所有Features失败,每次

var feature3Ds = layer3D.get_feature3Ds();

都是null,求指点。

1个回答

您好,osgb缓存没有feature的概念。如果您想做属性查询,您可以调用layer3D.getAllFieldValueOfLastSelectedObject()方法。

另外,osgb图层不支持查询对象数目。如果您需要统计对象数目,那么建议您提前获得这个数值(比如在生成缓存前通过数据集获得),然后通过其他方式储存这个数值(比如用txt存储),最后需要统计时直接查询txt。
5,560EXP 2018年01月11日

刚接触三维plugin 这一块,所以还在试试一些接口能不能用的阶段smiley

其实我们的需求是这样的:

1.我们的场景内部有几栋楼,楼外部墙面是分层建模的,场景内部有很多单独的模型;

2.需求的功能是在场景控件外面悬浮一个场景内的楼层列表;这个列表可以点击,如点击 食堂楼一层:会将食堂楼一层上面所有的楼层内外都隐藏,只显示食堂楼一层内部的模型。

刚接触这块,很多接口不熟悉,所以我暂时的想法是这么做:

1.将所有的模型进行规划(目前场景模型没有这些规划,所以模型都很分散,后期会让数据厂家再加上这一块属性),每个模型都有一个标识其楼名和楼层的字段及属性,如食堂一楼的一把椅子,会有两个buildingId 和 floorId字段,然后分别有对应值;

2.当用户选择只显示食堂一楼时,我希望能通过接口查询到所有图层中哪些模型的builingId对应食堂楼,然后再筛选出非食堂一楼的所有模型,并循环遍历这些模型,进行逐个隐藏;

3.模型隐藏的功能可以实现,然后现在的问题停在如何选具体模型的方法上面,getAllFieldValueOfLastSelectedObject 这个接口感觉不能实现上面的想法吧,不知道我这思路,最好怎么样实现最快(场景内模型比较多),求指点,谢谢!!

这样的话,您可以参考示例代码中的【空间查询】-【查询服务】,用iserver的接口进行sql查询。

当然,做iserver的查询需要发布相应的数据服务,即您需要将您的数据集也保存到工作空间中然后一并发布服务(不过数据集不需要加到场景中)。
嗯,我参照

http://qa.supermap.com/7428?show=7428#q7428

比如单击食堂楼一楼,那么需要将食堂楼所有不是一楼的都隐藏掉,
先通过发布一个矢量的数据服务,通过SQL查询(类似于 buildingId = 1 and floorId != 1)出来,
然后将得到食堂楼所有不是一楼的模型的id集合,然后逐个将其隐藏;
...