Beispiel #1
0
        /// <summary>
        /// 对图元编码
        /// </summary>
        /// <param name="pMapControl"></param>
        /// <param name="cbxLayerName"></param>
        public void PrimitiveCode(IMap pMapControl, ComboBoxEx cbxLayerName)
        {
            IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text);

            string elemid = "ELEMID";

            //遍历字段
            if (pFeatureLayer != null)
            {
                progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null) * 2);
                progressbar.Show();

                IField  pField  = null;
                IFields pFields = pFeatureLayer.FeatureClass.Fields;

                bool pPrimitiveCode = false;

                for (int i = 0; i < pFields.FieldCount - 1; i++)
                {
                    pField = pFields.get_Field(i);
                    if (pField.Name == elemid)
                    {
                        pPrimitiveCode = true;
                    }
                }

                if (!pPrimitiveCode)
                {
                    MessageBox.Show("不存在图元标识码字段!");
                }

                //对图元进行编码
                CreatePrimitiveCode(pFeatureLayer, elemid, progressbar);
                MessageBox.Show("图元编码成功!");
            }
            else
            {
                MessageBox.Show("没有选中任何图层,请选择图层!");
            }
        }
Beispiel #2
0
        /// <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("没有选中任何图层,请选择图层!");
            }
        }
Beispiel #3
0
        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();
            }
        }
Beispiel #4
0
        /// <summary>
        /// 对剩余POI点进行编码
        /// </summary>
        /// <param name="pMapControl"></param>
        /// <param name="cbxLayerName"></param>
        public void RestPOICode(IMap pMapControl, ComboBoxEx cbxLayerName)
        {
            IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text);

            if (pFeatureLayer != null)
            {
                progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null) * 2);
                progressbar.Show();

                IFields pFields = pFeatureLayer.FeatureClass.Fields;

                Dictionary <IFeature, string> pDicGridCode = new Dictionary <IFeature, string>();
                Dictionary <IFeature, string> pEntiCode    = new Dictionary <IFeature, string>();
                //遍历Feature
                IDataset      pDataset      = pFeatureLayer.FeatureClass as IDataset;
                IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
                bool          hasFOCDE      = false;
                string        fCODE         = string.Empty;
                for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
                {
                    if (pFeatureClass.Fields.get_Field(i).Name == "FCODE")
                    {
                        hasFOCDE = true;
                    }
                }

                if (hasFOCDE)
                {
                    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)
                        {
                            //格网不为空,记录格网
                            if (pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString().Length > 0)
                            {
                                pDicGridCode.Add(pFeature, pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString());
                            }
                            //地理编码不为空,截取格网并记录下来
                            if (pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Trim().Length > 0)
                            {
                                string pgdCode = pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Substring(0, 11);
                                if (!pDicGridCode.ContainsKey(pFeature))
                                {
                                    pDicGridCode.Add(pFeature, pgdCode);
                                }

                                if (!pEntiCode.ContainsKey(pFeature))
                                {
                                    pEntiCode.Add(pFeature, pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString());
                                }
                            }
                            progressbar.GoOneStep();
                            pFeature = pFeatureCursor.NextFeature();
                        }
                        pWorkspaceEdit.StopEditing(true);
                        pWorkspaceEdit.StopEditOperation();
                        RestPOICode2(pFeatureLayer, pEntiCode, pDicGridCode, "GridCode", "ENTIID", progressbar);
                    }
                    else
                    {
                        MessageBox.Show("该图层不存在分类码字段!分类码字段名称应该FCODE");
                        return;
                    }
                    MessageBox.Show("剩余POI编码成功!");
                }
                else
                {
                    MessageBox.Show("没有分类码FCODE字段,请检查图层字段!");
                }
            }
            else
            {
                MessageBox.Show("没有选中任何图层,请选择图层!");
            }
        }
Beispiel #5
0
        /// <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("没有选中任何图层!");
            }
        }
Beispiel #6
0
        /// <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("没有选中任何图层!");
            }
        }
Beispiel #7
0
        /// <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("没有选中任何图层!");
            }
        }
Beispiel #8
0
        /// <summary>
        /// 生成格网码(道路)
        /// </summary>
        /// <param name="pMapControl"></param>
        /// <param name="cbxLayerName"></param>
        public void CreatGridCodeRoad(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";
            string        roadField     = "ROADCODE";
            IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text);
            IFeatureClass pFeatureClass = null;

            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) * 2);
                progressbar.Show();

                pFeatureClass = pFeatureLayer.FeatureClass;

                //存在路网字段
                if (pFeatureClass.Fields.FindField(roadField) != -1)
                {
                    //没有GridCode字段就创建GridCode字段
                    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, k = 0, m = 0;

                        IFeature pFeature = pFeatureCursor.NextFeature();
                        //TODO :路线编码字段
                        while (pFeature != null)
                        {
                            //名称不为空,路线编码为空
                            if (pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString().Trim().Length > 0)
                            {
                                pNameNotNull.Add(pFeature, pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString());
                                pOID.Add(pFeature.OID);
                            }
                            //路线编码不为空且一个道路字母除外(例如Q等),名称为空
                            if (pFeature.get_Value(pFeature.Fields.FindField(roadField)).ToString().Trim().Length > 1 &&
                                pFeature.get_Value(pFeature.Fields.FindField(ClsConfig.LayerConfigs[(pFeatureLayer.FeatureClass as IDataset).Name].NameField)).ToString().Trim().Length == 0)
                            {
                                pRoadNotNull.Add(pFeature, pFeature.get_Value(pFeature.Fields.FindField(roadField)).ToString());
                                pOID.Add(pFeature.OID);
                            }
                            progressbar.GoOneStep();

                            pFeature = pFeatureCursor.NextFeature();
                        }
                        //progressbar.CloseForm();
                        pWorkspaceEdit.StopEditing(true);
                        pWorkspaceEdit.StopEditOperation();
                    }
                    CreatGridCodeRoad2(pFeatureLayer, pNameNotNull, pRoadNotNull, pOID, progressbar);
                }
                else
                {
                    MessageBox.Show("此图层不存在ROADCODE路网字段,请重新检查图层字段!");
                }
            }
            else
            {
                MessageBox.Show("没有选中任何图层!");
            }
        }
