예제 #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("没有选中任何图层,请选择图层!");
            }
        }
예제 #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("没有选中任何图层,请选择图层!");
            }
        }
예제 #3
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("没有选中任何图层,请选择图层!");
            }
        }
예제 #4
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("没有选中任何图层!");
            }
        }
예제 #5
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("没有选中任何图层!");
            }
        }
예제 #6
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("没有选中任何图层!");
            }
        }
예제 #7
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);
        }
예제 #8
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("没有选中任何图层!");
            }
        }
예제 #9
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("没有选中任何图层!");
            }
        }
예제 #10
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("没有选中任何图层!");
            }
        }
예제 #11
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("没有选中任何图层!");
            }
        }