ArcEngine创建平头缓冲区的方法
好久没写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创建平头缓冲区的方法相关推荐
- 在C和C ++中创建循环缓冲区
概述 由于嵌入式系统的资源限制,在大多数项目中都可以找到循环缓冲区数据结构. 循环缓冲区(也称为环形缓冲区)是固定大小的缓冲区,其工作方式就像内存是连续的且本质上是循环的.随着内存的生成和消耗,不需要 ...
- python创建以姓名命名的txt文件,python创建文本文件的简单方法
python open() 函数以指定模式打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写. w 模式表示打开一个文件只用于写入.如果该文件已存在则打开文件,并从开头开始编辑,即原有 ...
- python创建类的实例方法-Python中动态创建类实例的方法
简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...
- 在IOS中创建get,set方法
在iOS的编程中也可以和java中一样的创建get和set方法为成员变量进行赋值,当然在iOS中和在java中是有所不同的,那么我们该怎样创建get和set方法: 比如: -------------- ...
- xp创建虚拟服务器,Xp系统怎么创建虚拟目录?Xp系统创建虚拟目录的方法
Xp系统怎么创建虚拟目录?xp系统是一款非常经典的windows系统,其一直深受着广大用户们的喜爱.虽然目前微软不在支持xp系统了但是使用还是有部分用户选择使用xp系统.下面小编就给大家带来Xp系统创 ...
- ArcEngine数据删除几种方法和性能比较
转自原文 ArcEngine数据删除几种方法和性能比较 一. 几种删除方法代码 1. 查询结果中删除 private void Delete1(IFeatureClass PFeatureclas ...
- 数据库软件安装和数据库创建的几种方法
数据库软件安装: 图形界面安装 静默方式安装 通过复制已经存在的数据库安装 数据库创建的几种方法 图形界面创建 静默方式创建 利用已经存在的实例创建 通过手工创建 先做总结后期完善. 转载于:http ...
- gdb调试fork+exec创建的子进程的方法
最常见的多进程的形式如下: pid = fork(); if (pid < 0) { // fork failedprintf("fork error\n");exit(1) ...
- php 匿名方法,PHP基于Closure类创建匿名函数的方法详解
本文实例讲述了PHP基于Closure类创建匿名函数的方法.分享给大家供大家参考,具体如下: Closure 类 用于代表匿名函数的类. 匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象. ...
最新文章
- 能“预测未来”的AI来了!谷歌DeepMind推Dreamer,训练时间减半
- 从大型主机到个人计算机:机器人产业可以从pc普及革命中学到什么?
- 静态库调用_静态链接和动态链接对比简析
- Java 100(三)
- eclipse中的感叹号和x号解决方法
- Angular CLI ng 指令指南
- Cheapest Palindrome POJ - 3280(动态规划*)
- win7 vmware虚拟机 中 mac系统无法上网
- RH124 Chapter 2 Managing Files From the Command Line
- jracdrive变频器说明书580_ABB变频器ACS580说明书.pdf
- matlab拟合二元方程,MATLAB拟合方程1
- 软件测试——PreDate函数
- 互补滤波算法及理论推导
- 计算机导论课后总结-15周-计算机m1804方振杰
- B代表哪一种氨基酸?B和b代表的氨基酸一样吗?
- P6070 『MdOI R1』Decrease
- Js节流(防连点)和防抖动
- (转)跳一跳带火了小程序后 微信小程序电商的路越来越难走了!
- 使用JS判断访问设备是电脑还是手机
- java电脑中可以删除吗,电脑中c盘cflog是什么文件夹?是否可以随意删除