protected override DataRow CreateRow(EntityNode entityNode) { DataRow dataRow = base.CreateRow(entityNode); if (dataRow != null) { LineNode lineNode = entityNode as LineNode; if (lineNode != null) { dataRow[FieldName_LineNodeID] = m_nNewIndexID++; dataRow[FieldName_LineType] = lineNode.LineType; if (lineNode.SegmentNodes != null) { if (lineNode.SegmentNodes.Count > 0) { BrokenLineNode line = lineNode.SegmentNodes[0] as BrokenLineNode; if (line != null && line.PointInfoNodes.Count >= 2) { dataRow[FieldName_X1] = line.PointInfoNodes[0].X; dataRow[FieldName_Y1] = line.PointInfoNodes[0].Y; dataRow[FieldName_X2] = line.PointInfoNodes[1].X; dataRow[FieldName_Y2] = line.PointInfoNodes[1].Y; } } } return(dataRow); } } return(null); }
/// <summary> /// 将构面的环分解成线段集合 /// </summary> /// <param name="pRing">构面的环对象IRing</param> /// <param name="strFeatureCode">线的要素代码</param> /// <param name="strRepresentation">图形表现编码</param> /// <param name="nEntityID">面实体索引</param> /// <returns>VCT线段对象集合</returns> private List<LineNodeEx> GetLineByRing(IRing pRing,string strFeatureCode,string strRepresentation,int nEntityID) { try { List<LineNodeEx> pListLine = new List<LineNodeEx>(); ///获取每个环中的线段集合 ISegmentCollection pExRingSegmentCollection = pRing as ISegmentCollection; ///处理集合中的各个线段 for (int i = 0; i < pExRingSegmentCollection.SegmentCount; i++) { ISegment pSegment = pExRingSegmentCollection.get_Segment(i); LineNodeEx pLineNodeEx = new LineNodeEx();//构造VCT线段对象 pLineNodeEx.SegmentNodes = new SegmentNodes();//构造线段对应的点集合 //pLineNodeEx.IsReverse = bReverse;//设置方向 pLineNodeEx.FeatureCode = strFeatureCode;//设置要素代码 pLineNodeEx.Representation = strRepresentation; pLineNodeEx.PolygonID = nEntityID;///所属面的标识码 BrokenLineNode pBrokenLinNode = new BrokenLineNode();//构造折线 pBrokenLinNode.PointInfoNodes = new PointInfoNodes(); ILine pLine = pSegment as ILine; if (pLine != null) { pBrokenLinNode.PointInfoNodes.Add(new PointInfoNode(pLine.FromPoint.X, pLine.FromPoint.Y)); pBrokenLinNode.PointInfoNodes.Add(new PointInfoNode(pLine.ToPoint.X, pLine.ToPoint.Y)); } //////如果是反向 ////if (bReverse) ////{ //// PointInfoNodes tempPointInfoNodes = new PointInfoNodes(); //// foreach (PointInfoNode item in pBrokenLinNode.PointInfoNodes) //// { //// tempPointInfoNodes.Add(item); //// } //// pBrokenLinNode.PointInfoNodes = tempPointInfoNodes; ////} pLineNodeEx.SegmentNodes.Add(pBrokenLinNode); pListLine.Add(pLineNodeEx); } return pListLine; } catch(Exception ex) { LogAPI.WriteErrorLog(ex); return null; } }
/// <summary> /// 创建线实体 /// </summary> /// <param name="pITable">数据表对象</param> /// <param name="entinyNode">VCT空间实体节点</param> public override void CreateFeature(ITable pITable, EntityNode entinyNode) { try { IFeatureClass pFeatureCls = pITable as IFeatureClass; this.Feature = pFeatureCls.CreateFeature(); LineNode pLineNode = entinyNode as LineNode; if (pLineNode != null) { ///标识码赋值 int dBSMIndex = -1; dBSMIndex = this.Feature.Fields.FindField(m_strEntityIDFiled); if (dBSMIndex != -1) this.Feature.set_Value(dBSMIndex, pLineNode.EntityID); ///要素代码赋值 int dSYDMIndex = -1; dSYDMIndex = this.Feature.Fields.FindField(m_strYSDMField); if (dSYDMIndex != -1) this.Feature.set_Value(dSYDMIndex, pLineNode.FeatureCode); ///创建空间数据 int dLineNodeCount = pLineNode.SegmentNodes.Count; IPointCollection pointCollection = new PolylineClass(); for (int i = 0; i < dLineNodeCount; i++) { //11表示折线类型 if (Metadata.MetaDataFile.GraphConfig.GetGraphMark("LINETYPE", pLineNode.SegmentNodes[i].SegmentType.ToString()) == "BrokenLine") { BrokenLineNode pBLine = pLineNode.SegmentNodes[i] as BrokenLineNode; foreach (PointInfoNode pPointInfoNode in pBLine.PointInfoNodes) { IPoint pPoint = new PointClass(); pPoint.PutCoords(pPointInfoNode.X, pPointInfoNode.Y); object objType = Type.Missing; pointCollection.AddPoint(pPoint, ref objType, ref objType); } } else { //其他类型待后续扩展 } } (this.Feature as IFeature).Shape = pointCollection as IGeometry; //feature.set_Value(); this.Feature.Store(); } } catch(Exception ex) { LogAPI.WriteErrorLog(ex); } }
//public override void GetEntityNodeByDataRow(DataRow dataRow, ref EntityNode entityNode) //{ // GetLineNodeByDataRow(dataRow, entityNode, false); //} public void GetLineNodeByDataRow(DataRow dataRow, ref LineNode lineNode, bool bReverse) { if (dataRow != null) { EntityNode entityNode = lineNode as EntityNode; base.GetEntityNodeByDataRow(dataRow, ref entityNode); lineNode.IndexID = dataRow[FieldName_LineNodeID] == System.DBNull.Value ? -1 : Convert.ToInt32(dataRow[FieldName_LineNodeID]); //lineNode.EntityID = dataRow[FieldName_EntityID] == null ? -1 : Convert.ToInt32(dataRow[FieldName_EntityID]); //lineNode.FeatureCode = dataRow[FieldName_FeatureCode] == null ? "" : dataRow[FieldName_FeatureCode].ToString(); lineNode.LineType = dataRow[FieldName_LineType] == System.DBNull.Value ? -1 : Convert.ToInt32(dataRow[FieldName_LineType]); //lineNode.Representation = dataRow[FieldName_Representation] == null ? "" : dataRow[FieldName_Representation].ToString(); if (entityNode.EntityID != 0) { SegmentNodes segmentNodes = new SegmentNodes(); BrokenLineNode brokenLineNode = new BrokenLineNode(); PointInfoNodes pointInfoNodes = new PointInfoNodes(); double dX1 = dataRow[FieldName_X1] == DBNull.Value ? 0.0 : Convert.ToDouble(dataRow[FieldName_X1]); double dY1 = dataRow[FieldName_Y1] == DBNull.Value ? 0.0 : Convert.ToDouble(dataRow[FieldName_Y1]); PointInfoNode pointInfoNode1 = new PointInfoNode(dX1, dY1); double dX2 = dataRow[FieldName_X2] == DBNull.Value ? 0.0 : Convert.ToDouble(dataRow[FieldName_X2]); double dY2 = dataRow[FieldName_Y2] == DBNull.Value ? 0.0 : Convert.ToDouble(dataRow[FieldName_Y2]); PointInfoNode pointInfoNode2 = new PointInfoNode(dX2, dY2); if (bReverse == true) { pointInfoNodes.Add(pointInfoNode2); pointInfoNodes.Add(pointInfoNode1); } else { pointInfoNodes.Add(pointInfoNode1); pointInfoNodes.Add(pointInfoNode2); } brokenLineNode.PointInfoNodes = pointInfoNodes; segmentNodes.Add(brokenLineNode); lineNode.SegmentNodes = segmentNodes; } } }
/// <summary> /// 根据vct线段获取点集合 /// </summary> /// <param name="pLineNodeEx"></param> /// <returns></returns> private IPointCollection GetPointCollection(LineNodeEx pLineNodeEx, IPoint pPrePoint) { //沈迎志修改,注意线的方向 try { IPointCollection pPtCollection = new PolylineClass(); if (pLineNodeEx.IsReverse == false) { for (int i = 0; i < pLineNodeEx.SegmentNodes.Count; i++) { BrokenLineNode pBLineNode = pLineNodeEx.SegmentNodes[i] as BrokenLineNode; if (pBLineNode != null) { for (int j = 0; j < pBLineNode.PointInfoNodes.Count; j++) { if (i == 0 && j == 0 && pPrePoint != null) continue; PointInfoNode itemInfoNode = pBLineNode.PointInfoNodes[j]; IPoint pPoint = new PointClass(); pPoint.PutCoords(itemInfoNode.X, itemInfoNode.Y); object objTypemissing = Type.Missing; pPtCollection.AddPoint(pPoint, ref objTypemissing, ref objTypemissing); } } } } else { for (int i = pLineNodeEx.SegmentNodes.Count - 1; i >= 0; i--) { BrokenLineNode pBLineNode = pLineNodeEx.SegmentNodes[i] as BrokenLineNode; if (pBLineNode != null) { for (int j = pBLineNode.PointInfoNodes.Count - 1; j >= 0; j--) { if (i == pLineNodeEx.SegmentNodes.Count - 1 && j == pBLineNode.PointInfoNodes.Count - 1 && pPrePoint != null) continue; PointInfoNode itemInfoNode = pBLineNode.PointInfoNodes[j]; IPoint pPoint = new PointClass(); pPoint.PutCoords(itemInfoNode.X, itemInfoNode.Y); object objTypemissing = Type.Missing; pPtCollection.AddPoint(pPoint, ref objTypemissing, ref objTypemissing); } } } } /* ///构造线段 for (int j = 0; j < pLineNodeEx.SegmentNodes.Count; j++) { BrokenLineNode pBLineNode = pLineNodeEx.SegmentNodes[j] as BrokenLineNode; bool bNewBeginPoint = true;///表示正在处理折线的起点 foreach (PointInfoNode itemInfoNode in pBLineNode.PointInfoNodes) { if (bNewBeginPoint&&pPrePoint != null && itemInfoNode.X == pPrePoint.X &&itemInfoNode.Y==pPrePoint.Y) { ///如果是前一个线段终点和后一个线段起点相同则不添加到构面点集合中 continue; } ///将点添加到构线集合中 IPoint pPoint = new PointClass(); pPoint.PutCoords(itemInfoNode.X, itemInfoNode.Y); object objTypemissing = Type.Missing; pPtCollection.AddPoint(pPoint, ref objTypemissing, ref objTypemissing); } bNewBeginPoint = false;///当前的起点处理完成 } if (pLineNodeEx.IsReverse) { ///方向构造闭合环 object objTypeMissing = Type.Missing; IPointCollection pPtReserveCollection = new RingClass(); ///反向添加点集合数据 for (int k = pPtCollection.PointCount; k >= 0; k--) { pPtReserveCollection.AddPoint(pPtCollection.get_Point(k), ref objTypeMissing, ref objTypeMissing); } return pPtReserveCollection; } */ return pPtCollection; } catch(Exception ex) { LogAPI.WriteErrorLog(ex); return null; } }
/// <summary> /// 获取VCT线实体节点 /// </summary> public override EntityNode GetEntityNode() { try { LineNode pLineNode = new LineNode(); pLineNode.SegmentNodes = new SegmentNodes(); IFeature pFeature = this.Feature as IFeature; //特征类型统一设置为1 pLineNode.LineType = 1; ///标识码赋值 int dBSMIndex = -1; dBSMIndex = this.Feature.Fields.FindField(m_strEntityIDFiled); if (dBSMIndex != -1) pLineNode.EntityID = Convert.ToInt32(this.Feature.get_Value(dBSMIndex)); ///要素代码赋值 //int dSYDMIndex = -1; //dSYDMIndex = this.Feature.Fields.FindField(m_strYSDMField); //if (dSYDMIndex != -1) // pLineNode.FeatureCode = this.Feature.get_Value(dSYDMIndex).ToString(); //string sAttriTableName = (pFeature.Class as IDataset).Name; //pLineNode.FeatureCode = MetaDataFile.GetFeatureCodeByName(sAttriTableName); pLineNode.FeatureCode = this.FeatureCode; ///图形表现编码 //pLineNode.Representation = pFeature.Class.AliasName; ///add by 曾平 2011-9-7 添加裁切 IGeometry pFeatureGeometry = null; if (m_bCut) { pFeatureGeometry = GetSubGeometry(); if (pFeatureGeometry == null) { pFeatureGeometry = pFeature.Shape; } } else { pFeatureGeometry = pFeature.Shape; } IPolyline pPolygon =pFeatureGeometry as IPolyline; ///构造节点数据 IPointCollection pPointCollection = pPolygon as IPointCollection; BrokenLineNode pBLineNode = new BrokenLineNode(); pBLineNode.PointInfoNodes = new PointInfoNodes(); for (int i = 0; i < pPointCollection.PointCount; i++) { IPoint pPoint = pPointCollection.get_Point(i); PointInfoNode pInfoNode1 = new PointInfoNode(pPoint.X, pPoint.Y); pBLineNode.PointInfoNodes.Add(pInfoNode1); } pLineNode.SegmentNodes.Add(pBLineNode); return pLineNode; } catch (Exception ex) { LogAPI.WriteErrorLog(ex); return null; } }