/// <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); } }
/// <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); }
/// <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); }