三维室内导航数据制作
地图展示数据的制作
导入数据集
在进行数据制作前,先将原始数据导入到导入数据源。
操作方法:
第一步:创建数据源。【工作空间管理器】——【数据源】右键——【新建文件型数据源】,输入数据源名称和存储路径。
第二步:导入数据集。【工作空间管理器】——【第一步新建的数据源】右键——【导入数据集】,利用“添加文件”按钮,添加相应的原始文件。注意:涉及到跨楼层导航的点数据集,如楼梯、电梯等,需重命名为“T楼层编号_CON_INFO"格式,例如"T7_CON_INFO"。
图:新建数据源(左)和导入数据集(右) |
图:添加文件 |
为防止数据丢失,应随时保存工作空间。保存方法为:【文件】——【保存】,或点击页面左上角 “保存”按钮,输入工作空间名称,保存即可。
导入后,须将数据集转换为地理坐标系。
新建球面场景
【工作空间管理器】——【场景】右键——【新建球面场景】,场景新建完成后,“图层管理器”如下所示:
图:新建球面场景(左)、新建后结果(右) |
球面场景创建完成后,通过拖拽或右键【添加到当前场景】的方式,将上一流程导入的数据集,添加到当前的场景中。添加完成后,如果找不到已添加的图层,可以在“图层管理器”,选中图层,右键选择【快速定位到本图层】,即可在地图窗口看到已添加的图层内容。
图:添加图层到场景(左)、定位图层(右) |
面数据制作
面数据属性添加:面数据必须包含的属性如下:
属性项 | 名称及表达意义 | 属性类型 |
---|---|---|
楼层ID | FL_ID(该名称不可更改):用于楼层显示、路径分析和导航。每一个楼层有一个ID,同一楼层中所有地物的楼层ID都相同。 | 宽字符 |
类型 | CO_TYPE:用于制作单值专题图,根据类型显示为不同的颜色。可以根据地物不同的属性设置类型值。以商场为例,店铺、电梯间、卫生间可以设置为不同的类型。 | 宽字符 |
名称 | FT_NAME_CN:用于制作标签专题图,将名称显示在地图上。 | 宽字符 |
第一步:添加属性项:若数据集中不含有上述属性内容,需要手动将内容添加。
在需要添加属性的面数据集上,单击右键,选择【属性】——【属性表】,打开如下所示的属性列表,利用“添加”按钮,进行属性项的添加。注意:新添加的属性项需点击“应用”按钮,才可以完成操作。
图:打开属性列表操作(左)、属性添加结果示例(右) |
第二步:添加属性值:属性项添加完成后,即可以为数据集中的每一个对象添加对应的属性了。
在上述面数据集上,单击右键,选择【浏览属性表】,打开如下所示的属性表,双击属性表中的项(带*的无法编辑),即可对属性进行编辑。
图:在属性表中添加属性 |
第三步:制作单值专题图,根据类型显示不同的风格。
在图层管理器中,选择面图层,右键,选择【制作专题图】——【单值专题图】——【默认】,在右侧出现如下所示的“专题图”设置界面。选择表达式,可通过颜色方案,选择合适的显示颜色,或者通过“风格”按钮,打开“填充符号选择器”,自行设置。
图:制作单值专题图 |
图:专题图设置 |
专题图制作完成后,可以把其转换为三维效果。
在图层管理器中,选中该专题图层,【风格设置】——【拉伸设置】,高度模式为:绝对高度,为“底部高程”和“拉伸高度”设置相应的值。这里注意,本图层的底部高程等于下一层的底部高程与拉伸高度之和。
src="images/image051.png" /> |
图:第一层拉伸参考(上)、第二层拉伸参考(下) |
src="images/image052.png" /> |
图:拉伸后效果示例 |
第四步:制作标签专题图,将名称显示出来。
在图层管理器中,选择面图层,右键,选择【制作专题图】——【标签专题图】——【统一风格】,在右侧出现如下所示的“专题图”设置界面。选择标签表达式,设置相应属性。
src="images/image053.png" /> |
图:制作标签专题图 |
标签专题图制作完成后,也要进行拉伸设置,使标签专题图浮于该楼层最顶层,设置方式同单值专题图。注意:“底部高程”、“拉伸高度”与对应的标签专题图相同。
点数据制作
第一步:添加属性项:方法与面数据属性项添加方法相同,参照面数据集的步骤添加。
属性项 | 名称及表达意义 | 属性类型 |
---|---|---|
楼层ID | FL_ID(该名称不可更改):用于楼层显示、路径分析和导航。每一个楼层有一个ID,同一楼层中所有地物的楼层ID都相同。 | 宽字符 |
类型 | CO_TYPE:用于制作单值专题图,根据类型显示为不同的颜色。可以根据地物不同的属性设置类型值。以商场为例,店铺、电梯间、卫生间可以设置为不同的类型。 | 宽字符 |
名称 | FT_NAME_CN:用于制作标签专题图,将名称显示在地图上。 | 宽字符 |
除上述属性项外,楼梯(包含扶梯、滚梯、直梯等)由于涉及到导航,还必须包含如下属性项。
属性项 | 名称及表达意义 | 属性类型 |
---|---|---|
楼梯ID | FT_ID:每层的楼梯有一个ID值,即使是相同的一部直梯,在不同的楼层,ID值也是不一样的。 | 宽字符 |
楼梯类型 | FT_TYPE:即上表中的“类型”。 | 宽字符 |
到达楼层 | TO_CON:格式为“#到达的楼层#到达的下一个楼梯的ID“,如到达2层,ID为138690310200334的楼梯,属性值为“ #2#138690310200334”。每个楼梯只需对应上一层的楼梯即可,如1层的楼梯,本属性的属性值中到达的楼层为2。最顶层,本属性为空。 | 宽字符 |
属性项的添加方式同面数据的属性项添加,请参考面数据的步骤添加。
第二步:添加属性值。方法与面数据属性值添加方法相同,参照面数据集的步骤添加。
导航路径数据制作
室内原始数据中,需包含路径数据,存储在线数据集中,路径数据主要用于导航,需要构建路网,构建路网后的结果,无需加入地图。
【网络分析】——【拓扑构网】——【构建二维网络】,打开“构建二维网络数据集”对话框,选择用于拓扑构网的数据集,设置数据集名称,点击“确定”,完成拓扑构网。
图:构建二维网络数据集 |
图:拓扑构网前后数据对比 |
属性数据制作
属性数据集在导航的过程中发挥着至关重要的作用,必须包含如下数据项:
属性项 | 名称及表达意义 | 属性类型 |
---|---|---|
楼层ID | 属性项名称为“FL_ID”,和每层地物中的添加的楼层ID一致 | 文本型 |
路径文件名称 | 属性项名称为“NetworkName”,每一层的路径数据所在的数据集的名称 | 文本型 |
楼层名称 | 属性项名称为“FloorName”,用于在楼层切换控件中显示的名称 | 文本型 |
楼层索引 | 属性项名称为“FloorIndex”,每个楼层的索引值 | 32位整型 |
高程 | 属性项名称为“Height”,每个楼层的高程 | 双精度 |
操作方法:
第一步:创建属性数据集,数据集存储在原始室内数据所在的数据源,名称为“ FloorRelationTable”(固定名称,不可更改)。
【工作空间管理器】——【原始数据所在的数据源】右键——【新建数据集】
src="images/image057.png" /> |
图:新建属性表 |
第二步:添加属性项
在“FloorRelationTable”数据集上,单击右键,选择【属性】——【属性表】,打开如下所示的属性列表,利用“添加”按钮,进行属性项的添加。
属性名称不能重复。添加完成后点击“应用”按钮,设置才可生效。
图:添加属性项 |
第三步:添加属性值
在“FloorRelationTable”数据集上,单击右键,选择【浏览属性表】,打开如下所示的属性表,双击属性表中的项,即可对属性进行编辑。
图:“FloorRelationTable”添加属性示例 |
FL_ID值:楼层ID,每个楼层中对应的地物的楼层ID相同。
NetworkName值,为楼层对应的路径导航数据的名称。
图:“路径文件名称”的获取方式 |
FloorName值,为在移动端显示时,楼层操作控件中显示的楼层名称值。
FloorIndex值,为楼层索引,如负一层为-1,一层为1,二层为2。
Height值:为楼层高程,获取方式为,当前楼层所在面的“底部高程”+“拉伸高度”+0.1。为了让分析结果能正常显示在楼层的上面多加0.1。
src="images/image061.png" /> |
图:“高程”的获取方式 |
相机属性制作
相机数据用于保存切换楼层的时候的相机位置,数据源名称为“indoor_info”(固定名称,不可更改),数据集名称为“CameraInfo” (固定名称,不可更改),,类型为属性数据集。
第一步:新建数据源
【工作空间管理器】——【数据源】右键——【新建文件型数据源】,输入数据源名称“ indoor_info”。
图:新建数据源 |
第二步:新建数据集
数据集名称“CameraInfo”。数据集类型为属性数据集。
【工作空间管理器】——【indoor_info数据源】右键——【新建数据集】
src="images/image063.png" /> |
图:新建属性数据集 |
第三步:新建属性项
属性项包括如下内容:
属性项 | 名称 | 属性类型 |
---|---|---|
经度 | Longitude | 双精度 |
纬度 | Latitude | 双精度 |
高度 | Altitude | 双精度 |
方位角 | Heading | 双精度 |
倾斜角 | Tilt | 双精度 |
楼层索引 | FloorIndex | 32位整型 |
楼层名称 | FloorName | 文本型 |
楼层ID | FloorID | 文本型 |
在“CameraInfo”数据集上,单击右键,选择【属性】——【属性表】,打开如下所示的属性列表,利用“添加”按钮,进行属性项的添加。注意:属性名称不能重复。添加完成后点击“应用”按钮,设置才可生效。
图:CameraInfo”数据集属性项” |
第四步:添加属性值
在“CameraInfo”数据集上,单击右键,选择【浏览属性表】,打开如下所示的属性表,双击属性表中的项,即可对属性进行编辑。
Longitude、Latitude、Altitude、Heading、Tilt值为相机参数,打开三维场景,将每个楼层分别调整到窗口中心的位置,通过【飞行管理】——【飞行路线-新建】,打开“三维飞行站点管理”,对话框,通过“新建”按钮,新建飞行路线,获取对应参数。
图:相机参数获取方式” |
FloorIndex值,为楼层索引,如负一层为-1,一层为1,二层为2。
FloorName值,为在移动端显示时,楼层操作控件中显示的楼层名称值。
FloorID值:楼层ID,每个楼层中对应的地物的楼层ID相同。
缓存数据制作
为了让三维场景在移动端操作性能更高,以缓存的形式应用。
第一步:创建三维缓存
在【工作空间管理器】——【当前场景】右键——【生成场景缓存】
图:生成场景缓存 |
在过程中,可能会出现如下提示,都选择“是”。
src="images/image069.png" /> |
图:生成场景缓存操作过程中的提示框 |
在“生成场景缓存对话框”中,利用“复选框”选择全部的数据集,选择“缓存用途”(Android设备使用选择“Android系列设备”,iOS设备使用选择“iOS系列设备”)。
src="images/image071.png" /> |
图:生成场景缓存设置 |
第二步:重新调整数据结构
- 关闭当前工作空间;
- 场景缓存生成后,会产生一个新的工作空间,打开该工作空间;
- 将原始导航数据所在的数据源和“indoor_info”数据源,拷贝到新工作空间所在的文件夹下;
- 通过【工作空间管理器】——【数据源】右键——【打开文件型数据源...】,在路线下找到两个数据源并打开。
- 通过【开始】——【工作空间-保存】,保存工作空间。
至此,三维室内导航数据制作完成。
图:室内三维导航数据结构示例 |
三维室内导航数据加载应用
室内导航功能是通过代码来实现的。参考代码如下:
打开工作空间、初始化导航模块
//打开工作空间
m_workspace = new Workspace();
WorkspaceConnectionInfo info = new WorkspaceConnectionInfo();
info.setServer(sdcard+"/SampleData/IndoorNavigation3DData2/3D.sxwu");
info.setType(WorkspaceType.SXWU);
boolean result = m_workspace.open(info);
if (!result) {
System.out.println("工作空间打开失败");
return;
}
m_sceneView= (SceneView)findViewById(R.id.scene_control);
m_sceneControl= m_sceneView.getSceneControl();
m_sceneControl.sceneControlInitedComplete(new SceneControl.SceneControlInitedCallBackListenner() {//场景控件初始化回调监听
@Override
public void onSuccess(String arg0) {
//打开场景
m_scene = m_sceneControl.getScene();
m_scene.setWorkspace(m_workspace);
String mapName = m_workspace.getScenes().get(0);
m_scene.open(mapName);
m_navigation3D = m_sceneView.getNavigation(); //获取导航模块
m_sceneControl.setNavigationControlVisible(true); //设置导航条可见
//初始化FloorList
m_floorListView3D = (FloorListView3D)findViewById(R.id.floor_list_view_3d);
m_floorListView3D.setVisibility(View.VISIBLE);
m_floorListView3D.linkScenepControl(m_sceneControl, m_workspace);
m_floorListView3D.setNavigation3D(m_navigation3D);
//设置室内地图所在的数据源
m_navigation3D.setDatasource(m_workspace.getDatasources().get("indoor"));
//设置三维场景控件
m_navigation3D.setSceneControl(m_sceneControl);
//设置用户手势识别器(用于通过手势添加导航点)
m_sceneControl.setGestureDetector(new GestureDetector(m_sceneControl.getContext(), mSceneGestrueListener));
//添加导航引导信息更新监听器
m_navigation3D.addNaviInfoListener(new NaviListener() {
@Override
public void onStopNavi() {
//结束导航后,关闭导航状态
m_naviState = NAVI_STATE.STATE_NULL;
m_navigation3D.cleanPath();
System.out.println("导航停止");
}
@Override
public void onStartNavi() {
}
@Override
public void onPlayNaviMessage(String message) {
}
@Override
public void onNaviInfoUpdate(NaviInfo naviInfo) {
}
@Override
public void onAdjustFailure() {
}
@Override
public void onAarrivedDestination() {
//到达目的地,关闭导航状态
m_naviState = NAVI_STATE.STATE_NULL;
m_navigation3D.cleanPath();
System.out.println("导航到达目的地");
}
});
}
});
添加导航点
//设置起点:可以连续设置,保留最后一次设置的值
m_navigation3D.setStartPoint(pt3d.getX(), pt3d.getY(), pt3d.getZ());
//设置终点:可以连续设置,保留最后一次设置的值
m_navigation3D.setDestinationPoint(pt3d.getX(), pt3d.getY(), pt3d.getZ());
//设置途径点:可以连续设置,途径点个数不限制 注意:没有起点和终点时不能添加途径点
m_navigation3D.addWayPoint(pt3d.getX(), pt3d.getY(), pt3d.getZ());
路径分析
//路径分析
boolean bResult = m_navigation3D.routeAnalyst();
if(bResult){
Toast.makeText(m_sceneControl.getContext(), "路径分析成功", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(m_sceneControl.getContext(), "路径分析失败", Toast.LENGTH_SHORT).show();
return;
}
导航
//开始导航 0:真实导航, 1:模拟导航 ,2:巡航 ,3:步行导航
if(!m_navigation3D.startGuide(1)){
Toast.makeText(m_sceneControl.getContext(), "导航启动失败", Toast.LENGTH_SHORT).show();
return;
}