/// <summary>
        /// 检查图层中的碎面
        /// </summary>
        /// <param name="strParams">参数数组包含:图层名称和指定的面积</param>
        /// <returns>返回检查到的错误信息数组</returns>
        public bool CheckData()
        {
            try
            {
                if (strParams == null || strParams.Length < 3)
                {
                    Message = "碎面检查所需参数为空!请输入正确参数!";

                    return(false);
                }

                string layerName = strParams[0];
                if (layerName == null || layerName == string.Empty)
                {
                    Message = "碎面检查所需图层名为空!请输入正确图层名参数!";

                    return(false);
                }
                string strValue = strParams[1];
                string strSQL   = strParams[2];
                if (strSQL == null || strSQL == string.Empty)
                {
                    strSQL = "1=1";
                }

                //检查图层是否有更新信息
                if (!Manager.IsCheckTaskData)
                {
                    CheckerUtil.m_idValues = null;
                }
                else
                {
                    List <int> idValueList = new List <int>();
                    bool       bValue      = Manager.CheckItems.TryGetValue(layerName, out idValueList);
                    if (!bValue || idValueList.Count == 0)
                    {
                        Message = "图层名称: " + layerName + ", 无检测数据!";

                        return(false);
                    }
                    CheckerUtil.m_idValues = idValueList;
                }
                if (strValue == null || strValue == string.Empty)
                {
                    CheckErrorList = CheckerUtil.CheckBrokenFeaturesInLayer(layerName, strSQL, "polygon");
                }
                else
                {
                    double dArea = Convert.ToDouble(strValue);
                    CheckErrorList = CheckerUtil.CheckBrokenFeaturesInLayer(layerName, strSQL, "polygon", dArea);
                }

                return(true);
            }
            catch (Exception err)
            {
                Message = "碎面检查出现异常,错误原因:" + err.Message;
                return(false);
            }
        }
