好久没写ArcEngine了,今天有人问我怎么在ArcEngine里生成平头缓冲区。这个问题其实很简单,图省事的话调用GP就能做,但对我个人来说,除非是到了万不得已的情况下,否则我绝不会用GP来做。ArcEngine中有一个接口IBufferConstruction,看这个接口的名字就知道它是用来构造缓冲区的,下面给出创建平头缓冲区、圆角缓冲区、单边缓冲区的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.SystemUI;namespace WindowsFormsApplication1
{public partial class MainForm : Form{public MainForm(){InitializeComponent();axMapControl1.LoadMxFile(@"C:\Users\DSF\Desktop\data\无标题.mxd");}// 创建缓冲区private void btnCreateBuffer_Click(object sender, EventArgs e){IFeatureLayer pFeatureLayer = axMapControl1.get_Layer(0) as IFeatureLayer;IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;// 圆角缓冲区,半径5米IGeometry pRoundBuffer = CreateBuffer(pFeatureClass.GetFeature(0).ShapeCopy, esriBufferConstructionEndEnum.esriBufferRound, esriBufferConstructionSideEnum.esriBufferFull, 5);Draw(pRoundBuffer, 255, 0, 0);// 平头缓冲区,半径5米IGeometry pFlatBuffer = CreateBuffer(pFeatureClass.GetFeature(1).ShapeCopy, esriBufferConstructionEndEnum.esriBufferFlat, esriBufferConstructionSideEnum.esriBufferFull, 5);Draw(pFlatBuffer, 0, 255, 0);// 单边平头缓冲区,半径5米IGeometry pLeftBuffer = CreateBuffer(pFeatureClass.GetFeature(2).ShapeCopy, esriBufferConstructionEndEnum.esriBufferFlat, esriBufferConstructionSideEnum.esriBufferLeft, 5);Draw(pLeftBuffer, 0, 0, 255);}// 获取缓冲区实体private IGeometry CreateBuffer(IGeometry pGeometry, esriBufferConstructionEndEnum endOption, esriBufferConstructionSideEnum sideOption, double bufferDistance){IGeometryBag pGeometryBag = new GeometryBag() as IGeometryBag;pGeometryBag.SpatialReference = axMapControl1.SpatialReference;IGeometryCollection pGeometryCollection = pGeometryBag as IGeometryCollection;pGeometryCollection.AddGeometry(pGeometry);// 设置缓冲区属性IBufferConstruction pBufferConstruction = new BufferConstruction();IBufferConstructionProperties pBufferConstructionProperties = pBufferConstruction as IBufferConstructionProperties;pBufferConstructionProperties.EndOption = endOption;pBufferConstructionProperties.SideOption = sideOption;// 获取缓冲区IGeometryCollection pOutputGeometryCollection = new GeometryBag() as IGeometryCollection;pBufferConstruction.ConstructBuffers(pGeometryCollection as IEnumGeometry, bufferDistance, pOutputGeometryCollection);// 转换为IPolygonITopologicalOperator pTopologicalOperator = new Polygon() as ITopologicalOperator;pTopologicalOperator.ConstructUnion(pOutputGeometryCollection as IEnumGeometry);return pTopologicalOperator as IGeometry;}// 绘制private void Draw(IGeometry pGeometry, int r, int g, int b){IRgbColor pRgbColor = new RgbColor();pRgbColor.Red = r;pRgbColor.Green = g;pRgbColor.Blue = b;// 创建符号ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbol();pSimpleFillSymbol.Color = pRgbColor;pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSCross;// 创建元素IFillShapeElement pFillShapeElement = new PolygonElement() as IFillShapeElement;pFillShapeElement.Symbol = pSimpleFillSymbol;IElement pElement = pFillShapeElement as IElement;pElement.Geometry = pGeometry;// 绘制元素IActiveView pActiveView = axMapControl1.ActiveView;IGraphicsContainer pGraphicsContainer = pActiveView.GraphicsContainer;pGraphicsContainer.AddElement(pElement, 0);pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);}}
}

运行结果如下图所示,可以看到:红色缓冲区就是圆角缓冲区,也就是一般的缓冲区,绿色缓冲区是平头缓冲区,蓝色缓冲区是单边平头缓冲区

ArcEngine创建平头缓冲区的方法相关推荐

  1. 在C和C ++中创建循环缓冲区

    概述 由于嵌入式系统的资源限制,在大多数项目中都可以找到循环缓冲区数据结构. 循环缓冲区(也称为环形缓冲区)是固定大小的缓冲区,其工作方式就像内存是连续的且本质上是循环的.随着内存的生成和消耗,不需要 ...

  2. python创建以姓名命名的txt文件,python创建文本文件的简单方法

    python open() 函数以指定模式打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写. w 模式表示打开一个文件只用于写入.如果该文件已存在则打开文件,并从开头开始编辑,即原有 ...

  3. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  4. 在IOS中创建get,set方法

    在iOS的编程中也可以和java中一样的创建get和set方法为成员变量进行赋值,当然在iOS中和在java中是有所不同的,那么我们该怎样创建get和set方法: 比如: -------------- ...

  5. xp创建虚拟服务器,Xp系统怎么创建虚拟目录?Xp系统创建虚拟目录的方法

    Xp系统怎么创建虚拟目录?xp系统是一款非常经典的windows系统,其一直深受着广大用户们的喜爱.虽然目前微软不在支持xp系统了但是使用还是有部分用户选择使用xp系统.下面小编就给大家带来Xp系统创 ...

  6. ArcEngine数据删除几种方法和性能比较

    转自原文 ArcEngine数据删除几种方法和性能比较 一.  几种删除方法代码 1.  查询结果中删除 private void Delete1(IFeatureClass PFeatureclas ...

  7. 数据库软件安装和数据库创建的几种方法

    数据库软件安装: 图形界面安装 静默方式安装 通过复制已经存在的数据库安装 数据库创建的几种方法 图形界面创建 静默方式创建 利用已经存在的实例创建 通过手工创建 先做总结后期完善. 转载于:http ...

  8. gdb调试fork+exec创建的子进程的方法

    最常见的多进程的形式如下: pid = fork(); if (pid < 0) { // fork failedprintf("fork error\n");exit(1) ...

  9. php 匿名方法,PHP基于Closure类创建匿名函数的方法详解

    本文实例讲述了PHP基于Closure类创建匿名函数的方法.分享给大家供大家参考,具体如下: Closure 类 用于代表匿名函数的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象. ...

最新文章

  1. 能“预测未来”的AI来了!谷歌DeepMind推Dreamer,训练时间减半
  2. 从大型主机到个人计算机:机器人产业可以从pc普及革命中学到什么?
  3. 静态库调用_静态链接和动态链接对比简析
  4. Java 100(三)
  5. eclipse中的感叹号和x号解决方法
  6. Angular CLI ng 指令指南
  7. Cheapest Palindrome POJ - 3280(动态规划*)
  8. win7 vmware虚拟机 中 mac系统无法上网
  9. RH124 Chapter 2 Managing Files From the Command Line
  10. jracdrive变频器说明书580_ABB变频器ACS580说明书.pdf
  11. matlab拟合二元方程,MATLAB拟合方程1
  12. 软件测试——PreDate函数
  13. 互补滤波算法及理论推导
  14. 计算机导论课后总结-15周-计算机m1804方振杰
  15. B代表哪一种氨基酸?B和b代表的氨基酸一样吗?
  16. P6070 『MdOI R1』Decrease
  17. Js节流(防连点)和防抖动
  18. (转)跳一跳带火了小程序后 微信小程序电商的路越来越难走了!
  19. 使用JS判断访问设备是电脑还是手机
  20. java电脑中可以删除吗,电脑中c盘cflog是什么文件夹?是否可以随意删除

热门文章

  1. linux asm软件卸载,linux下卸载oracle
  2. Python数据处理之pandas基础入门
  3. 关于订单支付成功后一些逻辑的处理
  4. 联想a670t提示android,联想A670t线刷刷机教程
  5. MySQL基础数据类型
  6. CSV文件与json文件转换实例
  7. NOI.5.22津津的储蓄计划
  8. 中国糯米粉行业品牌竞争策略与规模现状分析报告2022-2028年
  9. android 获取 meid 代码,Android 各个版本获取IMEI、MEID
  10. 细讲逻辑斯蒂回归与朴素贝叶斯、最大熵原理的爱恨交织(五)