Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }