/******************************************/
* ESRI Developer Summit 2009
* Developer's Guide to the Geodatabase
* Code Samples
* 6 April 2009
* 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);
}
}
}