二维室内导航
数据制作
图层分组
数据准备完毕后,需要对数据进行分组,以图层组的方式组织数据,使每个图层组中含有一个楼层的全部数据。
操作方法:
- 建立图层分组:每个图层组中管理一个楼层的数据,有几个楼层创建几个分组。先将数据集添加到地图窗口,此时可以在图层管理器中看到“新建根组”按钮,点击新建组/新建根组,创建图层分组。
- 将室内数据集加入到当前地图,并放置在相应的分组下。
注意事项:
一级分组名称必须为“indoor”(注意大小写字母)。
图:图层结构示例 |
专题图制作
面数据专题图
操作方法:
- 制作单值专题图,根据类型显示不同的风格。在图层管理器中,选择面图层,右键,选择制作专题图——单值专题图——默认,在右侧出现如下所示的“专题图”设置界面。设置表达式为"CO_TYPE",可通过颜色方案,选择合适的显示颜色,或者通过“风格”按钮,打开“填充符号选择器”,自行设置。
- 制作标签专题图,将名称显示出来。在图层管理器中,选择面图层,右键,选择制作专题图——标签专题图——统一风格,在右侧出现如下所示的“专题图”设置界面。选择标签表达式为"FT_NAME_CN",并可在属性、风格、高级选项卡中进行相应的设置。
图:单值专题图设置 |
点数据专题图
操作方法:
- 制作单值专题图,根据类型显示不同的风格。可以通过点击“风格”按钮,打开“点符号编辑器”,选择合适的点显示风格。如果“点符号选择器”中的点符号类型不能满足要求,可以通过“导入符号库”(导入.sym格式符号库),“导入栅格文件”(导入JPG、PNG、BMP、ICO格式图片)两种方式,导入满足条件的符号。
- 制作标签专题图:方法与面数据制作相同,参照面数据的步骤。
图:导入符号 |
添加属性
添加室内路网底面数据集属性
室内路网底面数据集用于控制室内地图是否显示。
操作方法:
- 在工作空间管理器中右键单击该数据集,点击属性——属性表,为室内路网底面数据集添加属性项“LinkName"(名称固定,不可更改)。
- 为上述属性项添加属性值。
- LinkName属性值,来源为“图层管理器”中,楼层分组的上一级分组的图层名称。获取方式为,在该分组上点击右键,选择图层属性,在图层属性表中“图层名称”的值。
图:添加属性项 |
图:"LinkName"属性值的获取方式 |
图:添加属性值 |
添加楼层关系属性表属性
在工作空间管理器中双击FloorRelationTable,为楼层名称添加属性值,属性值的获取方式为图层管理器中每个楼层的分组对应的图层名称。
操作方法:
在图层管理器中右键楼层组,点击图层属性,图层名称即为FloorRelationTable中的楼层名称。
添加完成后结果示意如下图:
图:“楼层名称”结果示意 |
构建楼梯关系
操作方法:
- 单击交通分析——室内导航——构建楼梯关系按钮,弹出加载室内导航模型对话框,在对话框中您将设置以下信息:
- 完成上述设置,单击确定按钮,程序将自动加载导航模型中的数据集,生成二三维一体化的导航场景模型,同时弹出楼梯关系管理对话框。
- 构建完成后,工作空间管理器中会得到下图所示结果数据集。
- 关闭场景,您可根据需要选择是否保存该场景。
图:加载室内导航模型 |
路网:设置已构建导航模型所在数据源及生成的楼层关系属性表数据集。
楼梯关系数据集:为三维线数据集,作为不同楼层之间的连接桥梁。可加载已存在的楼梯关系数据集,进行修改、删除、添加等管理操作,同时也可新建数据集,从初始构建楼梯关系。
提供鼠标拾取和指定楼梯ID两种方式构建楼梯关系,构建楼梯关系前后的对比图如下图所示:
方式一:鼠标拾取,在楼梯点列表区中选择设置楼梯关系的的楼梯点记录,单击鼠标拾取按钮,将鼠标移至场景中,鼠标状态变为拾取状态,选择要到达的楼梯点,即可将两个楼梯点建立连接,生成一条三维线,同时程序自动将该楼梯点信息添加至到达ID和到达楼层的属性中。
方式二:指定楼梯ID,在楼梯点列表区中选择设置楼梯关系的的楼梯点记录,双击当前楼梯点的到达 ID 内容框,弹出到达ID列表框,在列表框中勾选到达ID的单选框。
图:构建楼梯关系前后对比图 |
图:楼梯关系结果数据集 |
二维室内导航数据加载应用
室内导航功能是通过代码来实现的。参考代码如下:
加载地图
//设置许可文件路径
Environment.setLicensePath(sdcard + "/SuperMap/license/");
//组件功能必须在 Environment 初始化之后才能调用
Environment.initialization(this);
setContentView(R.layout.activity_main);
//打开工作空间
m_wokspace = new Workspace();
WorkspaceConnectionInfo info = new WorkspaceConnectionInfo();
info.setServer(sdcard+"/SampleData/IndoorNavigationData/beijing.smwu");
info.setServer(sdcard+"/SampleData/Beijingmall/beijingMall.smwu");
info.setServer(sdcard+"/SampleData/navi2D/navi2D.smwu");
info.setServer(sdcard+"/SampleData/mall/kaide.smwu");
info.setType(WorkspaceType.SMWU);
m_wokspace.open(info);
//将地图显示控件和工作空间关联
m_mapView = (MapView)findViewById(R.id.Map_view);
m_mapControl = m_mapView.getMapControl();
m_mapControl.getMap().setWorkspace(m_wokspace);
//打开工作空间中的地图。参数0表示第一张地图
String mapName = m_wokspace.getMaps().get(0);
m_mapControl.getMap().open(mapName);
//设置使用全屏绘制模式,点、文字和普通图层同时显示
m_mapControl.getMap().setFullScreenDrawModel(true);
//刷新地图
m_mapControl.getMap().refresh();
注意事项:
- 工程创建以及环境配置可以参考在线帮助或开发指南,进行室内导航,需要加入分析库和导航库,即com.supermap.analyst.jar和com.supermap.navigation.jar。
- 许可的申请方式,见在线帮助或开发指南。
- 许可和数据的路径可根据情况进行设置。
导航模块初始化
m_NavigationEx = m_mapControl.getNavigation3();
m_NavigationEx.setUpdateDataMode(true);
m_NavigationEx.setDatasource(m_wokspace.getDatasources().get("kaide_mall"));
m_floorListView = (FloorListView)findViewById(R.id.floor_list_view);
m_floorListView.linkMapControl(m_mapControl);
m_mapControl.setGestureDetector(new GestureDetector(m_mapControl.getContext(), mGestrueListener));
添加导航点
//设置最近门模式,在路径分析是自动选取最近的门。(本接口10.1.2及以后版本可用)
m_NavigationEx.setNearestDoorMode = true;
//设置起点:可以连续设置,保留最后一次设置的值
m_NavigationEx.setStartPoint(pt.getX(), pt.getY(), mCurrentFloorID);
//设置终点:可以连续设置,保留最后一次设置的值
m_NavigationEx.setDestinationPoint(pt.getX(), pt.getY(), mCurrentFloorID);
//设置途径点:可以连续设置,途径点个数不限制 注意:没有起点和终点时不能添加途径点
m_NavigationEx.addWayPoint(pt.getX(), pt.getY(), mCurrentFloorID);
路径分析
//判断室内地图是否打开
String currentFloorID = m_floorListView.getCurrentFloorId();
if (currentFloorID == null) {
Toast.makeText(m_mapControl.getContext(), "请先打开室内地图", Toast.LENGTH_SHORT).show();
return;
}
//判断室内地图数据源是否加载成功
Datasource datasource = m_floorListView.getIndoorDatasource();
if (datasource == null) {
Toast.makeText(m_mapControl.getContext(), "室内地图数据源加载失败", Toast.LENGTH_SHORT).show();
return;
}
//设置室内地图所在的数据源
m_NavigationEx.setDatasource(datasource);
//路径分析
boolean bResult = m_NavigationEx.routeAnalyst();
if(bResult){
Toast.makeText(m_mapControl.getContext(), "分析成功", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(m_mapControl.getContext(), "分析失败,确认是否添加导航点", Toast.LENGTH_SHORT).show();
return;
}
导航
//开始导航 0:真实导航, 1:模拟导航 ,2:巡航 ,3:步行导航
if(!m_NavigationEx.startGuide(1)){
Toast.makeText(m_mapControl.getContext(), "导航启动失败", Toast.LENGTH_SHORT).show();
return;
}