原文地址:http://blog.csdn.net/linghe301/article/details/8485709
/******************************************/
* ESRI Developer Summit 2009* Developer's Guide to the Geodatabase
* Code Samples
* 6 April 2009
/******************************************/
偶然间整理电脑的文件夹,发现在Esri官网上曾经下载过关于Geodatabase开发的相关代码示例,赶紧跟各位共享一下
开发环境:
- ArcGIS Engine9.3/9.3.1
- VS2008
说明:该代码适用于ArcGIS Engine初学者,或者对Geodatabase开发感兴趣的朋友,如果你的Engine版本高于9.3.1,可能相关的接口会发生变化,这个需要用户自己来进行修改,但是聪明的用户不会局限于代码的是否允许,也许学习一下人家的接口使用方法,开发模式才是最重要的。
以下代码主要实现功能
1:创建FileGeodatabase
2:创建要素类
3:创建域对象
4:创建子类
5:创建要素
- using System;
- using System.IO;
- using System.Runtime.InteropServices;
- using ESRI.ArcGIS.DataSourcesGDB;
- using ESRI.ArcGIS.esriSystem;
- using ESRI.ArcGIS.Geodatabase;
- using ESRI.ArcGIS.Geometry;
- namespace DataAccessDemo
- {
- public class DataAccessDemo
- {
- public static void Main(string[] args)
- {
- #region Licensing
- // Set up the licencing. NOTE: This sample assumes that you are using ArcInfo Desktop.
- // You will need to adjust this code if using ArcEngine or ArcEditor.
- IAoInitialize aoInitialize = new AoInitializeClass();
- esriLicenseStatus licenseStatus = aoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcInfo);
- if (licenseStatus != esriLicenseStatus.esriLicenseCheckedOut)
- {
- Console.WriteLine("Unable to check-out an ArcInfo license, error code is {0}", licenseStatus);
- return;
- }
- #endregion
- // If existing data is leftover from a previous run, delete it.
- if (Directory.Exists("DataAccessDemo.gdb"))
- {
- Directory.Delete("DataAccessDemo.gdb", true);
- }
- // The first demo, CreateFileGdbDemo, will create a new File geodatabase and return
- // an IWorkspace reference for the second demo to use.
- IWorkspace workspace = CreateFileGdbDemo();
- // The second demo, CreateFeatureClassDemo, will create and return a new feature class.
- IFeatureClass featureClass = CreateFeatureClassDemo(workspace);
- // The third demo, CreateDomainsDemo, will create several domains in the workspace.
- CreateDomainsDemo(workspace);
- // The fourth demo, CreateSubtypesDemo, will create subtypes in the feature class created earlier.
- IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
- CreateSubtypesDemo(workspaceDomains, featureClass);
- // The fifth demo, CreateFeatureDemo, will create a single feature in the feature class.
- CreateFeatureDemo(workspace, featureClass);
- // Shutdown the application licensing.
- aoInitialize.Shutdown();
- }
- /// <summary>
- /// This sample creates a new File Geodatabase in the working directory.
- /// </summary>
- /// <returns>An IWorkspace reference to the newly-created geodatabase.</returns>
- private static IWorkspace CreateFileGdbDemo()
- {
- // Instantiate a File GDB workspace factory and use it to create a new File GDB in the
- // section's Data directory.
- Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
- IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
- IWorkspaceName workspaceName = workspaceFactory.Create(Environment.CurrentDirectory, "DataAccessDemo", null, 0);
- // We can open the workspace using the name object.
- IName name = (IName)workspaceName;
- IWorkspace workspace = (IWorkspace)name.Open();
- // Display the path of the new workspace.
- Console.WriteLine("Path of the new File GDB: {0}", workspace.PathName);
- return workspace;
- }
- /// <summary>
- /// This sample creates a new feature dataset and feature class.
- /// </summary>
- /// <param name="workspace">The workspace to create the feature dataset and feature class in.</param>
- /// <returns>An IFeatureClass reference to the newly-created feature class.</returns>
- private static IFeatureClass CreateFeatureClassDemo(IWorkspace workspace)
- {
- // To create new datasets in a workspace, the IFeatureWorkspace interface is required.
- IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
- #region Create a spatial reference for the feature dataset.
- // Create a spatial reference for the feature dataset.
- ISpatialReferenceFactory spatialRefFactory = new SpatialReferenceEnvironmentClass();
- ISpatialReference spatialReference = spatialRefFactory.CreateProjectedCoordinateSystem
- ((int)esriSRProjCSType.esriSRProjCS_NAD1983UTM_20N);
- // Determine whether the workspace supports high-precision storage.
- Boolean supportsHighPrecision = false;
- IWorkspaceProperties workspaceProperties = (IWorkspaceProperties)workspace;
- IWorkspaceProperty workspaceProperty = workspaceProperties.get_Property
- (esriWorkspacePropertyGroupType.esriWorkspacePropertyGroup,
- (int)esriWorkspacePropertyType.esriWorkspacePropSupportsHighPrecisionStorage);
- if (workspaceProperty.IsSupported)
- {
- supportsHighPrecision = Convert.ToBoolean(workspaceProperty.PropertyValue);
- }
- // Set the precision of the spatial reference.
- IControlPrecision2 controlPrecision = (IControlPrecision2)spatialReference;
- controlPrecision.IsHighPrecision = supportsHighPrecision;
- // Set the resolution and tolerance of the spatial reference.
- ISpatialReferenceResolution spatialRefResolution = (ISpatialReferenceResolution)spatialReference;
- spatialRefResolution.ConstructFromHorizon();
- spatialRefResolution.SetDefaultXYResolution();
- ISpatialReferenceTolerance spatialRefTolerance = (ISpatialReferenceTolerance)spatialReference;
- spatialRefTolerance.SetDefaultXYTolerance();
- #endregion
- // Create the feature dataset.
- IFeatureDataset featureDataset = featureWorkspace.CreateFeatureDataset("DemoDataset", spatialReference);
- // Use a feature class description object to get the required fields for a
- // new feature class.
- IFeatureClassDescription fcDescription = new FeatureClassDescriptionClass();
- IObjectClassDescription ocDescription = (IObjectClassDescription)fcDescription;
- IFields fields = ocDescription.RequiredFields;
- IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
- // By default, the GeometryDef provided by a feature class description specifies that
- // a feature class should contain polygon features. Change it to polylines.
- int shapeFieldIndex = fields.FindField(fcDescription.ShapeFieldName);
- IField shapeField = fields.get_Field(shapeFieldIndex);
- IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)shapeField.GeometryDef;
- geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
- // If the workspace doesn't support high-precision storage, change the precision of the
- // GeometryDef's spatial reference.
- if (!supportsHighPrecision)
- {
- IControlPrecision2 geoDefPrecision = (IControlPrecision2)geometryDefEdit.SpatialReference;
- geoDefPrecision.IsHighPrecision = false;
- }
- // Add a small integer field called "PipeType" to the fields collection.
- IField field = new FieldClass();
- IFieldEdit fieldEdit = (IFieldEdit)field;
- fieldEdit.Name_2 = "PipeType";
- fieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
- fieldsEdit.AddField(field);
- #region Add some more fields...
- // Add a small integer field called "Material" to the fields collection.
- field = new FieldClass();
- fieldEdit = (IFieldEdit)field;
- fieldEdit.Name_2 = "Material";
- fieldEdit.AliasName_2 = "Pipe Material";
- fieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
- fieldEdit.IsNullable_2 = true;
- fieldsEdit.AddField(field);
- // Add a small integer field called "Diameter" to the fields collection.
- field = new FieldClass();
- fieldEdit = (IFieldEdit)field;
- fieldEdit.Name_2 = "Diameter";
- fieldEdit.AliasName_2 = "Pipe Diameter";
- fieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
- fieldEdit.IsNullable_2 = true;
- fieldsEdit.AddField(field);
- // Add a string field called "InstBy" to the fields collection.
- field = new FieldClass();
- fieldEdit = (IFieldEdit)field;
- fieldEdit.Name_2 = "InstBy";
- fieldEdit.AliasName_2 = "Installed By";
- fieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
- fieldEdit.Length_2 = 75;
- fieldEdit.IsNullable_2 = true;
- fieldEdit.DefaultValue_2 = "K. Johnston";
- fieldsEdit.AddField(field);
- #endregion
- // Create the feature class using the fields collection that was just created.
- IFeatureClass featureClass = featureDataset.CreateFeatureClass("DemoClass", fields,
- ocDescription.InstanceCLSID, null, esriFeatureType.esriFTSimple, fcDescription.ShapeFieldName, String.Empty);
- // Return the newly-created feature class.
- return featureClass;
- }
- /// <summary>
- /// This sample creates several domains in the specified workspace.
- /// </summary>
- /// <param name="workspace">The workspace to create the domains in.</param>
- private static void CreateDomainsDemo(IWorkspace workspace)
- {
- // The IWorkspaceDomains interface is required to add domains to a workspace.
- IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
- // Create a new coded value domain for primary pipe materials.
- ICodedValueDomain primaryMaterialCVDomain = new CodedValueDomainClass();
- IDomain primaryMaterialDomain = (IDomain)primaryMaterialCVDomain;
- primaryMaterialCVDomain.AddCode(1, "Copper");
- primaryMaterialCVDomain.AddCode(2, "Steel");
- primaryMaterialCVDomain.AddCode(3, "Concrete");
- primaryMaterialDomain.Name = "PrimMats";
- primaryMaterialDomain.Description = "Valid materials for primary pipes.";
- primaryMaterialDomain.FieldType = esriFieldType.esriFieldTypeSmallInteger;
- primaryMaterialDomain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
- primaryMaterialDomain.SplitPolicy = esriSplitPolicyType.esriSPTDuplicate;
- workspaceDomains.AddDomain(primaryMaterialDomain);
- // Create a new range domain for primary pipe diameters.
- IRangeDomain primaryDiameterRangeDomain = new RangeDomainClass();
- IDomain primaryDiameterDomain = (IDomain)primaryDiameterRangeDomain;
- primaryDiameterRangeDomain.MaxValue = 10;
- primaryDiameterRangeDomain.MinValue = 2.5;
- primaryDiameterDomain.Name = "PrimDiam";
- primaryDiameterDomain.Description = "Valid diameters (in inches) for primary pipes.";
- primaryDiameterDomain.FieldType = esriFieldType.esriFieldTypeDouble;
- primaryDiameterDomain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
- primaryDiameterDomain.SplitPolicy = esriSplitPolicyType.esriSPTDuplicate;
- workspaceDomains.AddDomain(primaryDiameterDomain);
- #region Add secondary pipe domains...
- // Create a new coded value domain for secondary pipe materials.
- ICodedValueDomain secondaryMaterialCVDomain = new CodedValueDomainClass();
- IDomain secondaryMaterialDomain = (IDomain)secondaryMaterialCVDomain;
- secondaryMaterialCVDomain.AddCode(1, "Copper");
- secondaryMaterialCVDomain.AddCode(2, "Steel");
- secondaryMaterialCVDomain.AddCode(3, "PVC");
- secondaryMaterialDomain.Name = "SecMats";
- secondaryMaterialDomain.Description = "Valid materials for secondary pipes.";
- secondaryMaterialDomain.FieldType = esriFieldType.esriFieldTypeSmallInteger;
- secondaryMaterialDomain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
- secondaryMaterialDomain.SplitPolicy = esriSplitPolicyType.esriSPTDuplicate;
- workspaceDomains.AddDomain(secondaryMaterialDomain);
- // Create a new range domain for secondary pipe diameters.
- IRangeDomain secondaryDiameterRangeDomain = new RangeDomainClass();
- IDomain secondaryDiameterDomain = (IDomain)secondaryDiameterRangeDomain;
- secondaryDiameterRangeDomain.MaxValue = 7.5;
- secondaryDiameterRangeDomain.MinValue = 1;
- secondaryDiameterDomain.Name = "SecDiam";
- secondaryDiameterDomain.Description = "Valid diameters (in inches) for secondary pipes.";
- secondaryDiameterDomain.FieldType = esriFieldType.esriFieldTypeDouble;
- secondaryDiameterDomain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
- secondaryDiameterDomain.SplitPolicy = esriSplitPolicyType.esriSPTDuplicate;
- workspaceDomains.AddDomain(secondaryDiameterDomain);
- #endregion
- }
- /// <summary>
- /// This sample creates subtypes in the specified feature class. The fields of the subtypes are
- /// assigned domains from the workspace.
- /// </summary>
- /// <param name="workspaceDomains">The workspace of the feature class.</param>
- /// <param name="featureClass">The feature class to create subtypes in.</param>
- private static void CreateSubtypesDemo(IWorkspaceDomains workspaceDomains, IFeatureClass featureClass)
- {
- // Cast the feature class to the ISchemaLock interface, because we are making a
- // schema change in an existing dataset.
- ISchemaLock schemaLock = (ISchemaLock)featureClass;
- try
- {
- // Attempt to acquire an exclusive lock on the feature class. This will raise an
- // exception if it fails.
- schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
- // Cast the feature class to the ISubtypes interface and setup the subtype field.
- ISubtypes subtypes = (ISubtypes)featureClass;
- subtypes.SubtypeFieldName = "PipeType";
- subtypes.AddSubtype(1, "Primary");
- subtypes.AddSubtype(2, "Secondary");
- subtypes.DefaultSubtypeCode = 1;
- // Setup the default values and domains for primary pipes.
- subtypes.set_DefaultValue(1, "Diameter", 10);
- subtypes.set_DefaultValue(1, "Material", 2);
- subtypes.set_Domain(1, "Diameter", workspaceDomains.get_DomainByName("PrimDiam"));
- subtypes.set_Domain(1, "Material", workspaceDomains.get_DomainByName("PrimMats"));
- // Setup the default values and domains for secondary pipes.
- subtypes.set_DefaultValue(2, "Diameter", 7.5);
- subtypes.set_DefaultValue(2, "Material", 2);
- subtypes.set_Domain(2, "Diameter", workspaceDomains.get_DomainByName("SecDiam"));
- subtypes.set_Domain(2, "Material", workspaceDomains.get_DomainByName("SecMats"));
- }
- catch (COMException comExc)
- {
- Console.WriteLine("An error occurred while attempting to add subtypes to the feature class.");
- Console.WriteLine("{0} ({1})", comExc.Message, comExc.ErrorCode);
- }
- finally
- {
- // Regardless of what happened, make sure the schema lock is set to a shared lock.
- schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
- }
- }
- /// <summary>
- /// This sample creates a new feature in the provided feature class, setting the subtype field
- /// and the subtype's default values.
- /// </summary>
- /// <param name="workspace">The workspace containing the feature class.</param>
- /// <param name="featureClass">The feature class to create the feature in.</param>
- public static void CreateFeatureDemo(IWorkspace workspace, IFeatureClass featureClass)
- {
- // Create a shape for the new feature.
- IPoint fromPoint = new PointClass { X = 500000, Y = 0 };
- IPoint toPoint = new PointClass { X = 500050, Y = -50 };
- IPolyline polyline = new PolylineClass { FromPoint = fromPoint, ToPoint = toPoint };
- // Get the indexes of the fields to edit in the feature class.
- int pipeTypeIndex = featureClass.FindField("PipeType");
- int materialIndex = featureClass.FindField("Material");
- int diameterIndex = featureClass.FindField("Diameter");
- int instByIndex = featureClass.FindField("InstBy");
- // Start an edit session and an edit operation.
- IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
- workspaceEdit.StartEditing(true);
- workspaceEdit.StartEditOperation();
- // Create a new feature and set its shape.
- IFeature feature = featureClass.CreateFeature();
- feature.Shape = polyline;
- // Use the IRowSubtypes interface to set the subtype code and the subtype default values.
- IRowSubtypes rowSubtypes = (IRowSubtypes)feature;
- rowSubtypes.SubtypeCode = 1;
- // Display the attribute values of the feature at this point. Note that the
- // subtype defaults have not been applied by setting the subtype code.
- Console.WriteLine("OID: {0}, PipeType: {1}, Material: {2}, Diameter: {3}, InstBy: {4}",
- feature.OID, feature.get_Value(pipeTypeIndex), feature.get_Value(materialIndex),
- feature.get_Value(diameterIndex), feature.get_Value(instByIndex));
- // Apply the default subtype values.
- rowSubtypes.InitDefaultValues();
- // Display the feature's values, now set to the subtype defaults.
- Console.WriteLine("OID: {0}, PipeType: {1}, Material: {2}, Diameter: {3}, InstBy: {4}",
- feature.OID, feature.get_Value(pipeTypeIndex), feature.get_Value(materialIndex),
- feature.get_Value(diameterIndex), feature.get_Value(instByIndex));
- // Set the attribute values that need to be changed.
- feature.set_Value(instByIndex, "B. Pierce");
- // Display the feature's new values.
- Console.WriteLine("OID: {0}, PipeType: {1}, Material: {2}, Diameter: {3}, InstBy: {4}",
- feature.OID, feature.get_Value(pipeTypeIndex), feature.get_Value(materialIndex),
- feature.get_Value(diameterIndex), feature.get_Value(instByIndex));
- // Store the feature.
- feature.Store();
- // Stop the edit operation and edit session.
- workspaceEdit.StopEditOperation();
- workspaceEdit.StopEditing(true);
- }
- }
- }