博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArcEngine控制台应用程序
阅读量:5308 次
发布时间:2019-06-14

本文共 16573 字,大约阅读时间需要 55 分钟。

转自原文

 

控制台应用程序相比其他应用程序,更加简单,简化了许多冗余,可以让我们更加关注于本质的东西。

现在让我们看一看ArcGIS Engine的控制台应用程序吧!

一、首先是许可绑定:

  1、运行时环境的绑定

ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop); 

2、AO的许可级别

IAoInitialize aoInitialize = new AoInitializeClass();  esriLicenseStatus licenseStatus = aoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeStandard);  if (licenseStatus != esriLicenseStatus.esriLicenseCheckedOut)  {      Console.WriteLine("Unable to check-out an ArcInfo license, error code is {0}", licenseStatus);      return;  }

 

二、接下来就可以写我们的程序啦。

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                  ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);                  // 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.esriLicenseProductCodeStandard);                  if (licenseStatus != esriLicenseStatus.esriLicenseCheckedOut)                  {                      Console.WriteLine("Unable to check-out an ArcInfo license, error code is {0}", licenseStatus);                      return;                  }                  #endregion                        // If test data exists from a previous run, delete it.                  if (Directory.Exists("CursorDemo.gdb"))                  {                      Directory.Delete("CursorDemo.gdb", true);                  }                        // Copy the test data from this section's Data directory.                  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);                        // Open the copied data.                  IName copiedName = (IName)copiedWorkspaceName;                  IWorkspace workspace = (IWorkspace)copiedName.Open();                  IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;                        // Open the two feature classes used in this demo.                  IFeatureClass parcelsFeatureClass = featureWorkspace.OpenFeatureClass("Parcels");                  IFeatureClass pipesFeatureClass = featureWorkspace.OpenFeatureClass("Pipes");                        // The first demo, SearchCursorDemo, will display the Parcel IDs of all residential                  // parcels within a certain extent.                  SearchCursorDemo(parcelsFeatureClass);                        // The second demo, UpdateCursorDemo, will change the all parcels zoned as "Manufacturing"                  // to "Commercial".                  UpdateCursorDemo(workspace, parcelsFeatureClass);                        // The third demo, InsertCursorDemo, will create one hundred new pipe features using                  // an insert cursor.                  InsertCursorDemo(workspace, pipesFeatureClass);                        // Shutdown the licensing.                  aoInitialize.Shutdown();              }                    ///               /// This sample queries a feature class of parcels, finding the Parcel IDs of all residential              /// features that are within a given extent.              ///               /// The feature class to query.              private static void SearchCursorDemo(IFeatureClass featureClass)              {                  // Create an envelope that will define the spatial extent of the query.                  IEnvelope envelope = new EnvelopeClass();                  envelope.PutCoords(506000, 684500, 506500, 685000);                        // Create a new spatial filter.                  ISpatialFilter spatialFilter = new SpatialFilterClass                  {                      Geometry = envelope,                      GeometryField = featureClass.ShapeFieldName,                      SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects,                      SubFields = "Parcel_ID",                      WhereClause = "ZONING_S = 'R'"                  };                        // Find the index of the Parcel_ID field. This is required to display the query results.                  int parcelIdIndex = featureClass.FindField("Parcel_ID");                        using (ComReleaser comReleaser = new ComReleaser())                  {                      // Query the feature class to get a feature cursor. We can use a recycling                      // cursor because we're only going to be reading the data.                      IFeatureCursor featureCursor = featureClass.Search(spatialFilter, true);                      comReleaser.ManageLifetime(featureCursor);                            // Iterate through the query results.                      IFeature feature = null;                      while ((feature = featureCursor.NextFeature()) != null)                      {                          // Display the current feature's Parcel ID.                          Console.WriteLine("Parcel found: {0}", feature.get_Value(parcelIdIndex));                      }                      // Display the number of feature matching the query.                      Console.WriteLine("Parcels found: {0}", featureClass.FeatureCount(spatialFilter));                  }              }                    ///               /// This sample re-zones all "Manufacturing" parcels as "Commercial".              ///               /// The workspace containing the feature class.              /// The feature class to update.              private static void UpdateCursorDemo(IWorkspace workspace, IFeatureClass featureClass)              {                  // Create a new query filter for the update.                  IQueryFilter queryFilter = new QueryFilterClass { WhereClause = "ZONING_S = 'M'" };                        // Display the feature's zoned as Manufacturing.                  Console.WriteLine("Parcel found zoned as Manufacturing: {0}", featureClass.FeatureCount(queryFilter));                        // Find the index of the Zoning_S field. This is required for the update.                  int zoningIndex = featureClass.FindField("ZONING_S");                        // Start a new edit session and edit operation.                  IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;                  workspaceEdit.StartEditing(true);                  workspaceEdit.StartEditOperation();                        using (ComReleaser comReleaser = new ComReleaser())                  {                      // Query the feature class to get a feature cursor. Since we are performing                      // updates, we should use a non-recycling cursor.                      IFeatureCursor featureCursor = featureClass.Update(queryFilter, false);                      comReleaser.ManageLifetime(featureCursor);                            try                      {                          // Iterate through the query results.                          IFeature feature = null;                          while ((feature = featureCursor.NextFeature()) != null)                          {                              // Change the feature's ZONING_S value to "B" (the code for Business/Commercial).                              feature.set_Value(zoningIndex, "B");                                    // Update the feature.                              featureCursor.UpdateFeature(feature);                          }                                // All of the features were successfully updated; stop the edit operation                          // and stop the edit session, saving the changes made in edit operations.                          workspaceEdit.StopEditOperation();                          workspaceEdit.StopEditing(true);                      }                      catch (COMException)                      {                          // An error occurred while editing. Abort the edit operation and stop the                          // edit session, discarding any changes made in edit operations.                          workspaceEdit.AbortEditOperation();                          workspaceEdit.StopEditing(false);                      }                            // Display the feature's zoned as Manufacturing after update.                      Console.WriteLine("Parcel found zoned as Manufacturing after update: {0}", featureClass.FeatureCount(queryFilter));                  }              }                    ///               /// This sample uses an insert cursor to create one hundred new pipe features.              ///               /// The workspace containing the feature class.              /// The feature class to insert new features into.              private static void InsertCursorDemo(IWorkspace workspace, IFeatureClass featureClass)              {                  // Find the index of the "Contractor" field. This will be edited in the new features.                  int contractorIndex = featureClass.FindField("CONTRACTOR");                        // Put the feature class into "load-only" mode. In a File GDB, this will disable spatial                  // and attribute indexing, improving performance for data loading.                  IFeatureClassLoad featureClassLoad = (IFeatureClassLoad)featureClass;                  featureClassLoad.LoadOnlyMode = true;                        // Start an edit session and edit operation.                  IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;                  workspaceEdit.StartEditing(true);                  workspaceEdit.StartEditOperation();                        // Open the two text files containing the contractor's data.                  using (StreamReader geometryReader = new StreamReader(@"PipeGeo.csv"))                  using (StreamReader attributeReader = new StreamReader(@"PipeAttr.csv"))                  using (ComReleaser comReleaser = new ComReleaser())                  {                      // Create a new insert cursor with buffering.                      IFeatureCursor featureCursor = featureClass.Insert(true);                      comReleaser.ManageLifetime(featureCursor);                            // Create a feature buffer. This will store the values common to every                      // feature to be installed.                      IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();                      comReleaser.ManageLifetime(featureBuffer);                      featureBuffer.set_Value(contractorIndex, "B Pierce");                            try                      {                          while (!geometryReader.EndOfStream && !attributeReader.EndOfStream)                          {                              // Read the next line from each text file.                              String geometryData = geometryReader.ReadLine();                              String attributeData = attributeReader.ReadLine();                                    // Set the geometry and attribute values of the feature buffer.                              featureBuffer.Shape = ConstructGeometryFromString(geometryData);                              PopulateAttributeValues(featureBuffer, attributeData);                                    // Insert a new feature using the feature buffer.                              featureCursor.InsertFeature(featureBuffer);                          }                                // Flush the cursor.                          featureCursor.Flush();                                // All of the features were successfully inserted; stop the edit operation                          // and stop the edit session, saving the changes made in edit operations.                          workspaceEdit.StopEditOperation();                          workspaceEdit.StopEditing(true);                      }                      catch (COMException)                      {                          // An error occurred while editing. Abort the edit operation and stop the                          // edit session, discarding any changes made in edit operations.                          workspaceEdit.AbortEditOperation();                          workspaceEdit.StopEditing(false);                      }                  }                        // Take the class out of load-only mode.                  featureClassLoad.LoadOnlyMode = false;              }                    ///               /// This method converts a comma-delimited set of numeric values into a polyline.              ///               /// A string of comma-delimited numeric values.              /// 
A polyline.
private static IGeometry ConstructGeometryFromString(String input) { // Split the input string into individual values. String[] inputValues = input.Split(new char[] { ',' }); // Create a new polyline. IPolyline polyline = new PolylineClass(); IGeometryCollection geometryCollection = (IGeometryCollection)polyline; // Each set of four values represents one segment of a polyline. int segmentCount = inputValues.Length / 4; int inputValuePosition = 0; for (int i = 0; i < segmentCount; i++) { // This value is required for geometry construction. object missingType = Type.Missing; // Construct the segment. 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); // Add the segment to the collection. geometryCollection.AddGeometry(path, ref missingType, ref missingType); } // Return the constructed polyline. return polyline; } /// /// Populates the inbound feature buffer with the comma-delimited values /// in the input string. /// /// The feature buffer to populate. /// A string containing attribute values. private static void PopulateAttributeValues(IFeatureBuffer featureBuffer, String input) { // Split the input string into individual values. String[] inputValues = input.Split(new char[] { ',' }); // Set the values of the Date_Installed, material and diameter fields. // For the sake of simplicity, we'll hard-code the values here. featureBuffer.set_Value(2, inputValues[0]); featureBuffer.set_Value(4, inputValues[1]); featureBuffer.set_Value(5, inputValues[2]); } } }
View Code

 

转载于:https://www.cnblogs.com/arxive/p/7446052.html

你可能感兴趣的文章
美女CEO三十感言--大家都是出来卖的
查看>>
C、JAVA存储管理不同点
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
rtmp服务器以及rtmp推流/拉流/转发
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>
挑战常规--不要这样使用异常
查看>>
malloc函数的用法
查看>>
渐变的参数
查看>>
C#委托详解(3):委托的实现方式大全(续)
查看>>
RaceWeb终于可以在oracle中快速建表了
查看>>
新一代记事本“Notepad++”个性化设置备份
查看>>
Docker
查看>>
shell 变量和参数
查看>>
awk
查看>>
shell 输入和输出
查看>>
LVS负载均衡
查看>>
Tomcat假死
查看>>
tomcat 性能优化
查看>>
mysql数据库 高可用集群
查看>>
NGINX服务器
查看>>