iMobile提供在地图上创建各类几何对象的功能,包括:点对象、线对象、面对象、涂鸦。各种几何对象的采集都在图层可编辑的状态下进行,iMobile不支持多个图层可编辑,如果同时设置多个图层可编辑,在采集点、线、面或涂鸦对象时,只针对最后设置的图层进行对象采集。
手绘式采集
手绘式采集需要的jar包为com.supermap.data.jar、com.supermap.mapping.jar,需要的so库为libimb2d.so、libgnustl_shared.so、libQt5Core.so、libQt5Gui.so、libQt5Svg.so、libQt5Widgets.so。
关键类和方法如下表:
类 | 方法 |
---|---|
MapControl | setAction()、redo()、undo()、submit() |
Layer | setVisible()、setEditable() |
Action | CREATEPOINT、CREATEPOLYLINE、DRAWLINE、CREATEPOLYGON、DRAWPLOYGON、FREEDRAW |
点对象采集
GIS 应用中,常用点对象描述一些点状地物,如高程控制点、矿井、山洞等。
点对象的Action “CREATEPOINT”,支持在当前可编辑的点图层或 CAD 图层绘制点对象。
图:点对象采集 |
实现步骤:
第一步:绘制前设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置对象操作类型为点击式绘制点对象
mapControl.setAction(Action.CREATEPOINT);
第二步:在设备上交互式绘点
在移动设备上单指单击绘制点对象。
第三步:提交绘制
mapControl.submit();
线对象采集
GIS 应用中,常用线对象描述一些条状地物,如道路、铁路、管线、电线等。
(1)点击式绘制
点击式绘线的Action “CREATEPOLYLINE”,支持在当前可编辑的线图层或 CAD 图层绘制线对象。
图:点击式绘制线 |
实现步骤:
第一步:绘制前设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置对象操作类型为点击式绘制线对象
mapControl.setAction(Action.CREATEPOLYLINE);
第二步:在设备上交互式绘制线
手指在移动设备上依次点击,绘制线节点。
第三步:提交绘制
mapControl.submit();
(2)自由式绘制
自由绘线的Action “DRAWLINE”,支持在当前可编辑的线图层或 CAD 图层绘制自由线对象。
图:自由式绘制线 |
实现步骤:
第一步:绘制前设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置对象操作类型为自由绘制线对象
mapControl.setAction(Action.DRAWLINE)
第二步:在设备上交互式绘制自由线
手指轻触屏幕,移动手指进行自由线绘制,手指抬起则自由线绘制完成。
第三步:提交绘制
mapControl.submit();
面对象采集
GIS应用中,常用面对象描述一些块状地物,如行政区、土壤、植被、湖泊等,还可以表现地理上一些特殊的面状地物类型,如岛、环、飞地等。
(1)点击式绘制
点击绘面的Action “CREATEPOLYGON”,支持在当前可编辑的面图层或 CAD 图层绘制面对象。
图:点击式绘制面 |
实现步骤:
第一步:绘制前设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置对象操作类型为点击式绘制多边形对象
mapControl.setAction(Action.CREATEPOLYGON);
第二步:在设备上交互式绘面
手指在移动设备上依次点击,绘制面节点。
第三步:提交绘制
mapControl.submit();
(2)自由式绘制
自由绘面的Action “DRAWPLOYGON”,支持在当前可编辑的面图层或 CAD 图层绘制自由面对象。
图:自由式绘制面 |
实现步骤:
第一步:绘制前设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置对象操作类型为自由绘制面对象
mapControl.setAction(Action.DRAWPLOYGON)
第二步:在设备上交互式绘制自由面
手指轻触屏幕,移动手指进行自由面绘制,手指抬起则自由面绘制完成。
第三步:提交绘制
mapControl.submit();
涂鸦
涂鸦的Action “FREEDRAW”,支持在当前可编辑的CAD 图层进行涂鸦操作, 创建一个涂鸦对象。
图:涂鸦 |
实现步骤:
第一步:绘制前设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置对象操作类型为涂鸦对象
mapControl.setAction(Action.FREEDRAW)
第二步:在设备上交互式涂鸦
手指轻触屏幕,移动手指进行绘制。涂鸦不限制位置和个数,提交绘制前,都算是一个涂鸦对象。
第三步:提交绘制
mapControl.submit();
以上手绘式采集操作,可参照示例代码MapEdit。
GPS式采集
iMobile支持GPS式采集,实现属性采集,需要的类库包括com.supermap.data.jar、com.supermap.mapping.jar,so库包括libimb2d.so、libgnustl_shared.so、libQt5Core.so、libQt5Gui.so、libQt5Svg.so、libQt5Widgets.so。
关键类和方法如下表:
类 | 方法 |
---|---|
Collector | setDataset()、openGPS()、createElement()、setStyle()、setSingleTapEnable()、routeAnalyst()、startGuide()、addNaviInfoListene()、cleanPath() |
//获取数据采集模块
collector = mMapControl.getCollector();
//存储采集对象的数据集,可以是点线面CAD类型
Dataset dataset = mMapControl.getMap().getLayers().get(0).getDataset();
collector.setDataset(dataset); //设置用于存储采集数据的数据集
collector.openGPS(); //打开GPS
collector.createElement(GPSElementType.LINE);//创建指定类型的采集对象
//风格
GeoStyle geoStyle = new GeoStyle();
com.supermap.data.Color color = new com.supermap.data.Color(110, 208, 254);
//线颜色
geoStyle.setLineColor(color);
//设置绘制风格
collector.setStyle(geoStyle);
//打开单指打点
collector.setSingleTapEnable(true);
以上GPS式采集,可参照示例代码Collector。
轨迹采集
iMobile提供轨迹采集能力,自动剔除异常的位置坐标,支持后台运行。使用轨迹采集必需的类库包括com.supermap.data.jar、com.supermap.mapping.jar、com.supermap.navigation.jar、com.supermap.track.jar,so库包括libimb2d.so。若使用腾讯位置定位,还需要添加TencentLocationSdk_v7.1.7.jar和、libtencentloc.so。
关键类和方法如下表:
类 | 方法 |
---|---|
Track | createDataset()、setDataset()、setMatchDatasets()、setDistanceInternal()、setTimeInternal()、startTrack()、stopTrack() |
第一步:设置轨迹采集参数
Track m_Track = new Track(this);
m_Track.setCustomLocation(true); // 设置用户传入GPS数据
m_Track.setDistanceInterval(3); // 设置距离间隔为3米
m_Track.setTimeInterval(25); // 设置时间间隔为25s
m_Track.setMatchDatasets(m_Map.getWorkspace().getDatasources().get("road").getDatasets()); // 设置匹配道路所在的数据集
DatasetVector dataset = m_Track.createDataset(m_Datasource, datasetName); //创建数据集
m_Track.setDataset(dataset); // 设置记录轨迹的点数据集
第二步:开始记录轨迹,设置位置数据
m_Track.startTrack(); //开始记录轨迹
if(m_Track != null){ //设置用于轨迹记录的GPS数据
mPoint = new Point2D(gpsData.dLongitude, gpsData.dLatitude);
gpsData.dLongitude = mPoint.getX();
gpsData.dLatitude = mPoint.getY();
m_Track.setGPSData(gpsData); //设置GPS数据,在setCustomLocation(true)时,设置的数据有效
count ++;
}
if(50 == count){
m_Map.refresh();
count = 0;
}
第三步:结果记录轨迹
m_Track.stopTrack(); //停止记录轨迹
以上轨迹采集,可参照示例代码Track。