/// <summary> /// return all towers /// </summary> /// <returns></returns> public Towers GetTowers() { Towers towers = new Towers(); IFeatureWorkspace pFWorkspace = (IFeatureWorkspace)_workspace; IFeatureClass pTowerFC = pFWorkspace.OpenFeatureClass("Towers"); IFeatureCursor pFcursor = pTowerFC.Search(null, false); IFeature pFeature = pFcursor.NextFeature(); while (pFeature != null) { Tower tower = this.GetTower(pFeature); towers.Items.Add(tower); pFeature = pFcursor.NextFeature(); } return(towers); }
/// <summary> /// Generate the tower coverage /// </summary> public void GenerateTowerCoverage(Towers pTowers) { IWorkspaceEdit pWorkspaceEdit; pWorkspaceEdit = (IWorkspaceEdit)this._workspace; try { IFeatureWorkspace pFWorkspace = (IFeatureWorkspace)pWorkspaceEdit; IFeatureClass pTowerRangeFC = pFWorkspace.OpenFeatureClass("TowerRange"); pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); //delete all ranges , we should later change that to delete only dirty towers IFeatureCursor pcursor = pTowerRangeFC.Update(null, false); IFeature pfeaturerange = pcursor.NextFeature(); while (pfeaturerange != null) { //we need to change that later pfeaturerange.Delete(); pfeaturerange = pcursor.NextFeature(); } foreach (Tower pTower in pTowers.Items) { ITopologicalOperator pTopo = (ITopologicalOperator)pTower.TowerLocation; IPolygon range3Bars = (IPolygon)pTopo.Buffer(pTower.TowerCoverage / 3); IPolygon range2BarsWhole = (IPolygon)pTopo.Buffer((pTower.TowerCoverage * 2) / 3); IPolygon range1BarsWhole = (IPolygon)pTopo.Buffer(pTower.TowerCoverage); ITopologicalOperator pIntTopo = (ITopologicalOperator)range2BarsWhole; ITopologicalOperator pIntTopo1 = (ITopologicalOperator)range1BarsWhole; IPolygon range2BarsDonut = (IPolygon)pIntTopo.SymmetricDifference(range3Bars); //,esriGeometryDimension.esriGeometry2Dimension); IPolygon range1BarsDonut = (IPolygon)pIntTopo1.SymmetricDifference(range2BarsWhole); //,esriGeometryDimension.esriGeometry2Dimension); IFeature pFeature = pTowerRangeFC.CreateFeature(); pFeature.set_Value(pFeature.Fields.FindField("TOWERID"), "T04"); pFeature.set_Value(pFeature.Fields.FindField("RANGE"), 3); pFeature.Shape = range3Bars; pFeature.Store(); IFeature pFeature2Bar = pTowerRangeFC.CreateFeature(); pFeature2Bar.set_Value(pFeature.Fields.FindField("TOWERID"), "T04"); pFeature2Bar.set_Value(pFeature.Fields.FindField("RANGE"), 2); pFeature2Bar.Shape = range2BarsDonut; pFeature2Bar.Store(); IFeature pFeature1Bar = pTowerRangeFC.CreateFeature(); pFeature1Bar.set_Value(pFeature1Bar.Fields.FindField("TOWERID"), "T04"); pFeature1Bar.set_Value(pFeature1Bar.Fields.FindField("RANGE"), 1); pFeature1Bar.Shape = range1BarsDonut; pFeature1Bar.Store(); } pWorkspaceEdit.StopEditOperation(); pWorkspaceEdit.StopEditing(true); } catch (Exception ex) { //if anything went wrong, just roll back pWorkspaceEdit.AbortEditOperation(); System.Windows.Forms.MessageBox.Show(ex.ToString()); } }
protected override void OnClick() { try { IMxDocument pMxdoc = (IMxDocument)ArcMap.Application.Document; IFeatureLayer pfeaturelayer = (IFeatureLayer)pMxdoc.ActiveView.FocusMap.Layer[0]; IDataset pDS = (IDataset)pfeaturelayer.FeatureClass; TowerManager tm = new TowerManager(pDS.Workspace); Towers towers = tm.GetTowers(); tm.GenerateTowerCoverage(towers); pMxdoc.ActiveView.Refresh(); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.ToString()); } //IMxDocument pMxdoc = (IMxDocument)ArcMap.Application.Document; //IFeatureLayer pfeaturelayer = (IFeatureLayer)pMxdoc.ActiveView.FocusMap.Layer[0]; //IDataset pDS = (IDataset)pfeaturelayer.FeatureClass; //TowerManager tm = new TowerManager(pDS.Workspace); //Tower pTower = tm.GetTowerByID("T04"); //// range of 100 meters //int towerRange = 100; //ITopologicalOperator pTopo = (ITopologicalOperator)pTower.TowerLocation; //IPolygon range3Bars = (IPolygon)pTopo.Buffer(towerRange / 3); //IPolygon range2BarsWhole = (IPolygon)pTopo.Buffer(towerRange * 2 / 3); //ITopologicalOperator pIntTopo = (ITopologicalOperator)range2BarsWhole; //IPolygon range2BarsDonut = (IPolygon)pIntTopo.SymmetricDifference(range3Bars); //IPolygon range1BarWhole = (IPolygon)pTopo.Buffer(towerRange); //ITopologicalOperator pIntTopo2 = (ITopologicalOperator)range1BarWhole; //IPolygon range1BarDonut = (IPolygon)pIntTopo2.SymmetricDifference(range2BarsWhole); //// Start editing session to create features //IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pDS.Workspace; //pWorkspaceEdit.StartEditing(true); //pWorkspaceEdit.StartEditOperation(); //// Get feature class to edit //IFeatureWorkspace pFWorkspace = (IFeatureWorkspace)pWorkspaceEdit; //IFeatureClass pTowerRangeFC = pFWorkspace.OpenFeatureClass("TowerRange"); //// Create range 3 bars //IFeature pFeature3Bar = pTowerRangeFC.CreateFeature(); //pFeature3Bar.set_Value(pFeature3Bar.Fields.FindField("TOWERID"), "T04"); //pFeature3Bar.set_Value(pFeature3Bar.Fields.FindField("RANGE"), 3); //pFeature3Bar.Shape = range3Bars; //pFeature3Bar.Store(); //// Create range 2 bars //IFeature pFeature2Bar = pTowerRangeFC.CreateFeature(); //pFeature2Bar.set_Value(pFeature2Bar.Fields.FindField("TOWERID"), "T04"); //pFeature2Bar.set_Value(pFeature2Bar.Fields.FindField("RANGE"), 2); //pFeature2Bar.Shape = range2BarsDonut; //pFeature2Bar.Store(); //// Create range 1 bar //IFeature pFeature1Bar = pTowerRangeFC.CreateFeature(); //pFeature1Bar.set_Value(pFeature1Bar.Fields.FindField("TOWERID"), "T04"); //pFeature1Bar.set_Value(pFeature1Bar.Fields.FindField("RANGE"), 1); //pFeature1Bar.Shape = range1BarDonut; //pFeature1Bar.Store(); //// End editing session //pWorkspaceEdit.StopEditOperation(); //pWorkspaceEdit.StopEditing(true); }