作者:xinxin
在SuperMap iMobile for Android的场景中加载模型数据只能加载场景缓存,如果想获取场景中的模型数据的属性信息,直接对场景缓存数据无法获取,下面小编给大家分享一下移动端弹框显示模型属性信息的具体实现方案。该功能的实现主要有两个步骤:数据准备和功能开发。
####1、 数据准备
(1) 切场景缓存
在iDesktop中将CAD模型数据集添加到场景中,保存场景,然后切场景缓存,缓存类型选“OSGB”,缓存用途选“Android系列设备”,如下图:
如果用iDesktop 9D切缓存时已进行了纹理压缩,用9D以前的版本切完场景缓存后还需要进行压缩纹理,如下图:
(2) 数据拷贝
步骤(1)中切完场景缓存会得到一个.sxwu的工作空间,在iDesktop中打开这个工作空间,并在该工作空间中打开含有(1)中的CAD模型数据集的数据源(建议将该数据源拷贝到切的场景缓存文件中再打开),然后将整个场景缓存文件和数据源拷贝到移动设备上待用。
####2、 功能开发
(1) 加载场景
先打开拷贝到移动设备上的工作空间数据,打开里面的场景缓存,关键代码如下:
workspace = new Workspace();
WorkspaceConnectionInfo info = new WorkspaceConnectionInfo();
info.setServer(sdcard + "/SampleData/wgx/BuildingAndroid/BuildingAndroid.sxwu");
info.setType(WorkspaceType.SXWU);
if (workspace.open(info)) {
System.out.println("工作空间打开成功!");
}
(2) 选中模型高亮
加载完场景缓存后通过手指触屏选中对象,并设置选中对象高亮显示风格,关键代码如下:
Layer3D layer3d = layer3Ds.get(i);
//图层选中对象
Selection3D selection3d = layer3d.getSelection();
//设置选中对象的显示风格
GeoStyle3D selectStyle3d = new GeoStyle3D();
Color color = new Color(255, 0, 0);
selectStyle3d.setFillForeColor(color);
selection3d.setStyle(selectStyle3d);
(3) 获取选中模型的属性
得到选中模型对象Selection3D后,可以获取该对象所在图层中的ID,然后通过ID在这个图层对应的CAD模型数据集中获取到这个模型对象,最后在这个数据集对应的记录集中获取这个模型对象的属性信息,关键代码如下:
if (selection3d.getCount()>0) {
//选中对象的ID
int ID = selection3d.get(0);
queryInfoBubble.m_QueryInfoData.clear();
//获取选中对象图层对应的数据源和矢量数据集
String layerName = layer3d.getName();
String[] dataNames = layerName.split("@");
String datasetName = dataNames[0];
String datasourceName = dataNames[1];
Datasource datasource = workspace.getDatasources().get(datasourceName);
if (datasource!=null) {
DatasetVector datasetVector = (DatasetVector)datasource.getDatasets().get(datasetName);
if (datasetVector!=null) {
String filter = "SMID = '" + ID + "'";
QueryParameter parameter = new QueryParameter();
parameter.setAttributeFilter(filter);
parameter.setCursorType(CursorType.STATIC);
Recordset recordset = datasetVector.query(parameter);
//获取数据集中自定义的字段
if (recordset.getRecordCount()>0) {
recordset.moveFirst();
FieldInfos fieldInfos = datasetVector.getFieldInfos();
ArrayList<String> nameList = new ArrayList<String>();
for (int j = 0; j < fieldInfos.getCount(); j++) {
String name = fieldInfos.get(j).getName();
if (name.toLowerCase().startsWith("sm")) {
continue;
}
nameList.add(name + ":");
}
}
}
}
}
(4) 弹框显示模型属性
需要自己创建一个类似于气泡的弹框,将选中模型的(3)中得到的属性信息显示在弹框中。
####3、 效果截图
完整代码链接:http://pan.baidu.com/s/1boPpq9L;密码:oy1i