ArcEngine控制台应用程序
控制台应用程序相比其他应用程序,更加简单,简化了许多冗余,可以让我们更加关注于本质的东西。
现在让我们看一看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();
} /// <summary>
/// This sample queries a feature class of parcels, finding the Parcel IDs of all residential
/// features that are within a given extent.
/// </summary>
/// <param name="featureClass">The feature class to query.</param>
private static void SearchCursorDemo(IFeatureClass featureClass)
{
// Create an envelope that will define the spatial extent of the query.
IEnvelope envelope = new EnvelopeClass();
envelope.PutCoords(, , , ); // 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));
}
} /// <summary>
/// This sample re-zones all "Manufacturing" parcels as "Commercial".
/// </summary>
/// <param name="workspace">The workspace containing the feature class.</param>
/// <param name="featureClass">The feature class to update.</param>
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));
}
} /// <summary>
/// This sample uses an insert cursor to create one hundred new pipe features.
/// </summary>
/// <param name="workspace">The workspace containing the feature class.</param>
/// <param name="featureClass">The feature class to insert new features into.</param>
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;
} /// <summary>
/// This method converts a comma-delimited set of numeric values into a polyline.
/// </summary>
/// <param name="input">A string of comma-delimited numeric values.</param>
/// <returns>A polyline.</returns>
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 / ;
int inputValuePosition = ;
for (int i = ; 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;
} /// <summary>
/// Populates the inbound feature buffer with the comma-delimited values
/// in the input string.
/// </summary>
/// <param name="featureBuffer">The feature buffer to populate.</param>
/// <param name="input">A string containing attribute values.</param>
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(, inputValues[]);
featureBuffer.set_Value(, inputValues[]);
featureBuffer.set_Value(, inputValues[]);
}
}
}
ArcEngine控制台应用程序的更多相关文章
- asp.net mvc引用控制台应用程序exe
起因:有一个控制台应用程序和一个web程序,web程序想使用exe程序的方法,这个时候就需要引用exe程序. 报错:使用web程序,引用exe程序 ,vs调试没有问题,但是部署到iis就报错,如下: ...
- Win32程序和控制台应用程序的项目互转设置
一般情况下,如果是windows程序,那么WinMain是入口函数,在VS2010中新建项目为"win32项目" 如果是dos控制台程序,那么main是入口函数,在VS2010中新 ...
- 【C#】1.2 控制台应用程序学习要点
分类:C#.VS2015 创建日期:2016-06-14 教材:十二五国家级规划教材<C#程序设计及应用教程>(第3版) 一.要点概述 <C#程序设计及应用教程>(第3版)的第 ...
- 【C++】第1章 在VS2015中用C++编写控制台应用程序
分类:C++.VS2015 创建日期:2016-06-12 一.简介 看到不少人至今还在用VC 6.0开发工具学习C++,其实VC 6.0开发工具早就被淘汰了.这里仅介绍学习C++时推荐使用的两种开发 ...
- c#取得控制台应用程序根目录
1.取得控制台应用程序的根目录方法 方法1.Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径方法2.AppDomain.CurrentDomain.Bas ...
- Web应用程序或者WinForm程序 调用 控制台应用程序及参数传递
有时候在项目中,会调用一个控制台应用程序去处理一些工作.那在我们的程序中要怎么样做才能调用一个控制台应用程序并将参数传递过去,控制台程序执行完后,我们的程序又怎样获取返回值?代码如下:调用代码: ...
- vc2010 win32 控制台应用程序中文乱码
vc2010 win32 控制台应用程序中文乱码 在 vc2010 上用 win32 控制台程序写些测试代码调用 windows api ,处理错误信息时,发现用 wprintf 输出的错误信息出现了 ...
- c# 隐藏 控制台应用程序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 如何编写一个编译c#控制台应用程序的批处理程序
如何编写一个编译c#控制台应用程序的批处理程序 2011-03-22 18:14 dc毒蘑菇 | 浏览 579 次 最近在网上看了一个教程,是学C#的,但是我的机子上装不上vs,所以想写一个批处理来编 ...
随机推荐
- 【转】vue.js三种安装方式
Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...
- 数据库mysql原生代码基本操作
创建表: CREATE TABLE `biao` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '测试表', `createtime` ...
- Comet OJ - Contest #3 题解
传送门 太菜了连\(D\)都做不出来没有小裙子\(QAQ\) \(A\) 暴力把所有的数对都算出来,然后\(sort\)一下就行了 const int N=505; int a[N],st[N*N], ...
- MVC系列学习(十)-生成URL与表单
本次学习,在路由配置信息中,有两个路由规则,在网站第一次启动的时候,注册了两个路由表 1.动态生成url A.在路由规则中,因为Default在前面,所以最新找到该路由表,此时不管 自己定义的控制器名 ...
- [ Nowcoder Contest 165 #D ] 合法括号序列
\(\\\) \(Description\) 键盘上有三个键,敲击效果分别是: 在输出序列尾部添加一个左括号 在输出序列尾部添加一个右括号 删除输出序列尾部的第一个元素,若输出序列为空,则什么都不发生 ...
- HTML TabIndex属性
TabIndex作用: tabindex:全局属性.指示其元素是否可以聚焦(获得焦点),以及它是否/在何处参与顺序键盘导航(因通常使用tab键操作,顾因此得名). 当使用tab键在网页控件中进行导航时 ...
- Node.js的运行
nodejs的运行 首先要在你的电脑上下载node.js并安装,大家可以去官网下载 1.第一种方法:去官网下载git,安装好后,在桌面上单击鼠标右键,会有一个Git Bash Here,然后在新建一个 ...
- Android 在fragment中实现返回键单击提醒 双击退出
尝试用mvp架构加dagger2来重写了一下,大致功能都实现了,还没有全部完成. 项目地址 接近完成的时候,想在天气信息页面实现一个很常见的功能,也就是点击屏幕下方的返回键的时候不是返回到上一个act ...
- html5——边框
精确控制 /*水平半径 垂直半径;*/ border-top-left-radius: 30px 40px; border-top-right-radius: 30px 40px; border-bo ...
- python读取单个文件操作
python读取单个文件,参考<笨方法学python>的第15节. 运行方式是采用:python python文件名 要读取的文件名 代码中 script, filename = argv ...