SuperMap iMobile 二三维导航一体化之——二维室内导航

1 数据制作

1.1 图层分组

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

操作方法:

1.建立图层分组:每个图层组中管理一个楼层的数据,有几个楼层创建几个分组。先将数据集添加到地图窗口,此时可以在图层管理器中看到“新建根组”按钮,点击新建组/新建根组,创建图层分组。 注意:一级分组名称必须为“indoor”(注意大小写字母)。
2.将室内数据集加入到当前地图,并放置在相应的分组下。

在这里插入图片描述

1.2 专题图制作

1.2.1 面数据专题图

操作方法:

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

1.2.2 点数据专题图

操作方法:

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

1.3 添加属性

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

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

操作方法:

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

LinkName"属性值的获取方式
添加属性值

1.3.2 添加楼层关系属性表属性

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

操作方法:

图层管理器中右键楼层组,点击图层属性,图层名称即为FloorRelationTable中的楼层名称
添加完成后结果示意如下图:
在这里插入图片描述

1.4 构建楼梯关系

操作方法:

单击交通分析——室内导航——构建楼梯关系按钮,弹出加载室内导航模型对话框,在对话框中您将设置以下信息:
在这里插入图片描述
路网:设置已构建导航模型所在数据源及生成的楼层关系属性表数据集。

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

完成上述设置,单击确定按钮,程序将自动加载导航模型中的数据集,生成二三维一体化的导航场景模型,同时弹出楼梯关系管理对话框。 提供鼠标拾取和指定楼梯ID两种方式构建楼梯关系,构建楼梯关系前后的对比图如下图所示:
方式一:鼠标拾取,在楼梯点列表区中选择设置楼梯关系的的楼梯点记录,单击鼠标拾取按钮,将鼠标移至场景中,鼠标状态变为拾取状态,选择要到达的楼梯点,即可将两个楼梯点建立连接,生成一条三维线,同时程序自动将该楼梯点信息添加至到达ID和到达楼层的属性中。

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

在这里插入图片描述
3. 构建完成后,工作空间管理器中会得到下图所示结果数据集。
在这里插入图片描述
4. 关闭场景,您可根据需要选择是否保存该场景。

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

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

2.1 加载地图

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

注:

  1. 工程创建以及环境配置可以参考在线帮助或开发指南,进行室内导航,需要加入分析库和导航库,即com.supermap.analyst.jar和com.supermap.navigation.jar。

  2. 许可的申请方式,见在线帮助或开发指南。

  3. 许可和数据的路径可根据情况进行设置。

2.2 导航模块初始化

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));


2.3 添加导航点


	//设置最近门模式,在路径分析是自动选取最近的门。(本接口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);

2.4 路径分析

//判断室内地图是否打开
	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;
	}

2.5 导航

	//开始导航  0:真实导航, 1:模拟导航 ,2:巡航 ,3:步行导航
    if(!m_NavigationEx.startGuide(1)){
    
    
		Toast.makeText(m_mapControl.getContext(), "导航启动失败", Toast.LENGTH_SHORT).show();
		return;
	}

猜你喜欢

转载自blog.csdn.net/supermapsupport/article/details/135265168