二维室内导航数据制作
二维室内导航的数据制作过程主要包含地图展示数据的制作、导航路径数据的制作、范围数据的制作、属性数据的制作和线符号库设置五个步骤。下面将详细讲解这五步的过程。
地图展示数据的制作
导入数据集
在进行数据制作之前,应先将原始数据导入到数据源内,原始数据需具有点、线、面数据集。原始数据下载地址:https://pan.baidu.com/s/1KDgVKrN4O3TF37EYC-1SjA,提取码:n8j5"。
操作方法:
第一步:创建数据源。【工作空间管理器】——【数据源】右键——【新建文件型数据源】,输入数据源名称和存储路径。
第二步:导入数据集。【工作空间管理器】——【第一步新建的数据源】右键——【导入数据集】,利用“添加文件”按钮,添加相应的原始文件。注意:涉及到跨楼层导航的点数据集,如楼梯、电梯等,需重命名为“T楼层编号_CON_INFO"格式,例如"T7_CON_INFO"。
图:新建数据源(左)和导入数据集(右) |
图:添加文件 |
为防止数据丢失,应随时保存工作空间。保存方法为:【文件】——【保存】,或点击页面左上角“保存”按钮,输入工作空间名称,保存即可。
导入后,须将数据集转换为地理坐标系。
图层分组
数据集准备完毕后,需要对数据进行分组,以图层组的方式组织数据,使每个图层组中含有一个楼层的全部数据。
操作方法:
第一步:建立图层分组:每个图层组中管理一个楼层的数据,有几个楼层创建几个分组。先将数据集添加到地图窗口,此时可以在【图层管理器】中看到“新建”按钮,点击【新建组】/【新建根组】,创建图层分组。
一级分组名称必须为“indoor”(注意大小写字母)。
第二步:将室内数据集加入到当前地图,并放置在相应的分组下。
src="images/image007.png" /> |
图:图层结构示例 |
面数据的制作
面数据须包含的属性如下,不可更改:
属性项 | 名称及表达意义 | 属性类型 |
---|---|---|
楼层ID | FL_ID(该名称不可更改):用于楼层显示、路径分析和导航。每一个楼层有一个ID,同一楼层中所有地物的楼层ID都相同。 | 宽字符 |
类型 | CO_TYPE:用于制作单值专题图,根据类型显示为不同的颜色。可以根据地物不同的属性设置类型值。以商场为例,店铺、电梯间、卫生间可以设置为不同的类型。 | 宽字符 |
名称 | FT_NAME_CN:用于制作标签专题图,将名称显示在地图上。 | 宽字符 |
第一步:添加属性项。若数据集中不含有上述属性内容,需要手动将内容添加。
在需要添加属性的面数据集上,单击右键,选择【属性】——【属性表】,打开如下所示的属性列表,利用“添加”、“修改”、“删除”、“应用”等按钮,进行属性项的添加。
新添加的属性项需点击“应用”按钮,才可以完成操作。
src="images/image011.png" /> |
图:属性添加结果示例 |
第二步:添加属性值。属性项添加完成后,即可以为数据集中的每一个对象添加对应的属性了。
在上述面数据集上,单击右键,选择【浏览属性表】,打开如下所示的属性表,双击属性表中的项(带*的为系统字段,无法编辑),即可对属性进行编辑。
图:属性表添加属性后示例 |
第三步:制作单值专题图,根据类型显示不同的风格。
在图层管理器中,选择面图层,右键,选择【制作专题图】——【单值专题图】——【默认】,在右侧出现如下所示的“专题图”设置界面。设置表达式为"CO_TYPE",可通过颜色方案,选择合适的显示颜色,或者通过“风格”按钮,打开“填充符号选择器”,自行设置。
图:设置单值专题图操作 |
src="images/image016.png" /> |
图:单值专题图设置 |
第四步:制作标签专题图,将名称显示出来。
在图层管理器中,选择面图层,右键,选择【制作专题图】——【标签专题图】——【统一风格】,在右侧出现如下所示的“专题图”设置界面。选择标签表达式为"FT_NAME_CN",并可在属性、风格、高级选项卡中进行相应的设置。
图:设置标签专题图操作 |
图:标签专题图设置 |
点数据的制作
第一步:添加属性项。方法与面数据属性项添加方法相同,参照面数据集的步骤添加。
属性项 | 名称及表达意义 | 属性类型 |
---|---|---|
楼层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。最顶层,本属性为空。 | 宽字符 |
属性项的添加方式同面数据的属性项添加,请参考面数据的步骤添加。
第二步:添加属性值。方法与面数据属性值添加方法相同,参照面数据集的步骤添加。
第三步:制作单值专题图,根据类型显示不同的风格。
可以通过点击“风格”按钮,打开“点符号编辑器”,选择合适的点显示风格。
如果“点符号选择器”中的点符号类型不能满足要求,可以通过“导入符号库”(导入.sym格式符号库),“导入栅格文件”(导入JPG、PNG、BMP、ICO格式图片)两种方式,导入满足条件的符号。
图:导入符号 |
第四步:制作标签专题图:方法与面数据制作相同,参照面数据的步骤。
导航路径数据的制作
室内原始数据中,需包含路径数据,存储在线数据集中,路径数据主要用于导航,需要构建路网,构建路网后的结果,无需加入地图。
【交通分析】——【路网分析】——【拓扑构网】——【构建二维网络】,打开“构建二维网络数据集”对话框,选择用于拓扑构网的数据集,设置数据集名称,并勾选上“线线自动打断”。点击“确定”,完成拓扑构网。
图:构建二维网络数据集 |
图:拓扑构网前后数据对比(左:处理前 右:处理后) |
范围数据制作
范围数据的大小应与室内范围相同或略大,用来控制楼层控件的显示和隐藏。范围数据是一个名为“bounds”(名称固定,不可更改)的数据源,数据源中包含一个名为“ building” (名称固定,不可更改)的面数据集。面数据集中有且仅有一个面对象。
操作方法:
第一步:创建数据源:数据源名称“ bounds”,存储路径与室内数据源的路径相同。
【工作空间管理器】——【数据源】右键——【新建文件型数据源】
图:新建数据源 |
第二步:创建面数据集。数据集名称“building”。数据集类型为面数据集。
【工作空间管理器】——【bounds数据源】右键——【新建数据集】
图:新建面数据集 |
第三步:添加面对象。面对象数量只能是1个,面对象大小应与室内地图面积相同或者略大,位置要与室内数据相同。
- 添加数据集到地图:通过双击“building“数据集或右键,选择”添加到新地图“的方式,把数据集添加到地图窗口。
- 设置数据集可编辑:在【图层管理器】中,将”building“数据集前对应的可编辑按钮点亮,或者右键,选择”可编辑“,将数据集设为可编辑模式。
- 绘制面对象:通过下述操作方式,即可在building数据集中绘制面对象。【对象操作】——【对象绘制】——【面】。
如果原始室内数据中含有类似能代表整个室内区域范围的面数据集,可以通过复制数据集的方式,将该数据集复制为building数据集。
【工作空间管理器】——“待复制数据集“右键——【复制数据集】,打开”数据集复制“对话框,设置目标数据源”bounds“和数据集名称”building“。
图:复制数据集 |
图:"数据集复制"对话框 |
第四步:添加属性项,需要为building数据集添加“LinkName"、“LinkDataSource”两个属性项(名称固定,不可更改)。
图:添加"LinkName"、“LinkDataSource”属性项 |
第五步:添加属性值。
图:"LinkName"、"LinkDataSource"添加属性值示例 |
LinkName属性值,来源为“图层管理器”中,楼层分组的上一级分组的图层名称。获取方式为,在该分组上点击右键,选择【图层属性】,在图层属性表中“图层名称”的值。
图:"LinkName"属性值的获取方式 |
LinkDataSource属性值,为原始导航数据所在数据源的数据源名称。
src="images/image034.png" /> |
图:属性值的获取方式 |
属性数据制作
属性数据集在导航的过程中发挥着至关重要的作用,必须包含如下数据项:
属性项 | 名称及表达意义 | 属性类型 |
---|---|---|
图层名称 | 属性项名称为“LayerName”,在图层管理器中每一个楼层的名称 | 文本型 |
楼层ID | 属性项名称为“FL_ID”,和每层地物中的添加的楼层ID一致 | 文本型 |
路径文件名称 | 属性项名称为“NetworkName”,每一层的路径数据所在的数据集的名称 | 文本型 |
楼层名称 | 属性项名称为“FloorName”,用于在楼层切换控件中显示的名称 | 文本型 |
楼层索引 | 属性项名称为“FloorIndex”,每个楼层的索引值 | 32位整型 |
操作方法:
第一步:创建属性数据集,数据集存储在原始室内数据所在的数据源,名称为“ FloorRelationTable”(固定名称,不可更改)。
【工作空间管理器】——【原始数据所在的数据源】右键——【新建数据集】
图:新建属性表 |
第二步:添加属性项
在“FloorRelationTable”数据集上,单击右键,选择【属性】——【属性表】,打开如下所示的属性列表,利用“添加”、“修改”、“删除”、“应用”等按钮,进行属性项的添加。注意:属性名称不能重复。添加完成后点击“应用”按钮,设置才可生效。
图:添加属性项 |
第三步:添加属性值
在“FloorRelationTable”数据集上,单击右键,选择【浏览属性表】,打开属性表,点击【属性表】——【添加行】,可添加属性行。双击属性表中的项,即可对属性进行编辑。
图:“FloorRelationTable”添加行 |
LayerName值,为“图层管理器”中每个楼层的分组对应的图层名称。
图:“图层名称”的获取方式 |
FL_ID值:楼层ID,每个楼层中对应的地物的楼层ID相同。
NetworkName值,为楼层对应的路径导航数据的名称。
图:“路径文件名称”的获取方式 |
FloorName值,为在移动端显示时,楼层操作控件中显示的楼层名称值。
FloorIndex值,为楼层索引,如负一层为-1,一层为1,二层为2。
属性值添加完毕后的属性表如下图所示:
图:添加完毕后的属性表 |
线符号库设置
在移动端经过路径分析后,绘制的导航路径,可以通过线符号库进行设置。
【工作空间管理器】——【资源】——【线型符号库】,打开“线型符号库”对话框,选择【导入】——【导入线型符号…】,导入已有的lsl格式的线性库文件。
图:导入线性库操作 |
或者,通过【编辑】——【新建符号】——【新建二维符号…】,在“线型符号编辑器”中编辑线型符号。
图:编辑线型符号操作 |
室外地图数据(可选)
室内数据制作完成后,可以叠加城市地图数据作为底图,室外、室内数据一体化使用。室外数据的制作这里不再赘述。
二维室内导航数据加载应用
室内导航功能是通过代码来实现的。参考代码如下:
加载地图
//设置许可文件路径
Environment.setLicensePath(sdcard + "/SuperMap/license/");
//组件功能必须在 Environment 初始化之后才能调用
Environment.initialization(this);
setContentView(R.layout.activity_main);
//打开工作空间
Workspace m_workspace = new Workspace();
WorkspaceConnectionInfo info = new WorkspaceConnectionInfo();
info.setServer(sdcard+"/SampleData/IndoorNavigationData/indoornavigation.smwu");
info.setType(WorkspaceType.SMWU);
m_workspace.open(info);
//将地图显示控件和工作空间关联
m_mapView = (MapView)findViewById(R.id.mapView);
m_mapControl = m_mapView.getMapControl();
m_mapControl.getMap().setWorkspace(m_workspace);
//打开工作空间中的地图。参数0表示第一张地图
String mapName = m_workspace.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_floorListView = (FloorListView)findViewById(R.id.floor_list_view);
m_floorListView.linkMapControl(m_mapControl);
添加导航点
//设置起点:可以连续设置,保留最后一次设置的值
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;
}
产品包(非绿色版)中提供了更加详细的参考示例代码,存放路径为“../SampleCode/SampleCode_ADT(SampleCode_AndroidStudio)/IndoorNavi”,可以下载参考。