private void CreatePolygonsFromFeatures(IFeatureClass getpolygon_fc) { IDataset dataset = getpolygon_fc as IDataset; IWorkspaceEdit workspace = dataset.Workspace as IWorkspaceEdit; if (!workspace.IsBeingEdited()) { workspace.StartEditing(true); if (!workspace.IsBeingEdited()) { return; } workspace.StartEditOperation(); } IFeatureConstruction construction = new FeatureConstructionClass(); IEnumFeature featureSelection = this.m_hookHelper.FocusMap.FeatureSelection as IEnumFeature; if (featureSelection.Next() != null) { construction.ConstructPolygonsFromFeatures(null, getpolygon_fc, null, false, false, featureSelection, null, 0.01, null); } }
/// <summary> /// 由小区道路生成内部地块 /// </summary> /// <param name="getpolygon_fc"></param> /// <param name="fromline_fl"></param> private void createpolygonfromline(IFeatureClass getpolygon_fc, IFeatureLayer fromline_fl) { //判断getpolygon_fc是否为面 if (getpolygon_fc.ShapeType != esriGeometryType.esriGeometryPolygon) { MessageBox.Show("目标图层不是多边形图层!"); System.Console.WriteLine("目标图层不是多边形图层!"); return; } //得到选择的Feature的指针 IFeatureSelection pFeatureSelection = fromline_fl as IFeatureSelection; ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet; ICursor pCursor; pSelectionSet.Search(null, false, out pCursor); IFeatureCursor pFeatureCursor = pCursor as IFeatureCursor; IGeoDataset pGeoDataset = getpolygon_fc as IGeoDataset; IEnvelope pEnvelope = pGeoDataset.Extent; IInvalidArea pInvalidArea = new InvalidAreaClass(); IFeatureConstruction pFeatureConstruction = new FeatureConstructionClass(); IDataset pDataset = getpolygon_fc as IDataset; IWorkspace pWorkspace = pDataset.Workspace; IWorkspaceEdit pWorkspaceEdit = pWorkspace as IWorkspaceEdit; if (pWorkspaceEdit.IsBeingEdited() != true) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } //开始 try { pFeatureConstruction.ConstructPolygonsFromFeaturesFromCursor(null, getpolygon_fc, pEnvelope, true, false, pFeatureCursor, pInvalidArea, -1, null); pWorkspaceEdit.StopEditOperation(); pWorkspaceEdit.StopEditing(true); } catch { MessageBox.Show("构造多边形失败!"); System.Console.WriteLine("构造多边形失败!"); pWorkspaceEdit.AbortEditOperation(); } //获取FeatureClass IWorkspace editedWorkspace = pWorkspaceEdit as IWorkspace; IEnumDataset FeatureEnumDataset = editedWorkspace.get_Datasets(esriDatasetType.esriDTFeatureClass); if (FeatureEnumDataset == null) { return; } FeatureEnumDataset.Reset(); IDataset editedDataset = FeatureEnumDataset.Next(); IFeatureClass pFC = editedDataset as IFeatureClass; //错误写法 //IFeatureWorkspace pFeatureWorkspace = pWorkspaceEdit as IFeatureWorkspace; //IFeatureDataset pFeatureDataset = pFeatureWorkspace as IFeatureDataset; //IFeatureClass pFC = pFeatureDataset as IFeatureClass; //将生成面元素显示在图层中 IFeatureLayer pFLayer = new FeatureLayerClass(); pFLayer.FeatureClass = pFC; pFLayer.Name = pFC.AliasName;//保存为“生成地块.shp” ILayer pLayer = pFLayer as ILayer; Form1.mainForm.axMapControl1.Map.AddLayer(pLayer); Form1.mainForm.axMapControl1.ActiveView.Refresh(); }
public void OnDblClick() { Editor.UniqueInstance.CheckOverlap = false; try { IFeatureLayer targetLayer = Editor.UniqueInstance.TargetLayer; object missing = Type.Missing; if (!this.m_IsUsed || (this.m_LineFeedback == null)) { return; } if (this.m_Step > 1) { IPolyline polyline = this.m_LineFeedback.Stop(); if (polyline == null) { this.Init(); return; } IFeatureClass featureClass = targetLayer.FeatureClass; if (featureClass == null) { this.Init(); return; } IGeoDataset dataset = featureClass as IGeoDataset; if (polyline.SpatialReference != dataset.SpatialReference) { polyline.Project(dataset.SpatialReference); polyline.SpatialReference = dataset.SpatialReference; } IGeometry inGeometry = polyline; GeometryBagClass lineSrc = new GeometryBagClass(); lineSrc.AddGeometry(inGeometry, ref missing, ref missing); targetLayer.Selectable = true; IDataset dataset2 = featureClass as IDataset; IWorkspace selectionWorkspace = dataset2.Workspace; IEnvelope extent = dataset.Extent; IInvalidArea invalidArea = new InvalidAreaClass(); IFeatureConstruction construction = new FeatureConstructionClass(); IFeatureSelection selection = targetLayer as IFeatureSelection; ISelectionSet selectionSet = selection.SelectionSet; Editor.UniqueInstance.SetArea = false; Editor.UniqueInstance.StartEditOperation(); ISpatialReferenceTolerance spatialReference = (ISpatialReferenceTolerance)dataset.SpatialReference; construction.AutoCompleteFromGeometries(featureClass, extent, lineSrc, invalidArea, spatialReference.XYTolerance, selectionWorkspace, out selectionSet); if ((selectionSet == null) || (selectionSet.Count < 1)) { Editor.UniqueInstance.AbortEditOperation(); } else { List <IFeature> pFeatureList = new List <IFeature>(); IEnumIDs iDs = selectionSet.IDs; iDs.Reset(); for (int i = iDs.Next(); i >= 0; i = iDs.Next()) { IFeature pFeature = featureClass.GetFeature(i); FeatureFuncs.SetFeatureArea(pFeature); pFeatureList.Add(pFeature); } if (selectionSet.Count == 1) { IFeature feature = pFeatureList[0]; selection.Clear(); selection.Add(feature); AttributeManager.AttributeAddHandleClass.AttributeAdd(ref feature); } else { AttributeManager.AttributeSplitHandleClass.AttributeSplit(null, ref pFeatureList); } Editor.UniqueInstance.StopEditOperation("AutoComplete"); } Editor.UniqueInstance.SetArea = true; this.m_hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection | esriViewDrawPhase.esriViewGeography, null, this.m_hookHelper.ActiveView.Extent); } } catch (Exception exception) { this.mErrOpt.ErrorOperate(this.mSubSysName, "ShapeEdit.AutoComplete", "OnDblClick", exception.GetHashCode().ToString(), exception.Source, exception.Message, "", "", ""); } this.Init(); Editor.UniqueInstance.CheckOverlap = true; }