//在view中加载图形,和同步图形 void SyncToView() { IView view = InputCB.SelectedItem as IView; //为图形赋值“Name”属性,以便图形和数据关联 foreach (int slID in _slsGraphics.Keys) { SegmentLining sl = _allSLs[slID] as SegmentLining; IGraphicCollection gc = _slsGraphics[slID]; foreach (IGraphic g in gc) { g.Attributes["Name"] = sl.name; } } //将图形添加到view中 string layerID = "DemoLayer"; //图层ID IGraphicsLayer gLayer = getDemoLayer(view, layerID); //获取图层函数 foreach (int id in _slsGraphics.Keys) { IGraphicCollection gc = _slsGraphics[id]; gLayer.addGraphics(gc); } //使数据与图形关联 List <DGObject> sls = _allSLs.merge(); gLayer.syncObjects(sls); //计算新建图形范围,并在地图中显示该范围 IEnvelope ext = null; foreach (IGraphicCollection gc in _slsGraphics.Values) { IEnvelope itemExt = GraphicsUtil.GetGraphicsEnvelope(gc); if (ext == null) { ext = itemExt; } else { ext = ext.Union(itemExt); } } _mainFrame.activeView = view; view.zoomTo(ext); }
void StartAnalysis() { //获取输入的view和复制坐标系 IView view = InputCB.SelectedItem as IView; _spatialRef = view.spatialReference; //开始分析 foreach (string SLLayerID in _selectedSLsDict.Keys) { //获取衬砌选中列表 IEnumerable <DGObject> sls = _selectedSLsDict[SLLayerID]; List <DGObject> slList = sls.ToList(); IGraphicsLayer gLayer = _inputView.getLayer(SLLayerID); foreach (DGObject dg in slList) { //获取单个衬砌对象,计算评估等级 SegmentLining sl = dg as SegmentLining; SLConvergenceRecordType slConvergenceRecordType = sl.ConstructionRecord.SLConvergenceRecords; if (slConvergenceRecordType.SLConvergenceItems.Count == 0) { continue; } SLConvergenceItem slConvergenceItem = slConvergenceRecordType.SLConvergenceItems[0]; if (slConvergenceItem.HorizontalDev == double.NaN) { continue; } double raduis = (double)slConvergenceItem.HorizontalRad; double deviation = (double)slConvergenceItem.HorizontalDev; double ratio = deviation / (raduis - deviation) * 1000; int grade; if (ratio <= 3) { grade = 5; } else if (ratio <= 5) { grade = 4; } else if (ratio <= 8) { grade = 3; } else if (ratio <= 10) { grade = 2; } else { grade = 1; } //根据评估等级获取图形样式 ISymbol symbol = GetSymbol(grade); //为了演示,采用了较复杂的方法 //<简便方法 可替换下面代码> //IGraphicCollection gcollection = gLayer.getGraphics(sl); //IGraphic g = gcollection[0]; //g.Symbol = symbol; //IGraphicCollection gc = Runtime.graphicEngine.newGraphicCollection(); //gc.Add(g); //_slsGraphics[sl.id] = gc; //</简便方法> //获取衬砌图形 IGraphicCollection gcollection = gLayer.getGraphics(sl); IGraphic g = gcollection[0]; IPolygon polygon = g.Geometry as IPolygon; IPointCollection pointCollection = polygon.GetPoints(); //获取端点 //衬砌为长方形,故有四个点 IMapPoint p1_temp = pointCollection[0]; IMapPoint p2_temp = pointCollection[1]; IMapPoint p3_temp = pointCollection[2]; IMapPoint p4_temp = pointCollection[3]; //新建新的点,注意复制坐标系 IMapPoint p1 = Runtime.geometryEngine.newMapPoint(p1_temp.X, p1_temp.Y, _spatialRef); IMapPoint p2 = Runtime.geometryEngine.newMapPoint(p2_temp.X, p2_temp.Y, _spatialRef); IMapPoint p3 = Runtime.geometryEngine.newMapPoint(p3_temp.X, p3_temp.Y, _spatialRef); IMapPoint p4 = Runtime.geometryEngine.newMapPoint(p4_temp.X, p4_temp.Y, _spatialRef); //生成新的图形 g = Runtime.graphicEngine.newQuadrilateral(p1, p2, p3, p4); g.Symbol = symbol; IGraphicCollection gc = Runtime.graphicEngine.newGraphicCollection(); gc.Add(g); _slsGraphics[sl.id] = gc; //保存结果 } } }