对象编辑
选择
单选
单选的Action“SELECT”,通过单指点击对象进行几何对象选择,单选操作要求操作图层为可选择图层。
![]() |
图:单选 |
实现步骤:
第一步:选择前准备
//设置图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可以被选择。
layer.setSelectable(true);
第二步:设置选择状态
//设置对象操作类型为单选
mapControl.setAction(Action.SELECT);
多选
多选的Action“MULTI_SELECT”,通过单指依次单击各几何对象进行多选,多选操作要求操作图层为可选择图层。
![]() |
图:多选 |
实现步骤:
第一步:选择前准备
//设置图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可以被选择。
layer.setSelectable(true);
第二步:设置选择状态
//设置对象操作类型为多选
mapControl.setAction(Action.MULTI_SELECT);
框选
框选的Action“SELECT_BY_RECTANGLE”,通过单指触摸屏幕,不抬起手指进行滑动,沿手指滑动轨迹为对角线的矩形范围进行几何对象选择,框选操作要求操作图层为可选择,不可编辑图层。
![]() |
图:框选 |
实现步骤:
第一步:选择前设置
//设置图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可以被选择。
layer.setSelectable(true);
//设置图层不可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(false);
第二步:设置选择状态
//设置对象操作类型为框选
mapControl.setAction(Action.SELECT_BY_RECTANGLE);
移动
移动的Action“MOVE_GEOMETRY” 在地图窗口中的可编辑图层中,将选中的几何对象移动到新的位置。
![]() |
图:移动 |
实现步骤:
第一步:平移前设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
//设置对象操作类型平移对象
mapControl.setAction(Action.MOVE_GEOMETRY);
第二步:在设备上交互式平移对象
在地图窗口的可编辑图层中点选一个几何对象,按住该几何对象,拖动到合适的位置,抬起手指,即完成一次平移操作。
第三步:提交操作
mapControl.submit();

操作过程中,可以选择其他几何对象,选中的对象仍能够进行平移操作,直到用户进行“提交”操作,平移对象状态才会终止。
删除
在地图窗口的可编辑图层中,将单选、多选选中的几何对象删除。
![]() |
图:单选删除 |
![]() |
图:多选删除 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为单选或多选
//设置对象操作类型为单选
mapControl.setAction(Action.SELECT);
//设置对象操作类型为多选
//mapControl.setAction(Action.MULTI_SELECT);
第三步:设置对象操作类型为删除当前几何对象
//设置对象操作类型为删除当前几何对象
mapControl.deleteCurrentGeometry();
第四步:在设备上执行交互式操作并提交
触发单选或多选动作,在地图窗口的可编辑图层中点选一个或多个几何对象,抬起手指,触发删除动作。
第五步:提交操作
mapControl.submit();
节点编辑
添加节点
添加节点的Action“VERTEXADD” ,在线或面几何对象上单击来添加节点。
![]() |
图:添加节点 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为单选
//设置对象操作类型为单选
mapControl.setAction(Action.SELECT);
第三步:设置对象操作类型为添加节点
//设置对象操作类型添加节点
mapControl.setAction(Action. VERTEXADD);
第四步:在设备上交互式添加节点
在地图窗口中的可编辑图层中点选一个几何对象,显示对象节点, 在几何对象的合适的位置单击,抬起手指即完成一次添加节点操作。
第五步:提交编辑
mapControl.submit();

一次只能为一个几何对象添加节点,添加节点状态终止后,即完成“提交”操作,方可选择其他几何对象进行节点编辑。
编辑节点
编辑节点的Action“VERTEXEDIT” ,通过拖动节点实现线或面几何对象节点位置的调整。
![]() |
图:编辑节点 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为单选
//设置对象操作类型为单选
mapControl.setAction(Action.SELECT);
第三步:设置对象操作类型为编辑节点
//设置对象操作类型编辑节点
mapControl.setAction(Action.VERTEXEDIT);
第四步:在设备上交互式编辑节点
在地图窗口中的可编辑图层中点选一个几何对象,显示对象节点, 单指按住几何对象的一个节点,拖动到合适的位置后,抬起手指,完成节点编辑。
第五步:提交编辑
mapControl.submit();

一次只能为一个几何对象编辑节点,编辑节点状态终止后,即完成“提交”操作,方可选择其他几何对象进行节点编辑。
删除节点
删除节点的“VERTEXDELETE” ,通过在几何对象上单击节点来删除节点。
![]() |
图:删除节点 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为单选
//设置对象操作类型为单选
mapControl.setAction(Action.SELECT);
第三步:设置对象操作类型为删除节点
//设置对象操作类型删除节点
mapControl.setAction(Action. VERTEXDELETE);
第四步:在设备上交互式删除节点
在地图窗口中的可编辑图层中点选一个几何对象,显示对象节点, 单指点击几何对象的一个节点,即可删除节点。
第五步:提交编辑
mapControl.submit();

一次只能为一个几何对象删除节点,删除节点状态终止后,即完成“提交”操作,方可选择其他几何对象进行节点删除。
拓扑式编辑
iMobile提供多种拓扑编辑和捕捉,方便精确编辑图形对象。
实现拓扑式编辑,需要的类库包括com.supermap.data.jar、com.supermap.mapping.jar、com.supermap.analyst.jar,so库包括libimb2d.so、libgnustl_shared.so、libQt5Core.so、libQt5Gui.so、libQt5Svg.so、libQt5Widgets.so。
关键类和方法如下表:
类 | 方法 |
---|---|
MapControl | setSnapSetting()、setAction()、undo()、redo() |
SnapSetting | openAll()、openDefault() |
snapClose | closeAll() |
TopoBuild | topoBuildRegion() |
组合面
组合面的Action“ COMPOSE_REGION”,组合面功能是将当前图层中选中的面对象组合成一个复合对象。
![]() |
图:组合面 |

- 对两个或多个面对象进行组合操作生成一个新的复合对象,支持对面图层和CAD复合图层中的面对象进行组合。
- 新生成的复合对象的属性信息通过回调函数获取。
- 对象重叠面个数为偶数时,组合后此区域显示为白色,是结果数据的一部分。
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为组合面
//设置对象操作类型为组合面
mapControl.setAction(Action. COMPOSE_REGION);
第三步:在设备上进行交互式操作并
触发“组合面”动作,依次单击选择两个或多个面对象,提交后,即可查看组合结果。
第四步:提交操作
mapControl.submit();

- 当进行组合的面对象之间存在包含关系时,按岛洞多边形处理,结果也与岛洞多边形结果一致。
- 在面图层中进行组合操作后,面对象两两叠加的部分为白色,其为结果一部分,并非缺失。
合并面
合并面的Action“UNION_REGION”,支持对面图层和CAD复合图层中的面对象进行合并。
![]() |
图:合并面 |
说明:
- 如果参与运算的面相交于点,则这些面对象被合并成一个复杂面对象(如下图为生成一个具有两个子对象的复杂面对象)。
![]() |
图:点相交合并 |
- 如果参与对象运算的面相交于线,则这些面对象间的相邻边线将消失,合并成一个简单面对象。
![]() |
图:线相交合并 |
- 如果参与对象运算的面相交于面,则重新合并成一个简单面对象。
![]() |
图:面相交合并 |
- 如果参与对象运算的面不相交,彼此不相邻,则合并后会生成一个复杂面对象(如下图为生成一个具有三个子对象的复杂面对象)。
![]() |
图:面不相交合并 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为合并面
//设置对象操作类型为合并面
mapControl.setAction(Action.UNION_REGION);
第三步:在设备上进行交互式操作
触发“合并面”动作,连续点选两个或多个面对象,提交后,即可查看合并结果。
第四步:提交操作
mapControl.submit();
擦除面
擦除面的Action“ERASE_REGION”,用来将目标对象(被擦除对象)中与擦除对象重叠的部分进行删除。
![]() |
图:擦除面 |

