/// <summary> /// 对街道、房屋实体进行编码 /// </summary> /// <param name="pFeatureLayer">需要编码的图层</param> /// <param name="pENTIID">需要编码的字段名称</param> private void CreatePrimitiveCode(IFeatureLayer pFeatureLayer, string pELEMID, FrmProgressBar pgBar) { #region 针对GUID编码来讲 //遍历Feature IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { //获取单条Feature的某个字段值 int test2 = pFeature.Fields.FindField(pELEMID); //如果要素对应的图元标识码为空,则进行GUID编码 if (pFeature.get_Value(pFeature.Fields.FindField(pELEMID)).ToString().Length == 0) { string pGUID = System.Guid.NewGuid().ToString("N"); pFeature.set_Value(pFeature.Fields.FindField(pELEMID), pGUID); pFeature.Store(); } pgBar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } pgBar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); } #endregion }
/// <summary> /// 生成格网码(道路) /// </summary> /// <param name="pMapControl"></param> /// <param name="cbxLayerName"></param> public void RestPOIGrid(IMap pMapControl, ComboBoxEx cbxLayerName) { Dictionary <IFeature, string> pBothNotNull = new Dictionary <IFeature, string>(); Dictionary <IFeature, string> pRoadNotNull = new Dictionary <IFeature, string>(); Dictionary <IFeature, string> pNameNotNull = new Dictionary <IFeature, string>(); //Dictionary<IFeature, string> pGridCode = new Dictionary<IFeature, string>(); List <object> pOID = new List <object>(); string gridField = "GridCode"; IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text); if (pFeatureLayer != null) { progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null)); progressbar.Show(); IDataset cDataset = pFeatureLayer.FeatureClass as IDataset; IGeoDataset cGeoDataset = cDataset as IGeoDataset; ISpatialReference cSpatialReference = cGeoDataset.SpatialReference; if (cSpatialReference is IProjectedCoordinateSystem) { MessageBox.Show("该图层为投影坐标,请转换为相应的地理坐标,再开始地理编码!"); } //检查是否存在格网字段,不存在则补充此字段 pClsCom.CheckGridField(pFeatureLayer, gridField); if (pFeatureLayer.FeatureClass.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField) != -1) { IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { string pFeatureName = pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString(); string pFeaEnti = pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].EntityID)).ToString();//匹配名称 //名称不为空,地理编码为空 if (pFeatureName.Trim().Length > 0 && pFeaEnti.Trim().Length == 0) { //获取格网信息 string GridCode = pClsCom.GetCodeString(pFeature); if (GridCode != "") { pFeature.set_Value(pFeature.Fields.FindField(gridField), GridCode); pFeature.Store(); } else { MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); return; } } progressbar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } progressbar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); } MessageBox.Show("POI格网补充成功!"); } else { MessageBox.Show("此图层不存在名称字段,请重新配置图层!"); } } else { MessageBoxEx.Show("没有选中任何图层,请选择图层!"); } }
private void RestPOICode2(IFeatureLayer pFeatureLayer, Dictionary <IFeature, string> pEntiCode, Dictionary <IFeature, string> pDicGridCode, string pGridCode, string pENEIID, FrmProgressBar pgBar) { string pFCODE = string.Empty; //遍历Feature IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); IFeature pFeature = pFeatureCursor.NextFeature(); string pNum = string.Empty; string pEntiidCode = string.Empty; while (pFeature != null) { int flag = 0; string gridCode1 = pFeature.get_Value(pFeature.Fields.FindField(pGridCode)).ToString(); pFCODE = pFeature.get_Value(pFeature.Fields.FindField("FCODE")).ToString(); if (pFCODE.Trim().Length > 0) { //ClsReturnFCode pReturnFcode = new ClsReturnFCode(); //pFCODE = pReturnFcode.ReturnFeatureClass(pFCODE); pFCODE = ZJGISCommon.Classes.ClsFcode.pDicFcodeGlobal[pFCODE]; //格网码不为空,只对有格网码的的要素进行编码 if (pFeature.get_Value(pFeature.Fields.FindField(pGridCode)).ToString().Length > 0 && pFCODE.Length > 0) { foreach (string s in pDicGridCode.Values) { if (gridCode1 == s) { flag++; } } //格网码唯一的情况:那么地理编码也一定唯一 if (flag == 1) { pNum = "A01"; pEntiidCode = gridCode1 + pFCODE + pNum; pFeature.set_Value(pFeature.Fields.FindField(pENEIID), pEntiidCode); pFeature.Store(); } //格网码有多个的情况 else { List <IFeature> keyListTotal = (from q in pDicGridCode where q.Value == gridCode1 select q.Key).ToList <IFeature>(); //get all keys //test object testobj = pFeature.OID; int flag2 = 0; //顺序码 for (int k = 0; k < keyListTotal.Count; k++) { string enticode = keyListTotal[k].get_Value(keyListTotal[k].Fields.FindField("ENTIID")).ToString(); if (enticode.Trim().Length > 0) { flag2++; pNum = enticode.Substring(enticode.Length - 2); //pNum = "A" + string.Format("{0:00}", (Convert.ToInt32(pNum) + 1)); } } //顺序码 for (int k = 0; k < keyListTotal.Count; k++) { if (pFeature.OID == keyListTotal[k].OID && flag2 > 0) { pNum = "A" + string.Format("{0:00}", k + flag2 + 1); } if (pFeature.OID == keyListTotal[k].OID && flag2 == 0) { pNum = "A" + string.Format("{0:00}", k + 1); } } pEntiidCode = gridCode1 + pFCODE + pNum; pFeature.set_Value(pFeature.Fields.FindField(pENEIID), pEntiidCode); pFeature.Store(); } } } pgBar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } pgBar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); } }
/// <summary> /// 生成格网码 /// </summary> /// <param name="pMapControl"></param> /// <param name="cbxLayerName"></param> public void CreatGridCodeRES(IMap pMapControl, ComboBoxEx cbxLayerName) { string gridField = "GridCode"; IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text); IDataset cDataset = pFeatureLayer.FeatureClass as IDataset; IGeoDataset cGeoDataset = cDataset as IGeoDataset; ISpatialReference cSpatialReference = cGeoDataset.SpatialReference; if (cSpatialReference is IProjectedCoordinateSystem) { MessageBox.Show("该图层为投影坐标,请转换为相应的地理坐标,再开始地理编码!"); } if (pFeatureLayer != null) { progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null)); progressbar.Show(); pClsCom.CheckGridField(pFeatureLayer, gridField); IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); //int i = pFeatureLayer.FeatureClass.FeatureCount(null); int j = 0; IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { if (pFeature.get_Value(pFeature.Fields.FindField("FCODE")).ToString() == "3103011500" || pFeature.get_Value(pFeature.Fields.FindField("FCODE")).ToString() == "3103012500" || pFeature.get_Value(pFeature.Fields.FindField("FCODE")).ToString() == "3103013500" || pFeature.get_Value(pFeature.Fields.FindField("FCODE")).ToString() == "3103020500" || pFeature.get_Value(pFeature.Fields.FindField("FCODE")).ToString() == "3106000500" || pFeature.get_Value(pFeature.Fields.FindField("FCODE")).ToString() == "3107000500" || pFeature.get_Value(pFeature.Fields.FindField("FCODE")).ToString() == "3108000500") { //获取格网信息 //string GridCode = pClsCom.GetCodeString(pFeature); string GridCode = pClsCom.GetGeoHashCode(pFeature, Precision); if (GridCode != "") { pFeature.set_Value(pFeature.Fields.FindField(gridField), GridCode); pFeature.Store(); j++; //pFeature = pFeatureCursor.NextFeature(); } else { MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); return; } } progressbar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } progressbar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); MessageBoxEx.Show("格网生成成功!"); } } else { MessageBoxEx.Show("没有选中任何图层!"); } }
/// <summary> /// 生成格网码 /// </summary> /// <param name="pMapControl"></param> /// <param name="cbxLayerName"></param> public void CreatGridCode(IMap pMapControl, ComboBoxEx cbxLayerName) { string strField = "GridCode"; IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text); IDataset cDataset = pFeatureLayer.FeatureClass as IDataset; IGeoDataset cGeoDataset = cDataset as IGeoDataset; ISpatialReference cSpatialReference = cGeoDataset.SpatialReference; if (cSpatialReference is IProjectedCoordinateSystem) { MessageBox.Show("该图层为投影坐标,请转换为相应的地理坐标,再开始地理编码!"); } if (pFeatureLayer != null) { //检查格网字段是否存在,不存在就添加格网字段GridCode pClsCom.CheckGridField(pFeatureLayer, strField); //存在名称字段 if (pFeatureLayer.FeatureClass.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField) != -1) { progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null)); progressbar.Show(); IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); int i = pFeatureLayer.FeatureClass.FeatureCount(null); int j = 0; IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { //对于名称为空的字段进行筛选 //string pFeaEnti = pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString(); LayerConfig lyconfig = ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name.ToString().Trim()]; string test = ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField; IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; string pFeatureName = pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString(); //存在格网字段 if (pFeatureName.Trim().Length > 0) { //获取格网信息 //string GridCode = pClsCom.GetCodeString(pFeature); string GridCode = pClsCom.GetGeoHashCode(pFeature, Precision); if (GridCode != "") { pFeature.set_Value(pFeature.Fields.FindField(strField), GridCode); pFeature.Store(); j++; } else { MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); return; } } progressbar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } progressbar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); MessageBoxEx.Show("格网生成成功!"); } } else { MessageBox.Show("此图层不存在名称字段!"); } } else { MessageBoxEx.Show("没有选中任何图层!"); } }
/// <summary> /// 生成格网码(道路) /// </summary> /// <param name="pMapControl"></param> /// <param name="cbxLayerName"></param> public void CreatGridCodeRoad2(IFeatureLayer pFeatureLayer, Dictionary <IFeature, string> pNameNotNull, Dictionary <IFeature, string> pRoadNotNull, List <object> pOID, FrmProgressBar pgBar) { string strField = "GridCode"; if (pFeatureLayer != null) { IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); //int i = pFeatureLayer.FeatureClass.FeatureCount(null); IFeature pFeature = pFeatureCursor.NextFeature(); //遍历所有Feature,查找属于同一个地理实体的图元 while (pFeature != null) { if (pOID.Contains(pFeature.OID)) { //名称不为空 if (pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString().Trim().Length > 0) { string pFeatureName2 = pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString(); int flag2 = 0; foreach (string s in pNameNotNull.Values) { if (pFeatureName2 == s) { flag2++; } } //名字没有相同的情况 if (flag2 == 1) { //获取格网信息 //string pGridCode3 = pClsCom.GetCodeString(pFeature); string pGridCode3 = pClsCom.GetGeoHashCode(pFeature, Precision); if (pGridCode3 != "") { pFeature.set_Value(pFeature.Fields.FindField(strField), pGridCode3); pFeature.Store(); } else { MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); return; } } //名字有相同的情况 else { List <IFeature> keyList = (from q in pNameNotNull where q.Value == pFeatureName2 select q.Key).ToList <IFeature>(); //get all keys //如果改要素就是第一条要素,则正常进行格网编码 if (pFeature.OID == keyList[0].OID) { CreatGridCodeComm(pFeature, pFeature, strField); #region 注释8 ////获取格网信息 //string GridCode = GetCodeString(pFeature); //if (GridCode != "") //{ // pFeature.set_Value(pFeature.Fields.FindField(strField), GridCode); // pFeature.Store(); //} //else //{ // MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); // return; //} #endregion } //如果改要素不是第一条要素,则按照第一条要素进行格网编码 if (pFeature.OID != keyList[0].OID) { CreatGridCodeComm(pFeature, keyList[0], strField); #region 注释9 ////获取格网信息 //string GridCode = GetCodeString(keyList[0]); //if (GridCode != "") //{ // pFeature.set_Value(pFeature.Fields.FindField(strField), GridCode); // pFeature.Store(); //} //else //{ // MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); // return; //} #endregion } } } //路线编码不为空,名称为空 if (pFeature.get_Value(pFeature.Fields.FindField("ROADCODE")).ToString().Trim().Length > 1 && pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString().Trim().Length == 0) { string pRoadCode2 = pFeature.get_Value(pFeature.Fields.FindField("ROADCODE")).ToString(); int flag1 = 0; foreach (string s in pRoadNotNull.Values) { if (pRoadCode2 == s) { flag1++; } } //名字只出现一次的情况 if (flag1 == 1) { //获取格网信息 //string pGridCode2 = pClsCom.GetCodeString(pFeature); string pGridCode2 = pClsCom.GetGeoHashCode(pFeature, Precision); if (pGridCode2 != "") { pFeature.set_Value(pFeature.Fields.FindField(strField), pGridCode2); pFeature.Store(); } else { MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); return; } } //名字出现多次的情况 else { List <IFeature> keyList = (from q in pRoadNotNull where q.Value == pRoadCode2 select q.Key).ToList <IFeature>(); //get all keys if (pFeature.OID == keyList[0].OID) { CreatGridCodeComm(pFeature, pFeature, strField); #region 注释5 //////test ////获取格网信息 //string GridCode = GetCodeString(pFeature); //if (GridCode != "") //{ // pFeature.set_Value(pFeature.Fields.FindField(strField), GridCode); // pFeature.Store(); //} //else //{ // MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); // return; //} #endregion } if (pFeature.OID != keyList[0].OID) { CreatGridCodeComm(pFeature, keyList[0], strField); #region 注释6 ////获取格网信息 //string GridCode = GetCodeString(keyList[0]); //if (GridCode != "") //{ // pFeature.set_Value(pFeature.Fields.FindField(strField), GridCode); // pFeature.Store(); //} //else //{ // MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); // return; //} #endregion } } } } pgBar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } pgBar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); MessageBoxEx.Show("格网生成成功!"); } } else { MessageBoxEx.Show("没有选中任何图层!"); } }
/// <summary> /// 检查普通实体编码(有名称的实体才检查是否有编码) /// </summary> /// <param name="pMapControl"></param> /// <param name="cbxLayerName"></param> //public DataTable CheckCommonEnti(IMap pMapControl, ComboBoxEx cbxLayerName) public List <IRow> CheckCommonEnti(IFeatureLayer pFeatureLayer) { //ITable pTable = new ITable(); List <IRow> list = new List <IRow>(); IDataset cDataset = pFeatureLayer.FeatureClass as IDataset; IGeoDataset cGeoDataset = cDataset as IGeoDataset; ISpatialReference cSpatialReference = cGeoDataset.SpatialReference; if (cSpatialReference is IProjectedCoordinateSystem) { MessageBox.Show("该图层为投影坐标,请转换为相应的地理坐标,再开始地理编码!"); } if (pFeatureLayer != null) { progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null)); progressbar.Show(); //检查格网字段是否存在,不存在就添加格网字段GridCode //pClsCom.CheckGridCode(pFeatureLayer, gridField); if (pFeatureLayer.FeatureClass.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField) != -1 && pFeatureLayer.FeatureClass.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].EntityID) != -1) { IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); int i = pFeatureLayer.FeatureClass.FeatureCount(null); int j = 0; IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { //对于名称为空的字段进行筛选 string pFeatureName = pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString(); string pEntiID = pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].EntityID)).ToString(); if (pFeatureName.Trim().Length > 0 && pEntiID.Trim().Length == 0) { list.Add((pFeature as IRow)); } progressbar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } progressbar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); } } else { MessageBox.Show("此图层不存在名称或地理实体编码字段,请重新检查配置图层!"); } } else { MessageBoxEx.Show("没有选中任何图层!"); } return(list); }
public void CodeRest2(IFeatureLayer pFeatureLayer, Dictionary <IFeature, string> pDicEntiid, Dictionary <IFeature, string> pDicGridFCode, Dictionary <IFeature, string> pDicGridCode, FrmProgressBar pgBar) { string strField = "ENTIID"; if (pFeatureLayer != null) { IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); //test //int i = pFeatureLayer.FeatureClass.FeatureCount(null); int NullNum = 0; string pNum = string.Empty; string pCode = string.Empty; string pEntiidCode = string.Empty; IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { int j = 0; //test object testoid = pFeature.OID; //格网码不为空 if (pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString().Length > 0) { //获取格网码 string pGrCode = pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString(); //分类码 int pFcodeindex = pFeature.Fields.FindField("FCode"); //存在分类码字段 if (pFcodeindex != -1) { string pFcode = pFeature.get_Value(pFeature.Fields.FindField("FCode")).ToString(); //分类码不为空 if (pFcode == " ") { //FillFrm(pFeature,pNullFrm.GetDataGridView,NullNum); NullNum++; } else { if (ZJGISCommon.Classes.ClsFcode.pDicFcodeGlobal.ContainsKey(pFcode)) { //如果分类码不为空——即名称字段不为空且Feature不为空。 //(Feature和名称字段内容不为空,那么格网码就不为空,进而地理编码就不为空) //组合第一个码段(格网码)和第二个码段(分类码) //处理分类码 //ClsReturnFCode pReturnFcode = new ClsReturnFCode(); //pFcode = pReturnFcode.ReturnFeatureClass(pFcode); pFcode = ZJGISCommon.Classes.ClsFcode.pDicFcodeGlobal[pFcode]; //分类码有对应的大类 if (pFcode != null) { foreach (string s in pDicGridCode.Values) { if (s == pGrCode) { j++; } } if (j == 1) { pNum = "A01"; } else if (j > 1 && j < 100) { List <IFeature> keyList = (from q in pDicGridCode where q.Value == pGrCode select q.Key).ToList <IFeature>(); //get all keys for (int k = 0; k < keyList.Count; k++) { if (pFeature.OID == keyList[k].OID) { pNum = "A" + string.Format("{0:00}", k + 1); } } } else { pNum = "B" + string.Format("{0:00}", j - 1); } //组合地理实体编码的第一、第二、第三个码段,形成最终的地理实体编码 pEntiidCode = pGrCode + pFcode + pNum; pDicEntiid.Add(pFeature, pEntiidCode); pDicGridFCode.Add(pFeature, pEntiidCode.Substring(0, pEntiidCode.Length - 2)); pFeature.set_Value(pFeature.Fields.FindField(strField), pEntiidCode); pFeature.Store(); } } else { MessageBox.Show("分类码" + pFcode + "不存在对应的大类,请添加分类码和大类的映射关系!"); } } } else { MessageBox.Show("图层没有分类码字段!"); return; } } pgBar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } pgBar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); if (NullNum != 0) { MessageBox.Show("编码生成完成!,其中FCode字段为空的要素个数为" + Convert.ToString(NullNum) + "个"); } else { MessageBox.Show("编码生成完成!"); } } else { MessageBox.Show("所选的数据集为空!"); } } else { MessageBox.Show("没有选中任何图层!"); } }
/// <summary> /// 补全格网 /// </summary> /// <param name="pMapControl"></param> /// <param name="cbxLayerName"></param> public void CreatGridCodeRest(IMap pMapControl, ComboBoxEx cbxLayerName) { string gridField = "GridCode"; IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text); progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null)); progressbar.Show(); IDataset cDataset = pFeatureLayer.FeatureClass as IDataset; IGeoDataset cGeoDataset = cDataset as IGeoDataset; ISpatialReference cSpatialReference = cGeoDataset.SpatialReference; if (cSpatialReference is IProjectedCoordinateSystem) { MessageBox.Show("该图层为投影坐标,请转换为相应的地理坐标,再开始地理编码!"); } if (pFeatureLayer != null) { //检查是否有格网字段,没有的话生成格网字段 pClsCom.CheckGridField(pFeatureLayer, gridField); IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); int i = pFeatureLayer.FeatureClass.FeatureCount(null); int j = 0; IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { //对于名称为空的字段进行筛选 //test //string test = pFeature.get_Value(pFeature.Fields.FindFieldByAliasName("名称")).ToString(); //对于名称为空的字段进行筛选 if (pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer as IDataset).Name].NameField)).ToString().Trim().Length > 0) { //存在ENTIID字段,且该Feature的ENTIID字段值不为空 if (pFeatureLayer.FeatureClass.Fields.FindField("ENTIID") != -1 && pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Length > 0) { pFeature = pFeatureCursor.NextFeature(); continue; } else { //获取格网信息 string GridCode = pClsCom.GetCodeString(pFeature); if (GridCode != "") { pFeature.set_Value(pFeature.Fields.FindField(gridField), GridCode); pFeature.Store(); j++; //pFeature = pFeatureCursor.NextFeature(); } else { MessageBoxEx.Show("格网码生成失败,请转换成地理坐标!"); return; } } } progressbar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } progressbar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); MessageBoxEx.Show("格网生成成功!"); } } else { MessageBoxEx.Show("没有选中任何图层!"); } }
/// <summary> /// 生成编码 /// </summary> /// <param name="pMapControl"></param> /// <param name="cbxLayerName"></param> public void CommentEntiCode2(IFeatureLayer pFeatureLayer, Dictionary <IFeature, string> pGridFCode, FrmProgressBar pgBar) { //要编码的字段——ENTIID string strField = "ENTIID"; if (pFeatureLayer != null) { //检查地理实体编码字段是否存在,不存在就添加地理实体编码字段 pClsCom.CheckGridField(pFeatureLayer, strField); IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); int i = pFeatureLayer.FeatureClass.FeatureCount(null); int j = 0; string pNum = string.Empty; string pCode = string.Empty; string pEntiidCode = string.Empty; IFeature pFeature = pFeatureCursor.NextFeature(); int NullNum = 0; while (pFeature != null) { string pGridCode = pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString().Trim(); //if (pGridFCode.ContainsKey(pFeature)) if (pGridCode.Length > 0) { //分类码 int index = pFeature.Fields.FindField("FCode"); if (index != -1) { string FCode = pFeature.get_Value(pFeature.Fields.FindField("FCode")).ToString(); if (FCode == " ") { NullNum++; } else { //处理分类码 if (ClsFcode.pDicFcodeGlobal.ContainsKey(FCode)) { FCode = ClsFcode.pDicFcodeGlobal[FCode]; FCode = FCode.ToUpper(); } // 确定分类码长度为3 if (FCode.Length == 3) { //格网代码和分类代码的组合 pCode = pGridCode + FCode; List <IFeature> pFeaturekeyList = (from q in pGridFCode where q.Value == pCode select q.Key).ToList <IFeature>(); //get all keys if (pFeaturekeyList.Count >= 1 && pFeaturekeyList.Count <= 99) { for (int k = 0; k < pFeaturekeyList.Count; k++) { if (pFeature.OID == pFeaturekeyList[k].OID) { pNum = "A" + string.Format("{0:00}", k + 1); } } } else if (pFeaturekeyList.Count > 99 && pFeaturekeyList.Count <= 198) { for (int k = 0; k < pFeaturekeyList.Count; k++) { if (pFeature.OID == pFeaturekeyList[k].OID) { pNum = "B" + string.Format("{0:00}", k - 99); } } } //20170314 pEntiidCode = pCode + pNum; pFeature.set_Value(pFeature.Fields.FindField(strField), pEntiidCode); pFeature.Store(); j++; } } } else { MessageBoxEx.Show("图层没有分类码字段!"); return; } } pgBar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } pgBar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); if (NullNum != 0) { MessageBoxEx.Show("编码生成完成!,其中FCode字段为空的要素个数为" + Convert.ToString(NullNum) + "个"); } else { MessageBoxEx.Show("编码生成完成!"); } } else { MessageBox.Show("所选的数据集为空!"); } } else { MessageBoxEx.Show("没有选中任何图层!"); } }
/// <summary> /// 生成编码 /// </summary> /// <param name="pMapControl"></param> /// <param name="cbxLayerName"></param> public void RESCode(IMap pMapControl, ComboBoxEx cbxLayerName) { Dictionary <int, string> pDic = new Dictionary <int, string>(); Dictionary <int, string> pDicAfter = new Dictionary <int, string>(); //要编码的字段——ENTIID string entiField = "ENTIID"; IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text); if (pFeatureLayer != null) { progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null)); progressbar.Show(); pClsCom.CheckGridField(pFeatureLayer, entiField); IDataset pDataset = pFeatureLayer.FeatureClass as IDataset; IWorkspaceEdit pWorkspaceEdit = null; if (pDataset != null) { pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit; if (pWorkspaceEdit != null || pWorkspaceEdit.IsBeingEdited() == false) { pWorkspaceEdit.StartEditing(true); pWorkspaceEdit.StartEditOperation(); } IFeatureCursor pFeatureCursor = pFeatureLayer.Search(null, false); int i = pFeatureLayer.FeatureClass.FeatureCount(null); int j = 0; string pNum = string.Empty; string pCode = string.Empty; string pEntiidCode = string.Empty; IFeature pFeature = pFeatureCursor.NextFeature(); int NullNum = 0; while (pFeature != null) { if (pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString().Length > 0) { //分类码 int index = pFeature.Fields.FindField("FCode"); if (index != -1) { string FCode = pFeature.get_Value(pFeature.Fields.FindField("FCode")).ToString(); if (FCode == " ") { //FillFrm(pFeature,pNullFrm.GetDataGridView,NullNum); NullNum++; } else { //test //object testoid = pFeature.OID; //处理分类码 //ClsReturnFCode pReturnFcode = new ClsReturnFCode(); //FCode = pReturnFcode.ReturnFeatureClass(FCode); if (ZJGISCommon.Classes.ClsFcode.pDicFcodeGlobal.ContainsKey(FCode)) { FCode = ZJGISCommon.Classes.ClsFcode.pDicFcodeGlobal[FCode]; if (FCode != null) { //处理格网吗 string GridCode = pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString(); //如果格网分类码不为空——即名称字段不为空且Feature不为空。 //(Feature和名称字段内容不为空,那么格网码就不为空,进而地理编码就不为空) if (GridCode.Trim().Length > 0) { //格网代码和分类代码的组合 pCode = GridCode + FCode; if (j == 0) { //pNum = "001"; pNum = "A01"; pDic.Add(j, pCode); } else { if (pDic.ContainsValue(pCode) == true) //字典中出现GridCode和Fcode的组合字段 { List <int> keyList = (from q in pDic where q.Value == pCode select q.Key).ToList <int>(); //get all keys keyList.Sort(); int t = keyList.Max(); object test = Convert.ToInt32(pDicAfter[keyList.Max()].Substring(pDicAfter[keyList.Max()].Length - 2)); string test2 = string.Format("{0:00}", Convert.ToInt32(pDicAfter[keyList.Max()].Substring(pDicAfter[keyList.Max()].Length - 2)) + 1); string pCharacter = pDicAfter[keyList.Max()].Substring(pDicAfter[keyList.Max()].Length - 3, 1); //后三位都是数字的情况下 //pNum = string.Format("{0:000}", Convert.ToInt32(pDicAfter[keyList.Max()].Substring(pDicAfter[keyList.Max()].Length - 3)) + 1); //后三位是1位字母加2位数字的情况下 if (pCharacter == "A" && Convert.ToInt32(pDicAfter[keyList.Max()].Substring(pDicAfter[keyList.Max()].Length - 2)) < 99) { pNum = "A" + string.Format("{0:00}", Convert.ToInt32(pDicAfter[keyList.Max()].Substring(pDicAfter[keyList.Max()].Length - 2)) + 1); } else { if (Convert.ToInt32(pDicAfter[keyList.Max()].Substring(pDicAfter[keyList.Max()].Length - 2)) == 99) { pNum = "B01"; } else { pNum = "B" + string.Format("{0:00}", Convert.ToInt32(pDicAfter[keyList.Max()].Substring(pDicAfter[keyList.Max()].Length - 2)) + 1); } } } else //字典中没有出现GridCode和Fcode的组合字段 { //pNum = "001"; pNum = "A01"; } pDic.Add(j, pCode);//20170310 } //20170314 pEntiidCode = pCode + pNum; if (!pDicAfter.Keys.Contains(j)) { pDicAfter.Add(j, pEntiidCode); } pFeature.set_Value(pFeature.Fields.FindField(entiField), pEntiidCode); pFeature.Store(); j++; } } else { MessageBox.Show("分类码" + FCode + "不存在对应的大类,请添加分类码和大类的映射关系!"); } } } } else { MessageBoxEx.Show("图层没有分类码字段!"); return; } } progressbar.GoOneStep(); pFeature = pFeatureCursor.NextFeature(); } progressbar.CloseForm(); pWorkspaceEdit.StopEditing(true); pWorkspaceEdit.StopEditOperation(); if (NullNum != 0) { MessageBoxEx.Show("编码生成完成!,其中FCode字段为空的要素个数为" + Convert.ToString(NullNum) + "个"); } else { MessageBoxEx.Show("编码生成完成!"); pDic.Clear(); } } else { MessageBox.Show("所选的数据集为空!"); } } else { MessageBoxEx.Show("没有选中任何图层!"); } }