private IFeature ExtractGeographicData(XmlNode c) { string geoData = string.Empty; Geometry geo = null; if (_typeGeometry == FeatureType.Point) { foreach (XmlNode e in c) { if (e.LocalName == Geometry) { geoData = e.InnerText; } } string point = Convert.ToString(geoData); var pointValue = point.Split(' '); geo = new Point( Convert.ToDouble(pointValue[0], CultureInfo.InvariantCulture), Convert.ToDouble(pointValue[1], CultureInfo.InvariantCulture)); } if (_typeGeometry == FeatureType.Polygon) { foreach (XmlNode e in c) { if (e.LocalName == Geometry) { var t = e.FirstChild.OuterXml; var s = new XmlSerializer(typeof(MultiSurfaceType)); MultiSurfaceType multi = s.Deserialize(new StringReader(t)) as MultiSurfaceType; geo = GetPolygon(multi); // geoData = e.InnerText; } } } if (_typeGeometry == FeatureType.Line) { foreach (XmlNode e in c) { if (e.LocalName == Geometry) { var t = e.FirstChild.OuterXml; var s = new XmlSerializer(typeof(MultiLineStringType)); MultiLineStringType multi = s.Deserialize(new StringReader(t)) as MultiLineStringType; geo = GetPolyline(multi); // geoData = e.InnerText; } } } IFeature feat = Fea.AddFeature(geo); return(feat); }
private void PipeRoadCheck() { string str; DataTable dt = GetDataTableByStruture(); IFeatureClass pntFeaClass; IFeatureClass parcFeaClass; IFeature Fea; IPolygon pPolygon = null; ITopologicalOperator TopologicalOperator = null; ISpatialFilter pSpatial = new SpatialFilterClass(); //获取交叉面 List <DF2DFeatureClass> list = Dictionary2DTable.Instance.GetFeatureClassByFacilityClassName("TRAPLY500"); if (list == null || list.Count == 0) { return; } WaitForm.Start("开始道路检查..", "请稍后"); foreach (DF2DFeatureClass dfcc in list) { pFeatureClass = dfcc.GetFeatureClass(); if (pFeatureClass == null) { continue; } FacilityClass fac = dfcc.GetFacilityClass(); if (fac == null) { continue; } List <DFDataConfig.Class.FieldInfo> listField = fac.FieldInfoCollection; DFDataConfig.Class.FieldInfo fi = fac.GetFieldInfoBySystemName("Name"); if (fi == null) { continue; } IFeatureCursor pFeaCursor = pFeatureClass.Search(null, false); Fea = pFeaCursor.NextFeature(); while (Fea != null) { string fielName = Fea.get_Value(pFeatureClass.FindField(fi.Name)).ToString(); pSpatial.Geometry = Fea.Shape; pSpatial.GeometryField = fi.Name; pSpatial.SpatialRel = esriSpatialRelEnum.esriSpatialRelOverlaps; IFeatureCursor pFeaCur = pFeatureClass.Search(pSpatial, false); IFeature pFea = pFeaCur.NextFeature(); while (pFea != null) { TopologicalOperator = pFea.Shape as ITopologicalOperator; pPolygon = (IPolygon)TopologicalOperator.Intersect((IGeometry)Fea.Shape, esriGeometryDimension.esriGeometry2Dimension); if ((pPolygon != null) && (pPolygon.GeometryType == esriGeometryType.esriGeometryPolygon)) { string FielName = pFea.get_Value(pFeatureClass.Fields.FindField(fi.Name)).ToString(); if (fielName != FielName) { PolyRoad.Add(pPolygon); string roadName = fielName + "与" + FielName + "的交岔口"; IntersectRoad.Add(roadName); Hashtable.Add(pPolygon, roadName); //Console.WriteLine(pFea.OID + "," + roadName); } } pFea = pFeaCur.NextFeature(); } Fea = pFeaCursor.NextFeature(); } } //遍历交岔面获取点OID int n = 0; foreach (IPolygon Polygon in PolyRoad) { List <DF2DFeatureClass> List = Dictionary2DTable.Instance.GetFeatureClassByFacilityClassName("PipeNode"); if (List == null) { return; } foreach (DF2DFeatureClass dfcc in List) { pntFeaClass = dfcc.GetFeatureClass(); if (pntFeaClass == null) { continue; } FacilityClass fac = dfcc.GetFacilityClass(); if (fac == null) { continue; } List <DFDataConfig.Class.FieldInfo> listField = fac.FieldInfoCollection; DFDataConfig.Class.FieldInfo fi = fac.GetFieldInfoBySystemName("Road"); if (fi == null) { continue; } DFDataConfig.Class.FieldInfo fi1 = fac.GetFieldInfoBySystemName("Detectid"); if (fi1 == null) { continue; } WaitForm.SetCaption(pntFeaClass.AliasName); pSpatial.Geometry = Polygon; pSpatial.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains; IFeatureCursor FeaCursor = pntFeaClass.Search(pSpatial, true); IFeature pFea = FeaCursor.NextFeature(); foreach (DictionaryEntry de in Hashtable) { if (de.Key == Polygon) { string Name = de.Value.ToString(); Console.WriteLine(Name); } } while (pFea != null) { str = pFea.get_Value(pntFeaClass.Fields.FindField(fi.Name)).ToString(); string pFeaID = pFea.get_Value(pntFeaClass.Fields.FindField(fi1.Name)).ToString(); RoadPtDETEID.Add(pFeaID); int PtRoadID = pFea.OID; IntersectPtRoadID.Add(PtRoadID); if (IntersectRoad.Contains(str) == false) { DataRow dr = dt.NewRow(); dr["ErrorFeatureID"] = pFea.OID; dr["FeatureofClass"] = pntFeaClass.AliasName; dr["FeatureofLayer"] = (pntFeaClass as IDataset).Name; dr["FeatureClass"] = pntFeaClass; dr["ErrorType"] = "管点所属道路名错误"; dt.Rows.Add(dr); } pFea = FeaCursor.NextFeature(); } if (dt.Rows.Count > 0) { dict[pntFeaClass] = dt; } } n++; Console.WriteLine(n); } //遍历线获取OID List <DF2DFeatureClass> st = Dictionary2DTable.Instance.GetFeatureClassByFacilityClassName("PipeLine"); if (st == null) { return; } foreach (DF2DFeatureClass dfcc in st) { parcFeaClass = dfcc.GetFeatureClass(); if (parcFeaClass == null) { continue; } FacilityClass fac = dfcc.GetFacilityClass(); if (fac == null) { continue; } List <DFDataConfig.Class.FieldInfo> listField = fac.FieldInfoCollection; DFDataConfig.Class.FieldInfo fi = fac.GetFieldInfoBySystemName("Road"); if (fi == null) { continue; } DFDataConfig.Class.FieldInfo fi1 = fac.GetFieldInfoBySystemName("StartNo"); if (fi1 == null) { continue; } DFDataConfig.Class.FieldInfo fi2 = fac.GetFieldInfoBySystemName("EndNo"); if (fi2 == null) { continue; } WaitForm.SetCaption(parcFeaClass.AliasName); IFeatureCursor pFeatureCursor = parcFeaClass.Search(null, false); IFeature pFeature; while ((pFeature = pFeatureCursor.NextFeature()) != null) { string pFeatureName = pFeature.get_Value(parcFeaClass.Fields.FindField(fi.Name)).ToString(); string strearc = pFeature.get_Value(parcFeaClass.Fields.FindField(fi1.Name)).ToString(); string strarc = pFeature.get_Value(parcFeaClass.Fields.FindField(fi2.Name)).ToString(); if (RoadPtDETEID.Contains(strarc)) { int ArcID = pFeature.OID; IntersectArcRoadID.Add(ArcID); Console.WriteLine("线:" + pFeature.OID + pFeatureName); if (IntersectRoad.Contains(pFeatureName) == false) { DataRow dr = dt.NewRow(); dr["ErrorFeatureID"] = pFeature.OID; dr["FeatureofClass"] = parcFeaClass.AliasName; dr["FeatureofLayer"] = (parcFeaClass as IDataset).Name; dr["FeatureClass"] = parcFeaClass; dr["ErrorType"] = "管线所属道路名错误"; dt.Rows.Add(dr); } } } if (dt.Rows.Count > 0) { dict[parcFeaClass] = dt; } } //遍历道路点检查 int m = 0; IFeatureCursor pFCursor = pFeatureClass.Search(null, false); IFeature Feature; while ((Feature = pFCursor.NextFeature()) != null) { string FielName = Feature.get_Value(pFeatureClass.Fields.FindField("Name")).ToString(); List <DF2DFeatureClass> List = Dictionary2DTable.Instance.GetFeatureClassByFacilityClassName("PipeNode"); if (List == null) { return; } foreach (DF2DFeatureClass dfcc in List) { pntFeaClass = dfcc.GetFeatureClass(); if (pntFeaClass == null) { continue; } WaitForm.SetCaption(pntFeaClass.AliasName); pSpatial.Geometry = Feature.Shape; pSpatial.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains; IFeatureCursor FeaCursor = pntFeaClass.Search(pSpatial, true); IFeature pFea; while ((pFea = FeaCursor.NextFeature()) != null) { FacilityClass fac = dfcc.GetFacilityClass(); if (fac == null) { continue; } List <DFDataConfig.Class.FieldInfo> listField = fac.FieldInfoCollection; DFDataConfig.Class.FieldInfo fi = fac.GetFieldInfoBySystemName("proad"); if (fi == null) { continue; } DFDataConfig.Class.FieldInfo fi1 = fac.GetFieldInfoBySystemName("detectid"); if (fi1 == null) { continue; } string StrName = pFea.get_Value(pntFeaClass.Fields.FindField(fi.Name)).ToString(); if ((IntersectPtRoadID.Contains(pFea.OID) == false)) { string RidName = pFea.get_Value(pntFeaClass.Fields.FindField(fi1.Name)).ToString(); RoadPtID.Add(RidName); if (StrName == null || (!(StrName.Equals(FielName)))) { DataRow dr = dt.NewRow(); dr["ErrorFeatureID"] = pFea.OID; dr["FeatureofClass"] = pntFeaClass.AliasName; dr["FeatureofLayer"] = (pntFeaClass as IDataset).Name; dr["FeatureClass"] = pntFeaClass; dr["ErrorType"] = "管点所属道路名错误"; dt.Rows.Add(dr); } } } if (dt.Rows.Count > 0) { dict[pntFeaClass] = dt; } } //遍历道路线检查 List <DF2DFeatureClass> stArc = Dictionary2DTable.Instance.GetFeatureClassByFacilityClassName("PipeLine"); if (stArc == null) { return; } foreach (DF2DFeatureClass dfcc in stArc) { parcFeaClass = dfcc.GetFeatureClass(); if (parcFeaClass == null) { continue; } WaitForm.SetCaption("正在检查" + parcFeaClass.AliasName); FacilityClass fac = dfcc.GetFacilityClass(); if (fac == null) { continue; } List <DFDataConfig.Class.FieldInfo> listField = fac.FieldInfoCollection; DFDataConfig.Class.FieldInfo fi = fac.GetFieldInfoBySystemName("proad"); if (fi == null) { continue; } DFDataConfig.Class.FieldInfo fi1 = fac.GetFieldInfoBySystemName("enodeid"); if (fi1 == null) { continue; } DFDataConfig.Class.FieldInfo fi2 = fac.GetFieldInfoBySystemName("snodeid"); if (fi2 == null) { continue; } IFeatureCursor pFeatureCursor = parcFeaClass.Search(null, false); IFeature pFeature; while ((pFeature = pFeatureCursor.NextFeature()) != null) { string strarc = pFeature.get_Value(parcFeaClass.Fields.FindField(fi2.Name)).ToString(); string strearc = pFeature.get_Value(parcFeaClass.Fields.FindField(fi1.Name)).ToString(); string ArcLineName = pFeature.get_Value(parcFeaClass.Fields.FindField(fi.Name)).ToString(); if ((RoadPtID.Contains(strarc) == true) && (IntersectArcRoadID.Contains(pFeature.OID) == false)) { if ((ArcLineName == null) || (ArcLineName.Equals(FielName) == false)) { DataRow dr = dt.NewRow(); dr["ErrorFeatureID"] = pFeature.OID; dr["FeatureofClass"] = parcFeaClass.AliasName; dr["FeatureofLayer"] = (parcFeaClass as IDataset).Name; dr["FeatureClass"] = parcFeaClass; dr["ErrorType"] = "管线所属道路名错误"; dt.Rows.Add(dr); } } } if (dt.Rows.Count > 0) { dict[parcFeaClass] = dt; } } m++; //Console.WriteLine(m + FielName + Feature.OID); } }