Beispiel #2
0
        /// <summary>
        /// 线线相交检查
        /// </summary>
        /// <param name="paramsValue">参数数组包含:线图层名称1、线图层名称2</param>
        /// <returns>返回检查到的错误信息数组</returns>
        public bool CheckData()
        {
            try
            {
                if (strParams == null || strParams.Length < 4)
                {
                    Message = "线线相交检查所需参数为空!请输入正确参数!";

                    return(false);
                }

                string layerName  = strParams[0];
                string layerName2 = strParams[1];
                if (layerName == null || layerName == string.Empty || layerName2 == null || layerName2 == string.Empty)
                {
                    Message = "线线相交检查所需图层名为空!请输入正确图层名参数!";

                    return(false);
                }
                string strSQL = strParams[2];
                if (strSQL == null || strSQL == string.Empty)
                {
                    strSQL = "1=1";
                }
                string strSQL2 = strParams[3];
                if (strSQL2 == null || strSQL2 == string.Empty)
                {
                    strSQL2 = "1=1";
                }

                //检查图层是否有更新信息
                if (!Manager.IsCheckTaskData)
                {
                    CheckerUtil.m_idValues = null;
                }
                else
                {
                    List <int> idValueList = new List <int>();
                    bool       bValue      = Manager.CheckItems.TryGetValue(layerName, out idValueList);
                    if (!bValue || idValueList.Count == 0)
                    {
                        Message = "图层名称: " + layerName + ", 无检测数据!";

                        return(false);
                    }
                    CheckerUtil.m_idValues = idValueList;
                }
                string strErrorMsg = "错误描述:线与线相交!";

                CheckErrorList = CheckerUtil.CheckOverlapFeaturesInLayers(layerName, layerName2, strSQL, strSQL2, 22, esriSpatialRelEnum.esriSpatialRelCrosses, "T*T******", strErrorMsg);

                return(true);
            }
            catch (Exception err)
            {
                Message = "线线相交检查出现异常,错误原因:" + err.Message;
                return(false);
            }
        }
        /// <summary>
        /// 线上重复点检查
        /// </summary>
        /// <param name="paramsValue">参数数组包含:图层名称</param>
        /// <returns>返回检查到的错误信息数组</returns>
        public bool CheckData()
        {
            try
            {
                if (strParams == null || strParams.Length < 2)
                {
                    Message = "线上重复点检查所需参数为空!请输入正确参数!";

                    return(false);
                }

                string layerName = strParams[0];
                if (layerName == null || layerName == string.Empty)
                {
                    Message = "线上重复点检查所需图层名为空!请输入正确图层名参数!";

                    return(false);
                }
                string strSQL = strParams[1];
                if (strSQL == null || strSQL == string.Empty)
                {
                    strSQL = "1=1";
                }

                //检查图层是否有更新信息
                if (!Manager.IsCheckTaskData)
                {
                    CheckerUtil.m_idValues = null;
                }
                else
                {
                    List <int> idValueList = new List <int>();
                    bool       bValue      = Manager.CheckItems.TryGetValue(layerName, out idValueList);
                    if (!bValue || idValueList.Count == 0)
                    {
                        Message = "图层名称: " + layerName + ", 无检测数据!";

                        return(false);
                    }
                    CheckerUtil.m_idValues = idValueList;
                }
                string strErrorMsg = "错误描述:线上存在重复点现象!";

                CheckErrorList = CheckerUtil.CheckLineOverlapPointsInLayer(layerName, strSQL, strErrorMsg);

                return(true);
            }
            catch (Exception err)
            {
                Message = "线上重复点检查出现异常,错误原因:" + err.Message;
                return(false);
            }
        }
        /// <summary>
        /// 面缝隙检查
        /// </summary>
        /// <param name="paramsValue">参数数组包含:图层名称1和图层名称2</param>
        /// <returns>返回检查到的错误信息数组</returns>
        public bool CheckData()
        {
            try
            {
                if (strParams == null || strParams.Length < 5)
                {
                    Message = "面缝隙检查所需参数为空!请输入正确参数!";

                    return(false);
                }

                string layerName  = strParams[0];
                string layerName2 = strParams[1];
                if (layerName == null || layerName == string.Empty || layerName2 == null || layerName2 == string.Empty)
                {
                    Message = "面缝隙检查所需图层名为空!请输入正确图层名参数!";

                    return(false);
                }

                string strSQL = strParams[3];
                if (strSQL == null || strSQL == string.Empty)
                {
                    strSQL = "1=1";
                }
                string strSQL2 = strParams[4];
                if (strSQL2 == null || strSQL2 == string.Empty)
                {
                    strSQL2 = "1=1";
                }

                //检查图层是否有更新信息
                if (!Manager.IsCheckTaskData)
                {
                    CheckerUtil.m_idValues = null;
                }
                else
                {
                    List <int> idValueList = new List <int>();
                    bool       bValue      = Manager.CheckItems.TryGetValue(layerName, out idValueList);
                    if (!bValue || idValueList.Count == 0)
                    {
                        Message = "图层名称: " + layerName + ", 无检测数据!";

                        return(false);
                    }
                    CheckerUtil.m_idValues = idValueList;
                }
                string strErrorMsg = "错误描述:面与面之间存在缝隙现象!";

                string strValue = strParams[2];
                if (strValue == null || strValue == string.Empty)
                {
                    CheckErrorList = CheckerUtil.CheckPolygonsHasGap(layerName, layerName2, strSQL, strSQL2, strErrorMsg);
                }
                else
                {
                    double dGap = Convert.ToDouble(strValue);
                    CheckErrorList = CheckerUtil.CheckPolygonsHasGap(layerName, layerName2, strSQL, strSQL2, strErrorMsg, dGap);
                }

                return(true);
            }
            catch (Exception err)
            {
                Message = "面缝隙检查出现异常,错误原因:" + err.Message;
                return(false);
            }
        }
        private ArrayList CheckValue(string featAnnotName, string FeatName, string CheckRule, string otherString, string Tolerance, string errorMsg, int[] idValues)
        {
            double        tol          = 0;
            ArrayList     errorMsgList = new ArrayList(); //定义错误信息
            IFeatureClass AnnoFC       = CheckerUtil.GetFeatureClassFromWorkspace(featAnnotName);
            IFeatureClass FeatFC       = CheckerUtil.GetFeatureClassFromWorkspace(FeatName);

            if (AnnoFC == null || FeatFC == null)
            {
                string strMsg = "没能在数据库中找到对应的注记图层,请检查输入的图层名称是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(null);
            }
            try
            {
                tol = double.Parse(Tolerance);
            }
            catch
            {
                string strMsg = "输入的容差为非数值型,请检查输入的容差值是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(errorMsgList);
            }

            string[] fieldsParm = CheckRule.Split(',');

            for (int i = 0; i < fieldsParm.Length; i++)
            {
                int fieldIndex = FeatFC.Fields.FindField(fieldsParm[i].ToString());
                if (fieldIndex == -1)
                {
                    string strMsg = "没能找到" + InputFCName + "图层中的 " + fieldsParm[i].ToString() + " 字段,请检查输入的字段名称是否正确";
                    errorMsgList.Add(new CheckError {
                        Description = strMsg, Locations = null
                    });
                    return(errorMsgList);
                }
            }
            //开始检索所有的注记
            bool           hasErr = false;
            IFeatureCursor pAnnoCursor;

            if (idValues == null)
            {
                pAnnoCursor = AnnoFC.Search(null, false);
            }
            else
            {
                pAnnoCursor = AnnoFC.GetFeatures(idValues, false);
            }
            IFeature pAnnoFeat = pAnnoCursor.NextFeature();

            while (pAnnoFeat != null)
            {
                string annoStr = pAnnoFeat.get_Value(pAnnoFeat.Fields.FindField("TextString")).ToString();  //Annotation的值
                //查找与之对应的所有相交的建筑物
                ISpatialFilter       spFilter = new SpatialFilterClass();
                ITopologicalOperator topo     = pAnnoFeat.Shape as ITopologicalOperator;
                topo.Buffer(tol);
                spFilter.Geometry   = topo as IPolygon;
                spFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                IFeatureCursor featCursor = FeatFC.Search(spFilter, false);
                IFeature       bFeat      = featCursor.NextFeature();
                while (bFeat != null)
                {
                    string fieldsStr = "";
                    //ArrayList fieldsValue = new ArrayList();
                    for (int i = 0; i < fieldsParm.Length; i++)
                    {
                        string fStr = bFeat.get_Value(bFeat.Fields.FindField(fieldsParm[i])).ToString();
                        fieldsStr = fieldsStr + fStr;
                    }
                    string whole        = fieldsStr + otherString;
                    string notFoundChar = "";
                    for (int i = 0; i < annoStr.Length; i++)
                    {
                        //假如没找到对应的字符,则写入错误
                        if (whole.IndexOf(annoStr[i]) == -1)
                        {
                            hasErr       = true;
                            notFoundChar = notFoundChar + "'" + annoStr[i].ToString() + "' ";
                        }
                    }
                    if (hasErr)
                    {
                        List <IGeometry> pGeoList = new List <IGeometry>();
                        pGeoList.Add(pAnnoFeat.Shape);
                        pGeoList.Add(bFeat.Shape);

                        string strMsg = "注记层:" + featAnnotName + ",要素ID号为: '" + pAnnoFeat.OID.ToString() + "' 与 对应要素层:" + FeatName + ", 要素ID号为: '" + bFeat.OID.ToString() + "'的属性不一致,没找到  " + notFoundChar + "关键字   " + errorMsg;
                        errorMsgList.Add(new CheckError {
                            Description = strMsg, Locations = pGeoList
                        });
                    }
                    bFeat = featCursor.NextFeature();
                }
                pAnnoFeat = pAnnoCursor.NextFeature();
            }
            if (hasErr == false)
            {
                string strMsg = "没发现任何不符合的要素";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
            }
            return(errorMsgList);
        }
        /// <summary>
        /// 冗余线检查(相同编码的两条线之间是否存在重复线段)
        /// </summary>
        /// <param name="strParams">参数数组包含:图层名称1、图层名称2、编码字段名</param>
        /// <returns>返回检查到的错误信息数组</returns>
        public bool CheckData()
        {
            try
            {
                if (strParams == null || strParams.Length < 5)
                {
                    Message = "冗余线检查所需参数为空!请输入正确参数!";

                    return(false);
                }

                string layerName  = strParams[0];
                string layerName2 = strParams[1];
                if (layerName == null || layerName == string.Empty || layerName2 == null || layerName2 == string.Empty)
                {
                    Message = "冗余线检查所需图层名为空!请输入正确图层名参数!";

                    return(false);
                }
                string fieldName = strParams[2];
                if (fieldName == null || fieldName == string.Empty)
                {
                    fieldName = "OBJECTID";
                }

                string strSQL = strParams[3];
                if (strSQL == null || strSQL == string.Empty)
                {
                    strSQL = "1=1";
                }
                string strSQL2 = strParams[4];
                if (strSQL2 == null || strSQL2 == string.Empty)
                {
                    strSQL2 = "1=1";
                }

                //检查图层是否有更新信息
                if (!Manager.IsCheckTaskData)
                {
                    CheckerUtil.m_idValues = null;
                }
                else
                {
                    List <int> idValueList = new List <int>();
                    bool       bValue      = Manager.CheckItems.TryGetValue(layerName, out idValueList);
                    if (!bValue || idValueList.Count == 0)
                    {
                        Message = "图层名称: " + layerName + ", 无检测数据!";

                        return(false);
                    }
                    CheckerUtil.m_idValues = idValueList;
                }
                CheckErrorList = CheckerUtil.CheckRedundantFeaturesInLayer(layerName, layerName2, fieldName, strSQL, strSQL2, true, esriSpatialRelEnum.esriSpatialRelOverlaps, "TT*T*****");

                return(true);
            }
            catch (Exception err)
            {
                Message = "冗余线检查出现异常,错误原因:" + err.Message;
                return(false);
            }
        }
        public ArrayList CheckValue(string featFCName, string FieldName, string StrSphere, string errorMsg, int[] idValues)
        {
            ArrayList errorMsgList = new ArrayList(); //定义错误信息

            string[] Sphere = StrSphere.Split('-');
            string   from   = Sphere[0];
            string   to     = Sphere[1];

            double dMin = 0;
            double dMax = 0;

            try
            {
                dMin = double.Parse(from);
                dMax = double.Parse(to);
            }
            catch
            {
                string strMsg = "输入的范围为非数值型,范围输入请用'-'隔开,如‘10-20’。请检查输入的范围值是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(errorMsgList);
            }

            IFeatureClass FeatFC = CheckerUtil.GetFeatureClassFromWorkspace(featFCName);

            if (FeatFC == null)
            {
                string strMsg = "没能在数据库中找到对应的图层,请检查输入的图层名称是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(errorMsgList);
            }
            int fieldIndex = FeatFC.Fields.FindField(FieldName);

            if (fieldIndex == -1)
            {
                string strMsg = "没能找到值域字段,请检查输入的值域字段名称是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(errorMsgList);
            }
            //IFeatureCursor featCursor = FeatFC.Search(null, false);
            IFeatureCursor featCursor = FeatFC.GetFeatures(idValues, false);
            IFeature       bFeat      = featCursor.NextFeature();

            while (bFeat != null)
            {
                double fValue = (double)bFeat.get_Value(bFeat.Fields.FindField(FieldName));
                if (fValue > dMax || fValue < dMin)
                {
                    List <IGeometry> pGeoList = new List <IGeometry>();
                    pGeoList.Add(bFeat.Shape);

                    string strMsg = featFCName + "图层中,要素ID号为: '" + bFeat.OID.ToString() + "字段数值为 " + fValue.ToString() + " 不在设定的值域范围内 " + errorMsg;
                    errorMsgList.Add(new CheckError {
                        Description = strMsg, Locations = pGeoList
                    });
                }
                bFeat = featCursor.NextFeature();
            }
            return(errorMsgList);
        }