- 擦除功能只有在选中线对象或者面对象时可用。
- 擦除功能适用于面图层和CAD图层。
- 擦除对象和被擦除对象不能是同一对象。
- 被擦除对象可以是多个面对象,但擦除对象必须为一个面对象。
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为擦除面
//设置对象操作类型为擦除面
mapControl.setAction(Action.ERASE_REGION);
第三步:在设备上进行交互式操作
触发“擦除面”动作,在需要擦除的面对象上绘制擦除面,提交后,即可查看擦除结果。
第四步:提交编辑
mapControl.submit();
求交面
求交面的Action“INTERSECT_REGION”,求交操作可以得到两个或多个对象的公共部分,通过求交运算,对两个或者多个面对象的公共区域进行操作,从而创建一个新对象。多个对象的公共区域被保留下来,其余部分被删除。
![]() |
图:求交面 |
说明:
- 如果参与对象运算的所有面对象的交集不为空集,则相交之后,会生成一个所有对象相交部分的简单对象。
![]() |
图:求交面(交集不为空) |
- 如果参与运算的所有面对象的交集为空集,则求交之后,返回false,不能进行求交操作且不会生成一个新对象。
![]() |
图:求交面(交集为空) |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为求交面
//设置对象操作类型为求交面
mapControl.setAction(Action.INTERSECT_REGION);
第三步:在设备上进行交互式操作
触发“求交面”动作,连续点选两个或多个面对象,提交后,即可查看求交结果。
第四步:提交操作
mapControl.submit();
线切分面
线切分面的Action"SPLIT_BY_LINE",通过绘制的临时分割线来切分面几何对象。
![]() |
图:线切分面 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为线切分面
//设置对象操作类型为线切分面
mapControl.setAction(Action.SPLIT_BY_LINE);
第三步:在设备上进行交互式操作
触发“线切分面”动作,在要切分的面对象上绘制一条跨越面对象的线,提交后,即可查看结果。
第四步:提交操作
mapControl.submit();

