Exemple #1
0
 public void CoordConvertMap()
 {
     try
     {
         WaitForm.Start("开始坐标系转换,请稍后...");
         IWorkspaceFactory pWsF = new AccessWorkspaceFactoryClass();
         m_SpatialReference = new UnknownCoordinateSystemClass();
         m_Envelop          = new EnvelopeClass();
         InitEnvelop();
         m_SpatialReference.SetDomain(m_Envelop.XMin, m_Envelop.XMax, m_Envelop.YMin, m_Envelop.YMax);
         m_SpatialReference.SetZDomain(-1000, 2097151002.92969);
         m_SpatialReference.SetMDomain(-1000, 8388607011.71875);
         //pWsF.Create(m_Path, m_Name, null, 0);
         IWorkspace pWs2     = pWsF.OpenFromFile(m_Path + @"\" + m_Name, 0);
         string     pWs1Path = Config.GetConfigValue("2DMdbPipe");
         if (pWs1Path == "")
         {
             return;
         }
         pWs1 = pWsF.OpenFromFile(pWs1Path, 0);
         CreateWorkspaceDomains(pWs1, pWs2);
         for (int i = 0; i < m_Map.LayerCount; i++)
         {
             ILayer layer = m_Map.get_Layer(i);
             if (layer.Visible)
             {
                 //WaitForm.SetCaption("正在转换图层" + layer.Name + ",请稍后...");
                 CoordConvertLayers(layer, m_SpatialReference);
             }
         }
         WaitForm.SetCaption("坐标系转换成功!");
         WaitForm.Stop();
     }
     catch (System.Exception ex)
     {
         WaitForm.Stop();
     }
 }
        //** 功能描述: 通过一个字段集,创建另外一个字段集,直接添加传入的字段集中的所有字段的话
        //             会产生高版本和低版本不兼容的问题,

        public static IFields GetFieldsByFields(IFields pFields, ref ISpatialReference pDesSpatialReference, Dictionary <string, string> pDicField)
        {
            //pDesSpatialReference = null;
            //pDicField = null;

            int               i                    = 0;
            IField            pField               = default(IField);
            IFieldEdit        pFieldEdit           = default(IFieldEdit);
            IFieldsEdit       pFieldsEdit          = default(IFieldsEdit);
            IField            pCreateField         = default(IField);
            ISpatialReference pOriSpatialReference = default(ISpatialReference);

            IGeometryDef     pGeometryDef     = default(IGeometryDef);
            IGeometryDefEdit pGeometryDefEdit = default(IGeometryDefEdit);
            double           ymin             = 0;
            double           xmin             = 0;
            double           xmax             = 0;
            double           ymax             = 0;
            double           mMin             = 0;
            double           zmin             = 0;
            double           zmax             = 0;
            double           mMax             = 0;
            IEnvelope        pEnvelop         = default(IEnvelope);
            IGeometry        pGeometry        = default(IGeometry);
            IClone           pClone           = default(IClone);
            //标识该字段是否被添加
            bool bIsAddField = false;

            //应该把OID字段添加进去,否则会产生错误
            pFieldsEdit = new FieldsClass();

            for (i = 0; i <= pFields.FieldCount - 1; i++)
            {
                pField = pFields.get_Field(i);

                if (pField.Editable | pField.Type == esriFieldType.esriFieldTypeOID | pField.Type == esriFieldType.esriFieldTypeGlobalID | pField.Type == esriFieldType.esriFieldTypeGUID)
                {
                    pClone       = (IClone)pField;
                    pCreateField = (IField)pClone.Clone();

                    //如果更改字段名称:如果是OID字段的话,即便不在dic中也要进行添加
                    if ((pDicField != null))
                    {
                        if (pDicField.ContainsKey(Strings.Trim(pField.Name)))
                        {
                            bIsAddField = true;
                            //修改字段的名称
                            pFieldEdit        = (IFieldEdit)pCreateField;
                            pFieldEdit.Name_2 = pDicField[Strings.Trim(pField.Name)];

                            //需不需要把别名赋过去,根据需要再看吧,现在看的话应该不要赋过去,因此一般字段名和别名是一样的
                            //如果赋过去的话,显示的是原字段的别名,即不是用户想看到的字段名
                            //pFieldEdit.AliasName = pField.AliasName
                        }
                        else if (pField.Type == esriFieldType.esriFieldTypeOID | pField.Type == esriFieldType.esriFieldTypeGlobalID | pField.Type == esriFieldType.esriFieldTypeGUID)
                        {
                            bIsAddField = true;
                        }
                        else
                        {
                            bIsAddField = false;
                        }
                    }
                    else
                    {
                        bIsAddField = true;
                    }
                    if (pField.Type == esriFieldType.esriFieldTypeGeometry)
                    {
                        pGeometryDef     = pCreateField.GeometryDef;
                        pGeometryDefEdit = (IGeometryDefEdit)pGeometryDef;



                        if ((pDesSpatialReference != null))
                        {
                            pOriSpatialReference = pGeometryDef.SpatialReference;

                            //从原来的空间参考中得到domain
                            if (pOriSpatialReference.HasXYPrecision())
                            {
                                pOriSpatialReference.GetDomain(out xmin, out xmax, out ymin, out ymax);
                            }

                            pEnvelop = new EnvelopeClass();
                            pEnvelop.PutCoords(xmin, ymin, xmax, ymax);
                            pGeometry = pEnvelop;
                            pGeometry.SpatialReference = pOriSpatialReference;
                            pGeometry.Project(pDesSpatialReference);
                            xmax = pEnvelop.XMax;
                            xmin = pEnvelop.XMin;
                            ymax = pEnvelop.YMax;
                            ymin = pEnvelop.YMin;

                            pDesSpatialReference.SetDomain(xmin, xmax, ymin, ymax);

                            if (pOriSpatialReference.HasZPrecision())
                            {
                                pOriSpatialReference.GetZDomain(out zmin, out zmax);
                                pDesSpatialReference.SetZDomain(zmin, zmax);
                            }

                            if (pOriSpatialReference.HasMPrecision())
                            {
                                pOriSpatialReference.GetMDomain(out mMin, out mMax);
                                pDesSpatialReference.SetMDomain(mMin, mMax);
                            }

                            pGeometryDefEdit.SpatialReference_2 = pDesSpatialReference;
                        }
                        //修改grid的大小
                        if (pGeometryDef.GridCount != 0)
                        {
                            if (pGeometryDef.get_GridSize(0) < 100)
                            {
                                pGeometryDefEdit.set_GridSize(0, 100);
                            }
                        }
                        bIsAddField = true;
                    }

                    if (bIsAddField == true)
                    {
                        pFieldsEdit.AddField(pCreateField);
                        bIsAddField = false;
                    }
                }
            }
            return(pFieldsEdit);
        }
Exemple #3
0
        public IFields get_Fields(int ClassIndex)
        {
            IFieldEdit              fieldEdit;
            IFields                 fields;
            IFieldsEdit             fieldsEdit;
            IObjectClassDescription fcDesc;

            if (this.DatasetType == esriDatasetType.esriDTTable)
            {
                fcDesc = new ObjectClassDescriptionClass();
            }
            else
            {
                fcDesc = new FeatureClassDescriptionClass();
            }

            fields     = fcDesc.RequiredFields;
            fieldsEdit = (IFieldsEdit)fields;

            fieldEdit          = new FieldClass();
            fieldEdit.Length_2 = 1;
            fieldEdit.Name_2   = "ColumnOne";
            fieldEdit.Type_2   = esriFieldType.esriFieldTypeString;
            fieldsEdit.AddField((IField)fieldEdit);

            //HIGHLIGHT: Add extra int column
            fieldEdit        = new FieldClass();
            fieldEdit.Name_2 = "Extra";
            fieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
            fieldsEdit.AddField((IField)fieldEdit);

            //HIGHLIGHT: Set shape field geometry definition
            if (this.DatasetType != esriDatasetType.esriDTTable)
            {
                IField field = fields.get_Field(fields.FindField("Shape"));
                fieldEdit = (IFieldEdit)field;
                IGeometryDefEdit geomDefEdit = (IGeometryDefEdit)field.GeometryDef;
                geomDefEdit.GeometryType_2 = geometryTypeByID(ClassIndex);
                ISpatialReference shapeSRef = this.spatialReference;

                #region M & Z
                //M
                if ((ClassIndex >= 3 && ClassIndex <= 5) || ClassIndex >= 9)
                {
                    geomDefEdit.HasM_2 = true;
                    shapeSRef.SetMDomain(0, 1000);
                }
                else
                {
                    geomDefEdit.HasM_2 = false;
                }

                //Z
                if (ClassIndex >= 6)
                {
                    geomDefEdit.HasZ_2 = true;
                    shapeSRef.SetZDomain(0, 1000);
                }
                else
                {
                    geomDefEdit.HasZ_2 = false;
                }
                #endregion

                geomDefEdit.SpatialReference_2 = shapeSRef;
            }

            return(fields);
        }