数据采集

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