- 只有临时分割线完全穿过可编辑的面几何对象,该几何对象才会被分割,如下面的示意图所示。
- 一条临时分割线一次只能切割一个面对象。
![]() |
图:线切分面 |
面切分面
面切分面的Action“SPLIT_BY_REGION”,通过绘制的临时分割面来切分面几何对象。
![]() |
图:面切分面 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为面切分面
//设置对象操作类型为面切分面
mapControl.setAction(Action.SPLIT_BY_REGION);
第三步:在设备上进行交互式操作
触发“面切分面”动作,在要切分的面对象上绘制一个临时分割面对象,提交后,即可查看结果。
第四步:提交操作
mapControl.submit();
导洞
生成导洞
生成导洞的Action“COMPOSE_HOLLOW_REGION” ,用于选择两个或两个以上的面对象,进行生成岛洞操作。
![]() |
图:生成导洞 |
说明:
- 岛洞多边形使用于面图层或者 CAD 图层。
- 选择两个或两个以上的面对象,进行岛洞多边形操作,会有以下几种情况:
- 如果选择的面对象互不相交,则会生成一个复杂对象。
![]() |
图:不相交岛洞 |
- 如果选择的面对象相交于点或线,则这些面对象被合并成一个复杂对象。
![]() |
图:点/线相交导洞 |
- 如果选择的面对象相交于面但不重合,当面对象个数为奇数时,面对象相交部分被保留,结果得到一个复杂对象;当面对象个数为偶数时,面对象相交部分被删除,结果得到一个复杂对象。
![]() |
图:奇偶面导洞 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为生成岛洞
//设置对象操作类型为生成岛洞
mapControl.setAction(Action.COMPOSE_HOLLOW_REGION);
第三步:在设备上进行交互式操作
触发“生成岛洞”动作, 依次单击选择多个相交于面但不重合的面对象,提交后,即可查看结果。
第四步:提交操作
mapControl.submit();
手绘导洞
手绘导洞的Action“DRAW_HOLLOW_REGION” ,通过在面对象上叠加绘面,绘制岛洞对象。
![]() |
图:手绘导洞 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为手绘岛洞
//设置对象操作类型手绘岛洞
mapControl.setAction(Action.DRAW_HOLLOW_REGION);
第三步:在设备上交互式进行手绘岛洞操作
触发“手绘岛洞”动作, 在面对象上绘制相交于面但不重合的面对象,提交后,即可查看结果。
第四步:提交操作
mapControl.submit();
填充导洞
填充导洞的Action“FILL_HOLLOW_REGION” ,通过在要填充的岛洞上绘制一条跨越岛洞的线,将岛洞对象填充成为一个简单面对象。
![]() |
图:填充导洞 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为填充岛洞
//设置对象操作类型为填充岛洞
mapControl.setAction(Action.FILL_HOLLOW_REGION);
第三步:在设备上交互式进行填充岛洞操作并提交
触发“填充岛洞”动作,在要填充的岛洞对象上绘制一条跨越岛洞的线,提交后,即可查看结果。
第四步:提交操作
mapControl.submit();
补充导洞
补充导洞的Action“PATCH_HOLLOW_REGION” ,通过在要补充的岛洞上绘制一条跨越岛洞的线,绘制新的面对象对岛洞缺失部分进行补充。
![]() |
图:补充导洞 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为补充岛洞
//设置对象操作类型为补充岛洞
mapControl.setAction(Action.PATCH_HOLLOW_REGION);
第三步:在设备上交互式进行补充岛洞操作
触发“补充岛洞”动作,在要补充的岛洞对象上绘制一条跨越岛洞的线,提交后,即可查看结果。
第四步:提交操作
mapControl.submit();
公共边构面
公共边构面的Action“CREATE_POSITIONAL_REGION” 。
![]() |
图:公共边构面 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为公共边构面
//设置对象操作类型为公共边构面
mapControl.setAction(Action.CREATE_POSITIONAL_REGION);
第三步:在设备上进行交互式操作并提交
触发“公共边构面”动作,在进行公共边构面的原有面对象边缘指定区域绘制一个临时构面区域,提交后,即可查看结果。
第四步:提交操作
mapControl.submit();
多边形补洞
多边形补洞的Action“PATCH_POSOTIONAL_REGION”,用于补充多个面对象包围形成的闭合空间。
![]() |
图:多边形补洞 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为多对象补洞
//设置对象操作类型为多对象补洞
mapControl.setAction(Action.PATCH_POSOTIONAL_REGION);
第三步:在设备上进行交互式操作
触发“多对象补洞”动作, 在要补充的位置绘制一个包含多对象围成的闭合空间的临时面对象,提交后,即可查看结果。
第四步:提交操作
mapControl.submit();
协调编辑
协调编辑的Action“MOVE_COMMON_NODE” ,通过调整两个或多个面对象的公共边上的节点来实现同时调整两个或多个具有公共边对象的形状。
![]() |
图:协调编辑 |
实现步骤:
第一步:操作图层设置
//设置图层可显示,true,表示图层可显示,false,表示图层不显示。
layer. setVisible (true);
//设置操作图层可编辑,true,表示矢量图层可编辑,false,表示矢量图层不可编辑。
layer.setEditable(true);
//设置操作图层可选择,true,表示矢量图层可选择,false,表示矢量图层不可选择。
layer.setSelectable(true);
第二步:设置对象操作类型为单选
//设置对象操作类型为单选
mapControl.setAction(Action.SELECT);
第三步:设置对象操作类型为协调编辑
//设置对象操作类型为协调编辑 mapControl.setAction(Action.MOVE_COMMON_NODE);
第四步:在设备上进行交互式操作并提交
触发“单选”动作,在地图窗口中的可编辑图层中点选要进行协调编辑的两个或多个面对象中的一个,抬起手指,选中要调整的节点,拖动节点调整面对象的形状,提交后,即可查看结果。
第五步:提交操作
mapControl.submit();
以上拓扑式编辑,可参照示例代码TopoDataprocess。