Beispiel #9
0
        /// <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);
        }
Beispiel #10
0
        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("没有选中任何图层!");
            }
        }
Beispiel #11
0
        /// <summary>
        /// 补全编码
        /// </summary>
        /// <param name="pMapControl"></param>
        /// <param name="cbxLayerName"></param>
        public void CodeRest(IMap pMapControl, ComboBoxEx cbxLayerName)
        {
            Dictionary <IFeature, string> pDicGridCode  = new Dictionary <IFeature, string>();
            Dictionary <IFeature, string> pDicGridFCode = new Dictionary <IFeature, string>();
            Dictionary <IFeature, string> pDicEntiid    = new Dictionary <IFeature, string>();

            string entiField = "ENTIID";

            IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text);

            if (pFeatureLayer != null)
            {
                progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null) * 2);
                progressbar.Show();

                //判断是否存在ENTIID字段,如果不存在,新增ENTIID字段
                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);
                    string         pNum           = string.Empty;
                    string         pCode          = string.Empty;
                    string         pEntiidCode    = string.Empty;
                    IFeature       pFeature       = pFeatureCursor.NextFeature();
                    while (pFeature != null)
                    {
                        //有格网码,没有实体编码
                        if (pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString().Length > 0 && pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Length == 0)
                        {
                            pDicGridCode.Add(pFeature, pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString());
                        }
                        //有实体编码,没有格网码
                        if (pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString().Length == 0 && pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Length > 0)
                        {
                            pDicEntiid.Add(pFeature, pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString());
                            //test
                            //string test = pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Substring(0, 11);
                            //string test1 = pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Substring(0, pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Length - 2);
                            pDicGridCode.Add(pFeature, pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Substring(0, 11));
                            pDicGridFCode.Add(pFeature, pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Substring(0, pFeature.get_Value(pFeature.Fields.FindField("ENTIID")).ToString().Length - 2));
                        }
                        progressbar.GoOneStep();
                        pFeature = pFeatureCursor.NextFeature();
                    }
                    pWorkspaceEdit.StopEditing(true);
                    pWorkspaceEdit.StopEditOperation();
                    CodeRest2(pFeatureLayer, pDicEntiid, pDicGridFCode, pDicGridCode, progressbar);
                }
                else
                {
                    MessageBox.Show("所选的数据集为空!");
                }
            }
            else
            {
                MessageBox.Show("没有选中任何图层!");
            }
        }
Beispiel #12
0
        /// <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("没有选中任何图层!");
            }
        }
Beispiel #13
0
        /// <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("没有选中任何图层!");
            }
        }
Beispiel #14
0
        /// <summary>
        /// 生成编码
        /// </summary>
        /// <param name="pMapControl"></param>
        /// <param name="cbxLayerName"></param>
        public void CommonEntiCode(IMap pMapControl, ComboBoxEx cbxLayerName)
        {
            //要编码的字段——ENTIID
            string strField = "ENTIID";
            Dictionary <IFeature, string> pGridFCode = new Dictionary <IFeature, string>();
            IFeatureLayer pFeatureLayer = (IFeatureLayer)pClsCom.GetLayerByName(pMapControl, cbxLayerName.Text);

            if (pFeatureLayer != null)
            {
                //检查地理实体编码字段是否存在,不存在就添加地理实体编码字段
                pClsCom.CheckGridField(pFeatureLayer, strField);

                IDataset       pDataset       = pFeatureLayer.FeatureClass as IDataset;
                IWorkspaceEdit pWorkspaceEdit = null;
                if (pDataset != null)
                {
                    progressbar = new FrmProgressBar(pFeatureLayer.FeatureClass.FeatureCount(null) * 2);
                    progressbar.Show();

                    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();

                    while (pFeature != null)
                    {
                        string pGridCode = pFeature.get_Value(pFeature.Fields.FindField("GridCode")).ToString().Trim();
                        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.Length > 0)
                                {
                                    //处理分类码
                                    if (ZJGISCommon.Classes.ClsFcode.pDicFcodeGlobal.ContainsKey(FCode))
                                    {
                                        FCode = ClsFcode.pDicFcodeGlobal[FCode];
                                        FCode = FCode.ToUpper();
                                    }

                                    if (FCode.Length > 0)
                                    {
                                        //格网代码和分类代码的组合
                                        pCode = pGridCode + FCode;
                                        pGridFCode.Add(pFeature, pCode);
                                    }
                                }
                            }
                        }

                        progressbar.GoOneStep();
                        pFeature = pFeatureCursor.NextFeature();
                    }
                    pWorkspaceEdit.StopEditing(true);
                    pWorkspaceEdit.StopEditOperation();
                }
                else
                {
                    MessageBox.Show("所选的数据集为空!");
                }
                CommentEntiCode2(pFeatureLayer, pGridFCode, progressbar);
            }
            else
            {
                MessageBoxEx.Show("没有选中任何图层!");
            }
        }
Beispiel #15
0
        /// <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
        }
Beispiel #16
0
        /// <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("没有选中任何图层!");
            }
        }