ArcMap的Editor工具,实现要素拖动、编

上传人:飞*** 文档编号:37887665 上传时间:2018-04-24 格式:PDF 页数:13 大小:127.23KB
返回 下载 相关 举报
ArcMap的Editor工具,实现要素拖动、编_第1页
第1页 / 共13页
ArcMap的Editor工具,实现要素拖动、编_第2页
第2页 / 共13页
ArcMap的Editor工具,实现要素拖动、编_第3页
第3页 / 共13页
ArcMap的Editor工具,实现要素拖动、编_第4页
第4页 / 共13页
ArcMap的Editor工具,实现要素拖动、编_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《ArcMap的Editor工具,实现要素拖动、编》由会员分享,可在线阅读,更多相关《ArcMap的Editor工具,实现要素拖动、编(13页珍藏版)》请在金锄头文库上搜索。

1、ArcMap的 Editor工具,实现要素拖动、编辑。本来根本没有写这个工具的意思,自己一直用的Ae 自带的工具。虽然可控制力弱了一些,但终究还是凑或能用。一天,问到一个同学,想请教一下,居然以百般理由回绝。算了,秉承毛老人家的口号:自力更生,丰衣足食!好了,闲话少说,各位看官,咱步入正题了。首先,说一下,所有的要素的更新、插入、删除最好放在编辑的Session 里面,即以一对StartEditing和 StopEditing包裹。一开始我的疑问在于,为什么我用IWorkspaceEdit的 StartEditing方法后,怎么鼠标不会变成AcrMap里面 Editor的开始编辑那样呢, 为什

2、么不能选中要素, 为什么不能双击后编辑要素?原来,选中要素和使要素处于编辑状态还是要自己写的(经高人指点,呵呵 )。先介绍一下程序中用到的变量:Code 那我们就按照逻辑顺序来一一展示这个到底是怎么做的。首先是,开始和结束编辑的代码:/开始编辑/ publicvoid StartEditing(bool bWithUndoRedo) if (m_SelectedLayer = null) return; IFeatureLayer featureLayer = m_SelectedLayer as IFeatureLayer; if (featureLayer = null) return;

3、IFeatureClass featureClass = featureLayer.FeatureClass; if (featureClass = null) return; IDataset dataset = featureClass as IDataset; IWorkspaceEdit workspaceEdit = dataset.Workspace as IWorkspaceEdit; try workspaceEdit.StartEditing(bWithUndoRedo); m_IsEdited = true; catch return; 当然你可以直接传进来IWorkspa

4、ce,这个可根据你具体的需求,我这里用当前图层获取工作空间。/结束编辑/ publicvoid StopEditing(bool bSave) if (m_IsEdited) m_IsEdited = false; if (m_SelectedLayer = null) return; IFeatureLayer featureLayer = m_SelectedLayer as IFeatureLayer; if (featureLayer = null) return; IFeatureClass featureClass = featureLayer.FeatureClass; if (

5、featureClass = null) return; IDataset dataset = featureClass as IDataset; IWorkspaceEdit workspaceEdit = dataset.Workspace as IWorkspaceEdit; if (workspaceEdit.IsBeingEdited() try workspaceEdit.StopEditing(bSave); catch workspaceEdit.AbortEditOperation(); return; 开始编辑已经好了,然后就是鼠标点击要素时候,让其处于选中状态,我这里为了

6、方便控制,我分成了两个函数写,给为看官也可以合并成一个:publicvoid GetFeatureOnMouseDown(int x, int y) m_SelectedFeature.Clear(); try if (m_SelectedLayer = null) return; IFeatureLayer featureLayer = m_SelectedLayer as IFeatureLayer; if (featureLayer = null) return; IFeatureClass featureClass = featureLayer.FeatureClass; if (fe

7、atureClass = null) return; IPoint point = m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y); IGeometry geometry = point as IGeometry; double length = ConvertPixelsToMapUnits(4); ITopologicalOperator pTopo = geometry as ITopologicalOperator; IGeometry buffer = pTopo.Buffer(

8、length); geometry = buffer.Envelope as IGeometry; ISpatialFilter spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = geometry; switch (featureClass.ShapeType) case esriGeometryType.esriGeometryPoint: spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains; break ; case es

9、riGeometryType.esriGeometryPolygon: spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; break ; case esriGeometryType.esriGeometryPolyline: spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses; break ; spatialFilter.GeometryField = featureClass.ShapeFieldName; IQue

10、ryFilter filter = spatialFilter as IQueryFilter; IFeatureCursor cursor = featureClass.Search(filter, false); IFeature pfeature = cursor.NextFeature(); while (pfeature != null) m_SelectedFeature.Add(pfeature); pfeature = cursor.NextFeature(); catch return; /根据鼠标点击位置使击中要素处于高亮显示状态/ publicvoid SelectOnM

11、ouseDown() try if (m_SelectedLayer = null) return; m_MapControl.Map.ClearSelection(); m_MapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null); foreach (IFeature feature in m_SelectedFeature.ToArray() m_MapControl.Map.SelectFeature(m_SelectedLayer, feature); m_MapCo

12、ntrol.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null); catch return; 相信大家对第一个函数并不陌生吧?对的,就是用的空间查询,把点击中的要素放进容器,再用第二个函数进行高亮显示。这个地方注意,如果数据量比较多,强烈推荐用PartialRefresh 而不要用 Refresh ,参数的含义请参考帮助。这个只是开始编辑后,可以用鼠标点击选中要素,使其处于高亮状态,然而,ArcMap里面双击要素怎么出现节点用以编辑呢?这个是要自己绘制到MapControl上面去的:/在要素

13、上面绘制一个可拖拽的符号/ publicvoid DrawEditSymbol(IGeometry geometry, IDisplay display) IEngineEditProperties engineProperty = new EngineEditorClass(); ISymbol pointSymbol = engineProperty.SketchVertexSymbol as ISymbol; ISymbol sketchSymbol = engineProperty.SketchSymbol as ISymbol; ITopologicalOperator pTopo

14、= geometry as ITopologicalOperator; sketchSymbol.SetupDC(display.hDC, display.DisplayTransformation); sketchSymbol.Draw(pTopo.Boundary); IPointCollection pointCol = geometry as IPointCollection; for ( int i = 0; i 0) IGeometryCollection pGeoColl = geometry as IGeometryCollection; vertexOffset = 0; f

15、or ( int i = 0; i /清除要素选择状态,恢复常态/ publicvoid ClearSelection() m_MapControl.Map.ClearSelection(); m_MapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, m_SelectedLayer, null); 各位看官,由于要素的移动、要素的创建和要素编辑在代码逻辑上差不多,所以我就不做过多阐述了,都是在处理鼠标的事件,需要做判断。其实,可能有看官已经了解,在AE 的帮助里面就有类似的代码,是的,我参考了这部分代码,并对ESRI的开发和工作人员表示感谢。最后,谢谢AE 开发群一叶知秋老大哥的帮助,总是在繁忙之中耐心的指导,再次表示感谢。希望大家能够有所启发,谢谢大家的支持!示例源码下载地址http:/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号