基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)-AE常用操作代码

先打一个广告:我的独立博客网址是:http://wuyouqiang.sinaapp.com/

我的新浪微博:http://weibo.com/freshairbrucewoo

欢迎大家相互交流,共同提高技术。

     本来打算睡觉了,但是突然看到自己保留的一个单独的C#文件,原来是AE常用操作的代码,这也是自己在做ArcGIS空间数据管理平台的项目时积累下来的,这里贴出来供需要使用的人。

/********************************************************
 * 
 * 本类部分功能接口依附于_workSpaceInstance
 * 必须首先使用CreateWorkspace或者OpenWorkspaceFromFile
 * 实例化_workSpaceInstance,才能使用
 *
********************************************************/
using System;
using System.Windows.Forms;
using System.IO;
using System.Data;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.CatalogUI;

namespace ControlLibrary
{
    class RuleDBCreater
    {
        private static IWorkspace _workSpaceInstance;
        public RuleDBCreater()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        public static void setWorkSpaceInstance(IWorkspace ws)
        {
            _workSpaceInstance = ws;
        }

        public static IWorkspace getWorkSpaceInstance()
        {
            return _workSpaceInstance;
        }
        /// <summary>
        /// 创建规则数据库workspace
        /// </summary>
        /// <param name="workspaceType"></param>
        /// <param name="WorkspaceDirectory"></param>
        /// <returns>返回workspace实例</returns>
        public static IWorkspace CreateWorkspace(string pName, string pPath)
        {
            IWorkspaceFactory workspaceFactory = null;
            Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.AccessWorkspaceFactory");
            workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
            Directory.CreateDirectory(pPath);
            IWorkspaceName workspaceName = workspaceFactory.Create(pPath, pName,null, 0);
            IName Name = (IName)workspaceName;
            _workSpaceInstance = (IWorkspace)(Name.Open());
            return _workSpaceInstance;
        }
        /// <summary>
        /// 从文件创建规则数据库workspace
        /// </summary>
        /// <param name="WorkspaceDirectory"></param>
        /// <returns>返回workspace实例</returns>
        public static IWorkspace OpenWorkspaceFromFile(string WorkspaceDirectory)
        {
            IWorkspaceFactory workspaceFactory = null;
            Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.AccessWorkspaceFactory");
            workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
            _workSpaceInstance = workspaceFactory.OpenFromFile(WorkspaceDirectory, 0);
            return _workSpaceInstance;
        }
        /// <summary>
        /// 创建要素数据集
        /// </summary>
        /// <param name="name"></param>
        /// <returns>IFeatureDataset</returns>
        public static IFeatureDataset CreateFeatureDataSet(/*string name,ISpatialReference srf*/)
        {
            IFeatureDatasetDialog fdlg = new FeatureDatasetDefDialog();
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)_workSpaceInstance;
            return fdlg.DoModalCreate(featureWorkspace, 0);
            //if (_workSpaceInstance == null) return null;
            //IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)_workSpaceInstance;
            //IFeatureDataset tmp = featureWorkspace.CreateFeatureDataset(name, srf);
            //return tmp;
        }
        /// <summary>
        /// 删除要素数据集
        /// </summary>
        /// <param name="name"></param>
        /// <param name="srf"></param>
        /// <returns></returns>
        public static void DeleteFeatureDataSet(string name)
        {
            IFeatureDataset fds = GetFeatureDataSet(name);
            if (fds != null)
                fds.Delete();
        }
        /// <summary>
        /// 获取数据库中IFeatureDataset
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static IFeatureDataset GetFeatureDataSet(string name)
        {
            if (_workSpaceInstance == null) return null;
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)_workSpaceInstance;
            IFeatureDataset tmp = featureWorkspace.OpenFeatureDataset(name);
            return tmp;
        }
        /// <summary>
        /// 重命名DataSet
        /// </summary>
        /// <param name="fds"></param>
        /// <param name="newname"></param>
        public static void RenameFeatureDataSet(IFeatureDataset fds,string newname)
        {
            if (fds.CanRename())
            {
                fds.Rename(newname);
            }
        }
        /// <summary>
        /// 获取IFeatureDataset空间参照
        /// </summary>
        /// <param name="ds"></param>
        /// <returns></returns>
        public static ISpatialReference GetFdsSpatialReference(IFeatureDataset ds)
        {
            IGeoDataset gds = ds as IGeoDataset;
            return gds.SpatialReference;
        }
        /// <summary>
        /// 设置IFeatureDataset空间参照
        /// </summary>
        /// <param name="ds"></param>
        /// <returns></returns>
        public static void SetFdsSpatialReference(IFeatureDataset ds)
        {
            IGeoDataset gds = ds as IGeoDataset;
            // Cast the geodataset to the IGeoDatasetSchemaEdit interface and set the Spatial Reference.    
            IGeoDatasetSchemaEdit geoDatasetSchemaEdit = (IGeoDatasetSchemaEdit)gds;
            if (geoDatasetSchemaEdit.CanAlterSpatialReference)
            {
                geoDatasetSchemaEdit.AlterSpatialReference(EditSpatialReferenceDlg(gds.SpatialReference));
            }
        }
        /// <summary>
        /// 创建属性字段
        /// </summary>
        /// <param name="shapeType"></param>
        /// <param name="dgrc"></param>
        /// <param name="spr"></param>
        /// <returns></returns>
        public static IFields CreateFields(string shapeType, DataTable dt, ISpatialReference spr,bool hasM,bool hasZ)
        {
            IField oField = new FieldClass();
            IFieldEdit oFieldEdit = oField as IFieldEdit;
            IFields oFields = new FieldsClass();
            IFieldsEdit oFieldsEdit = oFields as IFieldsEdit;

            IGeometryDef geometryDef = new GeometryDefClass();
            IGeometryDefEdit geometryDefEdit = geometryDef as IGeometryDefEdit;

            foreach(DataRow dr in dt.Rows)
            {
                switch (dr[1].ToString())
                {
                    case "Object ID":
                        oFieldEdit.Name_2 = "ObjectID";
                        oFieldEdit.AliasName_2 = "FID";
                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Multipoint Features":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = "SHAPE";
                        oFieldEdit.IsNullable_2 = true;
                        oFieldEdit.Required_2 = true;

                        geometryDefEdit.AvgNumPoints_2 = 1;
                        geometryDefEdit.GridCount_2 = 0;
                        geometryDefEdit.HasM_2 = hasM;
                        geometryDefEdit.HasZ_2 = hasZ;
                        geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryMultipoint;
                        geometryDefEdit.SpatialReference_2 = spr;

                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                        oFieldEdit.GeometryDef_2 = (GeometryDef)geometryDefEdit;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "MultiPatch Features":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = "SHAPE";
                        oFieldEdit.IsNullable_2 = true;
                        oFieldEdit.Required_2 = true;
                       
                        geometryDef = new GeometryDefClass();
                        geometryDefEdit = geometryDef as IGeometryDefEdit;
                        geometryDefEdit.AvgNumPoints_2 = 1;
                        geometryDefEdit.GridCount_2 = 0;
                        geometryDefEdit.HasM_2 = hasM;
                        geometryDefEdit.HasZ_2 = hasZ;
                        geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryMultiPatch;
                        geometryDefEdit.SpatialReference_2 = spr;

                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                        oFieldEdit.GeometryDef_2 = (GeometryDef)geometryDefEdit;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Point Features":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = "SHAPE";
                        oFieldEdit.IsNullable_2 = true;
                        oFieldEdit.Required_2 = true;

                        geometryDef = new GeometryDefClass();
                        geometryDefEdit = geometryDef as IGeometryDefEdit;
                        geometryDefEdit.AvgNumPoints_2 = 1;
                        geometryDefEdit.GridCount_2 = 0;
                        geometryDefEdit.HasM_2 = hasM;
                        geometryDefEdit.HasZ_2 = hasZ;
                        geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
                        geometryDefEdit.SpatialReference_2 = spr;

                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                        oFieldEdit.GeometryDef_2 = (GeometryDef)geometryDefEdit;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Line Features":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = "SHAPE";
                        oFieldEdit.IsNullable_2 = true;
                        oFieldEdit.Required_2 = true;
            
                        geometryDef = new GeometryDefClass();
                        geometryDefEdit = geometryDef as IGeometryDefEdit;
                        geometryDefEdit.AvgNumPoints_2 = 1;
                        geometryDefEdit.GridCount_2 = 0;
                        geometryDefEdit.HasM_2 = hasM;
                        geometryDefEdit.HasZ_2 = hasZ;
                        geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryLine;
                        geometryDefEdit.SpatialReference_2 = spr;

                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                        oFieldEdit.GeometryDef_2 = (GeometryDef)geometryDefEdit;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Polygon Features":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = "SHAPE";
                        oFieldEdit.IsNullable_2 = true;
                        oFieldEdit.Required_2 = true;

                        geometryDef = new GeometryDefClass();
                        geometryDefEdit = geometryDef as IGeometryDefEdit;
                        geometryDefEdit.AvgNumPoints_2 = 1;
                        geometryDefEdit.GridCount_2 = 0;
                        geometryDefEdit.HasM_2 = hasM;
                        geometryDefEdit.HasZ_2 = hasZ;
                        geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
                        geometryDefEdit.SpatialReference_2 = spr;

                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
                        oFieldEdit.GeometryDef_2 = (GeometryDef)geometryDefEdit;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Short Int":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = dr[0].ToString();
                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
                        oFieldEdit.IsNullable_2 = true;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Long Int":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = dr[0].ToString();
                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Float":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = dr[0].ToString();
                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeSingle;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Double":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = dr[0].ToString();
                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Text":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = dr[0].ToString();
                        oFieldEdit.Length_2 = 30; // Only string fields require that you set the length.
                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
                        oFieldsEdit.AddField(oField);
                        break;
                    case "Date":
                        oField = new FieldClass();
                        oFieldEdit = oField as IFieldEdit;
                        oFieldEdit.Name_2 = dr[0].ToString();
                        oFieldEdit.Type_2 = esriFieldType.esriFieldTypeDate;
                        oFieldsEdit.AddField(oField);
                        break;
                    //case "Guid":
                    //    IField fld12 = new FieldClass();
                    //    IFieldEdit fldedt12 = (IFieldEdit)fld12;
                    //    fldedt12.Name_2 = dr[0].ToString();
                    //    fldedt12.Type_2 = esriFieldType.esriFieldTypeGUID;
                    //    fieldsEdit.set_Field(i, fld12);
                    //    break;
                    //case "Geomery":
                    //    IField fld13 = new FieldClass();
                    //    IFieldEdit fldedt13 = (IFieldEdit)fld13;
                    //    fldedt13.Name_2 = dr[0].ToString();
                    //    fldedt13.IsNullable_2 = true;
                    //    fldedt13.Required_2 = true;
                    //    IGeometryDef geometryDef13 = new GeometryDefClass();
                    //    IGeometryDefEdit geometryDefEdit13 = (IGeometryDefEdit)geometryDef13;
                    //    geometryDef13 = new GeometryDefClass();
                    //    geometryDefEdit13 = (IGeometryDefEdit)geometryDef13;
                    //    geometryDefEdit13.AvgNumPoints_2 = 1;
                    //    geometryDefEdit13.GridCount_2 = 0;
                    //    geometryDefEdit13.HasM_2 = hasM;
                    //    geometryDefEdit13.HasZ_2 = hasZ;
                    //    fldedt13.Type_2 = esriFieldType.esriFieldTypeGeometry;
                    //    geometryDefEdit13.GeometryType_2 = esriGeometryType.esriGeometryAny;
                    //    //Generate a default Spatial Reference
                    //    geometryDefEdit13.SpatialReference_2 = spr;
                    //    fldedt13.GeometryDef_2 = (GeometryDef)geometryDefEdit13;
                    //    fldedt13.Type_2 = esriFieldType.esriFieldTypeGeometry;
                    //    fieldsEdit.set_Field(i, fld13);
                    //    break;
                    //case "Raster":
                    //    IField fld14 = new FieldClass();
                    //    IFieldEdit fldedt14 = (IFieldEdit)fld14;
                    //    fldedt14.Name_2 = dr[0].ToString();
                    //    fldedt14.Type_2 = esriFieldType.esriFieldTypeRaster;
                    //    fieldsEdit.set_Field(i, fld14);
                    //    break;
                }
            }
            return oFields;
        }     
        /// <summary>
        /// 创建要素类
        /// </summary>
        /// <param name="workspace"></param>
        /// <param name="featureDataset"></param>
        /// <param name="featureClassName"></param>
        /// <param name="fields"></param>
        /// <param name="CLSID"></param>
        /// <param name="CLSEXT"></param>
        /// <param name="strConfigKeyword"></param>
        /// <returns></returns>
        public static IFeatureClass CreateFeatureClass(IFeatureDataset featureDataset, String featureClassName, IFields fields)
        {
            if (_workSpaceInstance == null) return null;
            IFeatureClass featureClass = null;
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)_workSpaceInstance; 

            // assign the class id value if not assigned
            ESRI.ArcGIS.esriSystem.UID CLSID = null;
            ESRI.ArcGIS.esriSystem.UID CLSEXT = null;
            string strConfigKeyword = "";
            if (CLSID == null)
            {
                CLSID = new ESRI.ArcGIS.esriSystem.UIDClass();
                CLSID.Value = "esriGeoDatabase.Feature";
            }

            System.String strShapeField = "";

            // locate the shape field
            for (Int32 j = 0; j < fields.FieldCount; j++)
            {
                esriFieldType dd = fields.get_Field(j).Type;
                if (dd == esriFieldType.esriFieldTypeGeometry)
                {
                    strShapeField = fields.get_Field(j).Name;
                }
            }

            // finally create and return the feature class
            if (featureDataset != null)
            {
                featureClass = featureDataset.CreateFeatureClass(featureClassName, fields, CLSID, CLSEXT, esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
            }
            
            return featureClass;
        }
        /// <summary>
        /// 获取FeatureClass从IFeatureDataset
        /// </summary>
        /// <param name="featDs"></param>
        /// <param name="className"></param>
        /// <returns></returns>
        public static IFeatureClass GetFeatureClassFromFeatureDataset(IFeatureDataset featDs, string className)
        {
            IFeatureClass featClass;
            IFeatureClassContainer fcContainer = featDs as IFeatureClassContainer;
            for (int i = 0; i < fcContainer.ClassCount; i++)
            {
                featClass = fcContainer.get_Class(i);
                if (RuleDBCreater.GetFeatureClassName(featClass) == className)
                {
                    return featClass;
                }
            }
            return null;
        }
        /// <summary>
        /// 重命名FeatureClass
        /// </summary>
        /// <param name="fds"></param>
        /// <param name="newname"></param>
        public static void RenameFeatureClass(IFeatureClass fc,string newname)
        {
            IDataset ds = fc as IDataset;
            if (ds.CanRename())
            {
                ds.Rename(newname);
            }
        }
        /// <summary>
        /// 从数据集删除要素类
        /// </summary>
        /// <param name="featureDataset"></param>
        /// <param name="featureClassName"></param>
        /// <param name="fields"></param>
        /// <returns></returns>
        public static void DeleteFeatureClass(IFeatureDataset featureDataset, String featureClassName)
        {
            IFeatureClass fc = GetFeatureClassFromFeatureDataset(featureDataset, featureClassName);
            if (fc != null)
            {
                IDataset ds = fc as IDataset;
                if (ds.CanDelete())
                {
                    ds.Delete();
                }
            }
        }
        /// <summary>
        /// 编辑空间参照
        /// </summary>
        /// <param name="inputSpr"></param>
        /// <returns></returns>
        public static ISpatialReference EditSpatialReferenceDlg(ISpatialReference inputSpr)
        {
            ESRI.ArcGIS.CatalogUI.ISpatialReferenceDialog2 spatialReferenceDialog2 = new ESRI.ArcGIS.CatalogUI.SpatialReferenceDialogClass();
            ISpatialReference spf = spatialReferenceDialog2.DoModalEdit(inputSpr, false, false, false, false, false, false, false, 0);
            return spf;
        }
        /// <summary>
        /// 创建空间参照
        /// </summary>
        /// <param name="coordinateSystem"></param>
        /// <returns></returns>
        public static ISpatialReference CreateSpatialReferenceDlg()//
        {
            ESRI.ArcGIS.CatalogUI.ISpatialReferenceDialog2 spatialReferenceDialog2 = new ESRI.ArcGIS.CatalogUI.SpatialReferenceDialogClass();
            ISpatialReference spatialReference = spatialReferenceDialog2.DoModalCreate(true, false, false, 0);
            //ISpatialReferenceTolerance spatialReferenceTolerance = spatialReference as ISpatialReferenceTolerance;
            return spatialReference;
        }

        public static ISpatialReference SetXYZMTolerance(ISpatialReference srf,double xytolerance,double ztolerance,double mtolerance)
        {
            ISpatialReferenceTolerance spatialReferenceTolerance = srf as ISpatialReferenceTolerance;
            //spatialReferenceTolerance.XYTolerance = xytolerance;
            //spatialReferenceTolerance.ZTolerance = ztolerance;
            //spatialReferenceTolerance.MTolerance = mtolerance;
            return srf;
        }

        public static void GetXYZMTolerance(ISpatialReference srf,out double xytolerance,out double ztolerance,out double mtolerance)
        {
            ISpatialReferenceTolerance spatialReferenceTolerance = srf as ISpatialReferenceTolerance;
            xytolerance = spatialReferenceTolerance.XYTolerance;
            ztolerance = spatialReferenceTolerance.ZTolerance;
            mtolerance = spatialReferenceTolerance.MTolerance;
        }
        /// <summary>
        /// 获取工作区内所有数据集名称
        /// </summary>
        /// <param name="ws"></param>
        /// <returns></returns>
        public static IEnumDatasetName GetFeatureDataSetNames(IWorkspace ws)
        {
            return ws.get_DatasetNames(esriDatasetType.esriDTFeatureDataset);
        }

        public static bool IsArcDbFile(string path)
        {
            IWorkspaceFactory workspaceFactory = null;
            Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.AccessWorkspaceFactory");
            workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
            return workspaceFactory.IsWorkspace(path);
        }

        public static string GetFeatureClassName(IFeatureClass fc)
        {
            IDataset ds = fc as IDataset;
            return ds.Name;
        }

        public static IEnumFeatureClass GetFeatureClasses(IFeatureDataset fds)
        {
            IFeatureClassContainer pFeatureclassContainer = (IFeatureClassContainer)fds;
            return (IEnumFeatureClass)pFeatureclassContainer.Classes;
        }

        public static bool IsFeatureDataSetExist(string name)
        {
            //if (_workSpaceInstance == null) return true;
            IEnumDatasetName iEdn = GetFeatureDataSetNames(_workSpaceInstance);
            iEdn.Reset();
            IDatasetName iDsn = iEdn.Next();
            while (iDsn is IFeatureDatasetName)
            {
                if (iDsn.Name == name)   
                    return true;
                iDsn = iEdn.Next();
            }
            return false;
        }

        public static bool IsFeatureClassExist(string dsname, string fcname)
        {
            IEnumFeatureClass iEfc = GetFeatureClasses(GetFeatureDataSet(dsname));
            iEfc.Reset();
            IFeatureClass fcn = iEfc.Next();
            while (fcn is IFeatureClass)
            {
                if (fcname == fcn.AliasName)
                    return true;
                fcn = iEfc.Next();
            }
            return false;
        }
        /// <summary>
        /// 设置VerticalCoordinateSystem
        /// </summary>
        public static ISpatialReference3 SetVerticalCoordinateSystem(ISpatialReference3 spatialReference3)
        {
            ISpatialReferenceFactory3 spatialReferenceFactory3 = new SpatialReferenceEnvironmentClass();
            IVerticalCoordinateSystem verticalCoordinateSystem = spatialReferenceFactory3.CreateVerticalCoordinateSystem((int)esriSRVerticalCSType.esriSRVertCS_NAVD1988);
            spatialReference3.VerticalCoordinateSystem = verticalCoordinateSystem;
            return spatialReference3;
        }
    }
}
//public static bool IsNameValid(string str)
//{
//    System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z]\w{0,17}{1}quot;);
//    if (reg.IsMatch(s))
//    {
//        return true;
//    }
//    else
//    {
//        return false;
//    }
//}

  


 

posted @ 2011-11-22 01:56  蔷薇理想人生  阅读(2063)  评论(1编辑  收藏  举报