ArcGIS Engine9.3/9mBoundaryZGeovu18uMFXDM9L
Content-Disposition: form-data; name="content"/******************************************/
* 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/
以上代码主要内容就是对ArcGIS Engine中关于Cursor的使用,特别是Search(查询功能),Insert(增加数据),Update(更新数据)等
重点关注:区别去普通Store的保存方法,使用featurecursor.UpdateCursor等
- using System;
- using System.IO;
- using System.Runtime.InteropServices;
- using ESRI.ArcGIS.ADF;
- using ESRI.ArcGIS.DataSourcesGDB;
- using ESRI.ArcGIS.esriSystem;
- using ESRI.ArcGIS.Geodatabase;
- using ESRI.ArcGIS.Geometry;
-
- namespace CursorDemo
- {
- public class CursorDemo
- {
- 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("CursorDemo.gdb"))
- {
- Directory.Delete("CursorDemo.gdb", true);
- }
-
-
- Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
- IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
- IWorkspaceName sourceWorkspaceName = new WorkspaceNameClass
- {
- PathName = @"..\..\..\Data\CursorDemo.gdb",
- WorkspaceFactoryProgID = "esriDataSourcesGDB.FileGDBWorkspaceFactory"
- };
- IWorkspaceName copiedWorkspaceName = null;
- workspaceFactory.Copy(sourceWorkspaceName, Environment.CurrentDirectory, out copiedWorkspaceName);
-
-
- IName copiedName = (IName)copiedWorkspaceName;
- IWorkspace workspace = (IWorkspace)copiedName.Open();
- IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
-
-
- IFeatureClass parcelsFeatureClass = featureWorkspace.OpenFeatureClass("Parcels");
- IFeatureClass pipesFeatureClass = featureWorkspace.OpenFeatureClass("Pipes");
-
-
-
- SearchCursorDemo(parcelsFeatureClass);
-
-
-
- UpdateCursorDemo(workspace, parcelsFeatureClass);
-
-
-
- InsertCursorDemo(workspace, pipesFeatureClass);
-
-
- aoInitialize.Shutdown();
- }
-
-
-
-
-
-
- private static void SearchCursorDemo(IFeatureClass featureClass)
- {
-
- IEnvelope envelope = new EnvelopeClass();
- envelope.PutCoords(506000, 684500, 506500, 685000);
-
-
- ISpatialFilter spatialFilter = new SpatialFilterClass
- {
- Geometry = envelope,
- GeometryField = featureClass.ShapeFieldName,
- SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects,
- SubFields = "Parcel_ID",
- WhereClause = "ZONING_S = 'R'"
- };
-
-
- int parcelIdIndex = featureClass.FindField("Parcel_ID");
-
- using (ComReleaser comReleaser = new ComReleaser())
- {
-
-
- IFeatureCursor featureCursor = featureClass.Search(spatialFilter, true);
- comReleaser.ManageLifetime(featureCursor);
-
-
- IFeature feature = null;
- while ((feature = featureCursor.NextFeature()) != null)
- {
-
- Console.WriteLine("Parcel found: {0}", feature.get_Value(parcelIdIndex));
- }
-
- Console.WriteLine("Parcels found: {0}", featureClass.FeatureCount(spatialFilter));
- }
- }
-
-
-
-
-
-
- private static void UpdateCursorDemo(IWorkspace workspace, IFeatureClass featureClass)
- {
-
- IQueryFilter queryFilter = new QueryFilterClass { WhereClause = "ZONING_S = 'M'" };
-
-
- Console.WriteLine("Parcel found zoned as Manufacturing: {0}", featureClass.FeatureCount(queryFilter));
-
-
- int zoningIndex = featureClass.FindField("ZONING_S");
-
-
- IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
- workspaceEdit.StartEditing(true);
- workspaceEdit.StartEditOperation();
-
- using (ComReleaser comReleaser = new ComReleaser())
- {
-
-
- IFeatureCursor featureCursor = featureClass.Update(queryFilter, false);
- comReleaser.ManageLifetime(featureCursor);
-
- try
- {
-
- IFeature feature = null;
- while ((feature = featureCursor.NextFeature()) != null)
- {
-
- feature.set_Value(zoningIndex, "B");
-
-
- featureCursor.UpdateFeature(feature);
- }
-
-
-
- workspaceEdit.StopEditOperation();
- workspaceEdit.StopEditing(true);
- }
- catch (COMException)
- {
-
-
- workspaceEdit.AbortEditOperation();
- workspaceEdit.StopEditing(false);
- }
-
-
- Console.WriteLine("Parcel found zoned as Manufacturing after update: {0}", featureClass.FeatureCount(queryFilter));
- }
- }
-
-
-
-
-
-
- private static void InsertCursorDemo(IWorkspace workspace, IFeatureClass featureClass)
- {
-
- int contractorIndex = featureClass.FindField("CONTRACTOR");
-
-
-
- IFeatureClassLoad featureClassLoad = (IFeatureClassLoad)featureClass;
- featureClassLoad.LoadOnlyMode = true;
-
-
- IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
- workspaceEdit.StartEditing(true);
- workspaceEdit.StartEditOperation();
-
-
- using (StreamReader geometryReader = new StreamReader(@"PipeGeo.csv"))
- using (StreamReader attributeReader = new StreamReader(@"PipeAttr.csv"))
- using (ComReleaser comReleaser = new ComReleaser())
- {
-
- IFeatureCursor featureCursor = featureClass.Insert(true);
- comReleaser.ManageLifetime(featureCursor);
-
-
-
- IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
- comReleaser.ManageLifetime(featureBuffer);
- featureBuffer.set_Value(contractorIndex, "B Pierce");
-
- try
- {
- while (!geometryReader.EndOfStream && !attributeReader.EndOfStream)
- {
-
- String geometryData = geometryReader.ReadLine();
- String attributeData = attributeReader.ReadLine();
-
-
- featureBuffer.Shape = ConstructGeometryFromString(geometryData);
- PopulateAttributeValues(featureBuffer, attributeData);
-
-
- featureCursor.InsertFeature(featureBuffer);
- }
-
-
- featureCursor.Flush();
-
-
-
- workspaceEdit.StopEditOperation();
- workspaceEdit.StopEditing(true);
- }
- catch (COMException)
- {
-
-
- workspaceEdit.AbortEditOperation();
- workspaceEdit.StopEditing(false);
- }
- }
-
-
- featureClassLoad.LoadOnlyMode = false;
- }
-
-
-
-
-
-
- private static IGeometry ConstructGeometryFromString(String input)
- {
-
- String[] inputValues = input.Split(new char[] {','});
-
-
- IPolyline polyline = new PolylineClass();
- IGeometryCollection geometryCollection = (IGeometryCollection)polyline;
-
-
- int segmentCount = inputValues.Length / 4;
- int inputValuePosition = 0;
- for (int i = 0; i < segmentCount; i++)
- {
-
- object missingType = Type.Missing;
-
-
- IPoint fromPoint = new PointClass
- {
- X = Double.Parse(inputValues[inputValuePosition++]),
- Y = Double.Parse(inputValues[inputValuePosition++])
- };
- IPoint toPoint = new PointClass
- {
- X = Double.Parse(inputValues[inputValuePosition++]),
- Y = Double.Parse(inputValues[inputValuePosition++])
- };
- IPath path = new PathClass();
- IPointCollection pointCollection = (IPointCollection)path;
- pointCollection.AddPoint(fromPoint, ref missingType, ref missingType);
- pointCollection.AddPoint(toPoint, ref missingType, ref missingType);
-
-
- geometryCollection.AddGeometry(path, ref missingType, ref missingType);
- }
-
-
- return polyline;
- }
-
-
-
-
-
-
-
- private static void PopulateAttributeValues(IFeatureBuffer featureBuffer, String input)
- {
-
- String[] inputValues = input.Split(new char[] { ',' });
-
-
-
- featureBuffer.set_Value(2, inputValues[0]);
- featureBuffer.set_Value(4, inputValues[1]);
- featureBuffer.set_Value(5, inputValues[2]);
- }
- }
- }
普通的编辑方法
- 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 EditingDemo
- {
- public class EditingDemo
- {
- 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("EditingDemo.gdb"))
- {
- Directory.Delete("EditingDemo.gdb", true);
- }
-
-
- Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
- IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
- IWorkspaceName sourceWorkspaceName = new WorkspaceNameClass();
- sourceWorkspaceName.PathName = @"..\..\..\Data\EditingDemo.gdb";
- sourceWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.FileGDBWorkspaceFactory";
- IWorkspaceName copiedWorkspaceName = null;
- workspaceFactory.Copy(sourceWorkspaceName, Environment.CurrentDirectory, out copiedWorkspaceName);
-
-
- IName copiedName = (IName)copiedWorkspaceName;
- IWorkspace workspace = (IWorkspace)copiedName.Open();
- IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
- IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("Points");
-
-
-
- IPoint validPoint = new PointClass { X = 45, Y = 45 };
- IPoint invalidPoint = new PointClass { X = 1000, Y = -1000 };
-
-
- IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
- workspaceEdit.StartEditing(true);
- workspaceEdit.StartEditOperation();
-
-
- try
- {
- IFeature feature = featureClass.CreateFeature();
- feature.Shape = validPoint;
- feature.Store();
-
-
- workspaceEdit.StopEditOperation();
- }
- catch (COMException comExc)
- {
- Console.WriteLine("An error occurred ({0}): {1}", comExc.ErrorCode, comExc.Message);
-
-
- workspaceEdit.AbortEditOperation();
- }
-
-
- try
- {
- IFeature feature = featureClass.CreateFeature();
- feature.Shape = invalidPoint;
- feature.Store();
-
-
- workspaceEdit.StopEditOperation();
- }
- catch (COMException comExc)
- {
- Console.WriteLine("An error occurred ({0}): {1}", comExc.ErrorCode, comExc.Message);
-
-
- workspaceEdit.AbortEditOperation();
- }
-
-
- workspaceEdit.StopEditing(true);
-
-
- aoInitialize.Shutdown();
- }
- }
- }