二维室内导航

数据制作

图层分组

数据准备完毕后,需要对数据进行分组,以图层组的方式组织数据,使每个图层组中含有一个楼层的全部数据。

操作方法:

  1. 建立图层分组:每个图层组中管理一个楼层的数据,有几个楼层创建几个分组。先将数据集添加到地图窗口,此时可以在图层管理器中看到“新建根组”按钮,点击新建组/新建根组,创建图层分组。
  2. 注意事项:

    一级分组名称必须为“indoor”(注意大小写字母)。

  3. 将室内数据集加入到当前地图,并放置在相应的分组下。
  4. 图:图层结构示例

专题图制作

面数据专题图

操作方法:

  1. 制作单值专题图,根据类型显示不同的风格。在图层管理器中,选择面图层,右键,选择制作专题图——单值专题图——默认,在右侧出现如下所示的“专题图”设置界面。设置表达式为"CO_TYPE",可通过颜色方案,选择合适的显示颜色,或者通过“风格”按钮,打开“填充符号选择器”,自行设置。
  2. 图:单值专题图设置
  3. 制作标签专题图,将名称显示出来。在图层管理器中,选择面图层,右键,选择制作专题图——标签专题图——统一风格,在右侧出现如下所示的“专题图”设置界面。选择标签表达式为"FT_NAME_CN",并可在属性、风格、高级选项卡中进行相应的设置。

点数据专题图

操作方法:

  1. 制作单值专题图,根据类型显示不同的风格。可以通过点击“风格”按钮,打开“点符号编辑器”,选择合适的点显示风格。如果“点符号选择器”中的点符号类型不能满足要求,可以通过“导入符号库”(导入.sym格式符号库),“导入栅格文件”(导入JPG、PNG、BMP、ICO格式图片)两种方式,导入满足条件的符号。
  2. 图:导入符号
  3. 制作标签专题图:方法与面数据制作相同,参照面数据的步骤。

添加属性

添加室内路网底面数据集属性

室内路网底面数据集用于控制室内地图是否显示。

操作方法:

  1. 工作空间管理器中右键单击该数据集,点击属性——属性表,为室内路网底面数据集添加属性项“LinkName"(名称固定,不可更改)
  2. 图:添加属性项
  3. 为上述属性项添加属性值。
    • LinkName属性值,来源为“图层管理器”中,楼层分组的上一级分组的图层名称。获取方式为,在该分组上点击右键,选择图层属性,在图层属性表中“图层名称”的值。
    • 图:"LinkName"属性值的获取方式
      图:添加属性值

添加楼层关系属性表属性

工作空间管理器中双击FloorRelationTable,为楼层名称添加属性值,属性值的获取方式为图层管理器中每个楼层的分组对应的图层名称。

操作方法:

图层管理器中右键楼层组,点击图层属性,图层名称即为FloorRelationTable中的楼层名称

添加完成后结果示意如下图:

图:“楼层名称”结果示意

构建楼梯关系

操作方法:

  1. 单击交通分析——室内导航——构建楼梯关系按钮,弹出加载室内导航模型对话框,在对话框中您将设置以下信息:
  2. 图:加载室内导航模型

    路网:设置已构建导航模型所在数据源及生成的楼层关系属性表数据集。

    楼梯关系数据集:为三维线数据集,作为不同楼层之间的连接桥梁。可加载已存在的楼梯关系数据集,进行修改、删除、添加等管理操作,同时也可新建数据集,从初始构建楼梯关系。

  3. 完成上述设置,单击确定按钮,程序将自动加载导航模型中的数据集,生成二三维一体化的导航场景模型,同时弹出楼梯关系管理对话框。
  4. 提供鼠标拾取指定楼梯ID两种方式构建楼梯关系,构建楼梯关系前后的对比图如下图所示:

    方式一:鼠标拾取,在楼梯点列表区中选择设置楼梯关系的的楼梯点记录,单击鼠标拾取按钮,将鼠标移至场景中,鼠标状态变为拾取状态,选择要到达的楼梯点,即可将两个楼梯点建立连接,生成一条三维线,同时程序自动将该楼梯点信息添加至到达ID和到达楼层的属性中。

    方式二:指定楼梯ID,在楼梯点列表区中选择设置楼梯关系的的楼梯点记录,双击当前楼梯点的到达 ID 内容框,弹出到达ID列表框,在列表框中勾选到达ID的单选框。

    图:构建楼梯关系前后对比图
  5. 构建完成后,工作空间管理器中会得到下图所示结果数据集。
  6. 图:楼梯关系结果数据集
  7. 关闭场景,您可根据需要选择是否保存该场景。

二维室内导航数据加载应用

室内导航功能是通过代码来实现的。参考代码如下:

加载地图

//设置许可文件路径
  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;
  }