ArcGIS Engine开发Geodatabase代码(二)——DataAccess and Creation
时间:2013-4-25
作者:悬浮的青春
分类: 无
/**/
ESRI Developer Summit 2009
Developer's Guide to the Geodatabase
Code Samples
6 April 2009
/**/
开发环境:
- ArcGIS Engine9.3/9.3.1
- VS2008
http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Type_changes_between_9_3_and_10/000100000408000000/
以下代码主要实现功能
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
-
-
- 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 (Directory.Exists("DataAccessDemo.gdb"))
- {
- Directory.Delete("DataAccessDemo.gdb", true);
- }
-
-
-
- IWorkspace workspace = CreateFileGdbDemo();
-
-
- IFeatureClass featureClass = CreateFeatureClassDemo(workspace);
-
-
- CreateDomainsDemo(workspace);
-
-
- IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
- CreateSubtypesDemo(workspaceDomains, featureClass);
-
-
- CreateFeatureDemo(workspace, featureClass);
-
-
- aoInitialize.Shutdown();
- }
-
-
-
-
-
- private static IWorkspace CreateFileGdbDemo()
- {
-
-
- Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
- IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
- IWorkspaceName workspaceName = workspaceFactory.Create(Environment.CurrentDirectory, "DataAccessDemo", null, 0);
-
-
- IName name = (IName)workspaceName;
- IWorkspace workspace = (IWorkspace)name.Open();
-
-
- Console.WriteLine("Path of the new File GDB: {0}", workspace.PathName);
-
- return workspace;
- }
-
-
-
-
-
-
- private static IFeatureClass CreateFeatureClassDemo(IWorkspace workspace)
- {
-
- IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
-
- #region Create a spatial reference for the feature dataset.
-
- ISpatialReferenceFactory spatialRefFactory = new SpatialReferenceEnvironmentClass();
- ISpatialReference spatialReference = spatialRefFactory.CreateProjectedCoordinateSystem
- ((int)esriSRProjCSType.esriSRProjCS_NAD1983UTM_20N);
-
-
- 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);
- }
-
-
- IControlPrecision2 controlPrecision = (IControlPrecision2)spatialReference;
- controlPrecision.IsHighPrecision = supportsHighPrecision;
-
-
- ISpatialReferenceResolution spatialRefResolution = (ISpatialReferenceResolution)spatialReference;
- spatialRefResolution.ConstructFromHorizon();
- spatialRefResolution.SetDefaultXYResolution();
- ISpatialReferenceTolerance spatialRefTolerance = (ISpatialReferenceTolerance)spatialReference;
- spatialRefTolerance.SetDefaultXYTolerance();
- #endregion
-
-
- IFeatureDataset featureDataset = featureWorkspace.CreateFeatureDataset("DemoDataset", spatialReference);
-
-
-
- IFeatureClassDescription fcDescription = new FeatureClassDescriptionClass();
- IObjectClassDescription ocDescription = (IObjectClassDescription)fcDescription;
- IFields fields = ocDescription.RequiredFields;
- IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
-
-
-
- int shapeFieldIndex = fields.FindField(fcDescription.ShapeFieldName);
- IField shapeField = fields.get_Field(shapeFieldIndex);
- IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)shapeField.GeometryDef;
- geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
-
-
-
- if (!supportsHighPrecision)
- {
- IControlPrecision2 geoDefPrecision = (IControlPrecision2)geometryDefEdit.SpatialReference;
- geoDefPrecision.IsHighPrecision = false;
- }
-
-
- 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...
-
- 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);
-
-
- 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);
-
-
- 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
-
-
- IFeatureClass featureClass = featureDataset.CreateFeatureClass("DemoClass", fields,
- ocDescription.InstanceCLSID, null, esriFeatureType.esriFTSimple, fcDescription.ShapeFieldName, String.Empty);
-
-
- return featureClass;
- }
-
-
-
-
-
- private static void CreateDomainsDemo(IWorkspace workspace)
- {
-
- IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
-
-
- 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);
-
-
- 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...
-
- 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);
-
-
- 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
- }
-
-
-
-
-
-
-
- private static void CreateSubtypesDemo(IWorkspaceDomains workspaceDomains, IFeatureClass featureClass)
- {
-
-
- ISchemaLock schemaLock = (ISchemaLock)featureClass;
- try
- {
-
-
- schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
-
-
- ISubtypes subtypes = (ISubtypes)featureClass;
- subtypes.SubtypeFieldName = "PipeType";
- subtypes.AddSubtype(1, "Primary");
- subtypes.AddSubtype(2, "Secondary");
- subtypes.DefaultSubtypeCode = 1;
-
-
- 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"));
-
-
- 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
- {
-
- schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
- }
- }
-
-
-
-
-
-
-
- public static void CreateFeatureDemo(IWorkspace workspace, IFeatureClass featureClass)
- {
-
- IPoint fromPoint = new PointClass { X = 500000, Y = 0 };
- IPoint toPoint = new PointClass { X = 500050, Y = -50 };
- IPolyline polyline = new PolylineClass { FromPoint = fromPoint, ToPoint = toPoint };
-
-
- int pipeTypeIndex = featureClass.FindField("PipeType");
- int materialIndex = featureClass.FindField("Material");
- int diameterIndex = featureClass.FindField("Diameter");
- int instByIndex = featureClass.FindField("InstBy");
-
-
- IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
- workspaceEdit.StartEditing(true);
- workspaceEdit.StartEditOperation();
-
-
- IFeature feature = featureClass.CreateFeature();
- feature.Shape = polyline;
-
-
- IRowSubtypes rowSubtypes = (IRowSubtypes)feature;
- rowSubtypes.SubtypeCode = 1;
-
-
-
- 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));
-
-
- rowSubtypes.InitDefaultValues();
-
-
- 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));
-
-
- feature.set_Value(instByIndex, "B. Pierce");
-
-
- 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));
-
-
- feature.Store();
-
-
- workspaceEdit.StopEditOperation();
- workspaceEdit.StopEditing(true);
- }
- }
- }
标签: arcgis二次开发 arcgis Geodatabase
WRITTEN BY
熟悉openlayers,cesium,vue,typescript,JavaScript等。