基于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; // } //}