Beispiel #8
0
        /// <summary>
        /// 检测高程点值是否标对
        /// </summary>
        /// <param name="ElevatFieldName">高程点字段名称</param>
        public ArrayList CheckValue(string ElevatAnnotName, string ElevatFeatName, string ElevatFieldName, string Tolerance, string errorMsg, int[] idValues)
        {
            double        tol          = 0;
            ArrayList     errorMsgList = new ArrayList(); //定义错误信息
            IFeatureClass AnnoFC       = CheckerUtil.GetFeatureClassFromWorkspace(ElevatAnnotName);
            IFeatureClass ElevateFC    = CheckerUtil.GetFeatureClassFromWorkspace(ElevatFeatName);

            if (AnnoFC == null || ElevateFC == null)
            {
                string strMsg = "没能在数据库中找到对应的高程点注记图层,请检查输入的图层名称是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(null);
            }
            int fieldIndex = ElevateFC.Fields.FindField(ElevatFieldName);

            if (fieldIndex == -1)
            {
                string strMsg = "没能找到高程点字段,请检查输入的高程点字段名称是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(errorMsgList);
            }
            try
            {
                tol = double.Parse(Tolerance);
            }
            catch {
                string strMsg = "输入的容差为非数值型,请检查输入的容差值是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(null);
            }
            IFeature       TempElvAnnoFeat = null;
            IFeatureCursor pCursor;

            if (idValues == null)
            {
                pCursor = AnnoFC.Search(null, false);
            }
            else
            {
                pCursor = AnnoFC.GetFeatures(idValues, false);
            }

            //遍历所有的高程点注记
            TempElvAnnoFeat = pCursor.NextFeature();
            while (TempElvAnnoFeat != null)
            {
                //获取高程点注记的值
                string   AnnoText    = TempElvAnnoFeat.get_Value(TempElvAnnoFeat.Fields.FindField("TextString")).ToString();
                IPolygon annoPolygon = TempElvAnnoFeat.Shape as IPolygon;
                //缓冲一个范围作为查找
                ITopologicalOperator topo = annoPolygon as ITopologicalOperator;
                topo.Buffer(tol);
                //查找压盖的高程点
                ISpatialFilter spFilter = new SpatialFilterClass();
                spFilter.Geometry   = topo as IPolygon;
                spFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                IFeatureCursor ElevateCusor = ElevateFC.Search(spFilter, false);

                IFeature ElevatFeat = ElevateCusor.NextFeature();
                //当某一个注记没能找到对应的高程点的时候,将其没有对应的注记的ID记录下来(针对某些注记可能单独存在的情况,需确认这种情况下注记是否多余)
                if (ElevatFeat == null)
                {
                    string strMsg = "高程点注记:" + ElevatAnnotName + ",要素ID号为: '" + TempElvAnnoFeat.OID.ToString() + "'  未能找到任何的高程点与之对应";
                    errorMsgList.Add(new CheckError {
                        Description = strMsg, Locations = null
                    });
                }
                while (ElevatFeat != null)
                {
                    //获取到高程点的值
                    string contValue = ElevatFeat.get_Value(ElevatFeat.Fields.FindField(ElevatFieldName)).ToString();
                    if (contValue != AnnoText)
                    {
                        List <IGeometry> pGeoList = new List <IGeometry>();
                        pGeoList.Add(TempElvAnnoFeat.Shape);
                        pGeoList.Add(ElevatFeat.Shape);

                        string strMsg = "高程点注记:" + ElevatAnnotName + ",要素ID号为: '" + TempElvAnnoFeat.OID.ToString() + "' 与 高程点名称:" + ElevatFeatName + ", 要素ID号为: '" + ElevatFeat.OID.ToString() + "'数值不一致  " + errorMsg;
                        //MessageBox.Show(strMsg);
                        errorMsgList.Add(new CheckError {
                            Description = strMsg, Locations = pGeoList
                        });
                    }


                    ElevatFeat = ElevateCusor.NextFeature();
                }

                TempElvAnnoFeat = pCursor.NextFeature();
            }

            return(errorMsgList);
        }
        /// <summary>
        /// 检测等高线值是否标对
        /// </summary>
        /// <param name="ContourFieldName">等高线字段名称</param>
        public ArrayList CheckValue(string ContAnnotName, string ContFeatName, string ContourFieldName, string errorMsg, int[] idValues)
        {
            ArrayList     errorMsgList = new ArrayList(); //定义错误信息
            IFeatureClass AnnoFC       = CheckerUtil.GetFeatureClassFromWorkspace(ContAnnotName);
            IFeatureClass ContourFC    = CheckerUtil.GetFeatureClassFromWorkspace(ContFeatName);

            if (AnnoFC == null || ContourFC == null)
            {
                string strMsg = "没能在数据库中找到对应的等高线注记图层,请检查输入的图层名称是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(errorMsgList);
            }
            int fieldIndex = ContourFC.Fields.FindField(ContourFieldName);

            if (fieldIndex == -1)
            {
                string strMsg = "没能找到等高线字段,请检查输入的等高线字段名称是否正确";
                errorMsgList.Add(new CheckError {
                    Description = strMsg, Locations = null
                });
                return(errorMsgList);
            }
            IFeature       TempContAnnoFeat = null;
            IFeatureCursor pCursor;

            if (idValues == null)
            {
                pCursor = AnnoFC.Search(null, false);
            }
            else
            {
                pCursor = AnnoFC.GetFeatures(idValues, false);
            }
            //遍历所有的等高线注记
            TempContAnnoFeat = pCursor.NextFeature();
            while (TempContAnnoFeat != null)
            {
                //获取等高线注记的值
                string   AnnoText    = TempContAnnoFeat.get_Value(TempContAnnoFeat.Fields.FindField("TextString")).ToString();
                IPolygon annoPolygon = TempContAnnoFeat.Shape as IPolygon;
                //查找压盖的等高线
                ISpatialFilter spFilter = new SpatialFilterClass();
                spFilter.Geometry   = annoPolygon;
                spFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                IFeatureCursor contCusor = ContourFC.Search(spFilter, false);

                IFeature contFeat = contCusor.NextFeature();
                //当某一个注记没能找到对应的等高线的时候,将其没有对应的注记的ID记录下来(针对某些注记可能单独存在的情况,需确认这种情况下注记是否多余)
                if (contFeat == null)
                {
                    string strMsg = "等高线注记:" + ContAnnotName + ",要素ID号为: '" + TempContAnnoFeat.OID.ToString() + "'  未能找到任何的等高线与之对应";
                    errorMsgList.Add(new CheckError {
                        Description = strMsg, Locations = null
                    });
                }
                while (contFeat != null)
                {
                    //获取到等高线的值
                    string contValue = contFeat.get_Value(contFeat.Fields.FindField(ContourFieldName)).ToString();
                    if (contValue != AnnoText)
                    {
                        List <IGeometry> pGeoList = new List <IGeometry>();
                        pGeoList.Add(TempContAnnoFeat.Shape);
                        pGeoList.Add(contFeat.Shape);

                        string strMsg = "等高线注记:" + ContAnnotName + ",要素ID号为: '" + TempContAnnoFeat.OID.ToString() + "' 与 等高线名称:" + ContFeatName + ", 要素ID号为: '" + contFeat.OID.ToString() + "'数值不一致  " + errorMsg;
                        //MessageBox.Show(strMsg);
                        errorMsgList.Add(new CheckError {
                            Description = strMsg, Locations = pGeoList
                        });
                    }


                    contFeat = contCusor.NextFeature();
                }

                TempContAnnoFeat = pCursor.NextFeature();
            }

            return(errorMsgList);
        }