ArcGIS Engine简单图形绘制功能的实现(点、线、面)
我们添加点、线、面来实现图形的编辑需要使用Geometry对象类。

Point(点)
是一个0维的几何图形,具有X、Y坐标值,以及可选的属性,如高程值(Z值)、度量值(M值)、ID值等,可用于描述需要精确定位的对象。
Polyline(线)
是一个有序路径(Path)的集合,这些路径既可以是连续的,也可以是离散的。折线可用于表示具有线状特征的对象,用户可以用单路径构成的折线来表示简单线,也可以用具有多个路径的多义线来表示复杂线类型。
Polygon(面)
是环(Ring)的集合,环是一种封闭的路径。Polygon可以由一个或者多个环组成,甚至环内嵌套环。但是内、外环之间不能重叠,它通常用来描述面状特征的要素。

操作步骤大纲:
①定义一个Operation枚举
②设置鼠标移动的函数
③添加图形绘制的单击事件
④axMapContol控件的鼠标单击事件
⑤完善各事件中需要用到的函数
①定义一个Operation枚举
//定义一个Operation枚举
enum Operation
{
ConstructionPoint,//绘制点
ConstructionPolyLine,//绘制线
ConstructionPolygon,//绘制面
Nothing
}
②设置鼠标移动的函数
/// <summary>
/// 鼠标移动的函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
try
{
toolStripStatusLabel1.Text = string.Format("{0},{1} {2}", e.mapX.ToString("#######.##"), e.mapY.ToString("#######.##"), axMapControl1.MapUnits.ToString().Substring());
}
catch
{ } }
③添加图形绘制的单击事件
#region 添加图形绘制的单击事件
private void 点ToolStripMenuItem_Click(object sender, EventArgs e)
{
oprFlag = Operation.ConstructionPoint;
} private void 折线ToolStripMenuItem_Click(object sender, EventArgs e)
{
oprFlag = Operation.ConstructionPolyLine;
geoCollection = new PolylineClass();
ptCollection = new PolylineClass();
} private void 面ToolStripMenuItem_Click(object sender, EventArgs e)
{
oprFlag = Operation.ConstructionPolygon;
} #endregion
④axMapContol控件的鼠标单击事件
/// <summary>
/// axMapContol控件的鼠标单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
//表示 System.Type 信息中的缺少值。 此字段为只读。
missing = Type.Missing;
//若为添加点的事件
if (oprFlag == Operation.ConstructionPoint)
{
//axMapControl1控件的当前地图工具为空
axMapControl1.CurrentTool = null;
//通过AddPointByStore函数, 获取绘制点的图层——Cities
//从GetPoint函数获取点的坐标
AddPointByStore("Cities", GetPoint(e.mapX, e.mapY) as IPoint);
//点添加完之后结束编辑状态
oprFlag = Operation.Nothing;
}
//若为添加折线的事件
if (oprFlag == Operation.ConstructionPolyLine)
{
//axMapControl1控件的当前地图工具为空
axMapControl1.CurrentTool = null;
//获取鼠标单击的坐标
//ref参数能够将一个变量带入一个方法中进行改变, 改变完成后, 再将改变后的值带出方法
//ref参数要求在方法外必须为其赋值, 而方法内可以不赋值
ptCollection.AddPoint(GetPoint(e.mapX, e.mapY), ref missing, ref missing);
//定义集合类型绘制折线的方法
pGeometry = axMapControl1.TrackLine(); //通过addFeature函数的两个参数, Highways——绘制折线的图层; Geometry——绘制的几何折线
AddFeature("Highways", pGeometry); //折线添加完之后结束编辑状态
oprFlag = Operation.Nothing;
}
//若为添加面的事件
if (oprFlag == Operation.ConstructionPolygon)
{
//axMapControl1控件的当前地图工具为空
axMapControl1.CurrentTool = null;
//
CreateDrawPolygon(axMapControl1.ActiveView, "Counties");
//面添加完之后结束编辑状态
oprFlag = Operation.Nothing;
}
}
⑤完善各事件中需要用到的函数
1、添加点的事件中需要用到的函数:
AddPointByStore
/// <summary>
/// 获取绘制点的图层——Cities, 保存点绘制的函数
/// </summary>
/// <param name="pointLayerName"></param>
/// <param name="point"></param>
private void AddPointByStore(string pointLayerName, IPoint pt)
{
//得到要添加地物的图层
IFeatureLayer pFeatureLayer = GetLayerByName(pointLayerName) as IFeatureLayer;
if (pFeatureLayer != null)
{
//定义一个地物类, 把要编辑的图层转化为定义的地物类
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
//先定义一个编辑的工作空间, 然后将其转化为数据集, 最后转化为编辑工作空间
IWorkspaceEdit w = (pFeatureClass as IDataset).Workspace as IWorkspaceEdit;
IFeature pFeature;
//开始事务操作
w.StartEditing(false);
//开始编辑
w.StartEditOperation();
//创建一个(点)要素
pFeature = pFeatureClass.CreateFeature();
//赋值该要素的Shape属性
pFeature.Shape = pt; //保存要素, 完成点要素生成
//此时生成的点要素只要集合特征(shape/Geometry), 无普通属性
pFeature.Store(); //结束编辑
w.StopEditOperation();
//结束事务操作
w.StopEditing(true); }
//屏幕刷新
this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, null); }
2、添加线事件中需要用到的函数(也包含面面事件)
GetPoint
/// <summary>
/// 获取鼠标单击时的坐标位置信息
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
private IPoint GetPoint(double x, double y)
{
IPoint pt = new PointClass();
pt.PutCoords(x, y);
return pt;
}
添加实体对象到地图图层(添加线、面要素) AddFeature
/// <summary>
/// 添加实体对象到地图图层(添加线、面要素)
/// </summary>
/// <param name="layerName">图层名称</param>
/// <param name="pGeometry">绘制形状(线、面)</param>
private void AddFeature(string layerName, IGeometry pGeometry)
{
ILayer pLayer = GetLayerByName(layerName);
//得到要添加地物的图层
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
if (pFeatureLayer != null)
{
//定义一个地物类, 把要编辑的图层转化为定义的地物类
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
//先定义一个编辑的工作空间, 然后将其转化为数据集, 最后转化为编辑工作空间
IWorkspaceEdit w = (pFeatureClass as IDataset).Workspace as IWorkspaceEdit;
IFeature pFeature; //开始事务操作
w.StartEditing(true);
//开始编辑
w.StartEditOperation(); //在内存创建一个用于暂时存放编辑数据的要素(FeatureBuffer)
IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
//定义游标
IFeatureCursor pFtCursor;
//查找到最后一条记录, 游标指向该记录后再进行插入操作
pFtCursor = pFeatureClass.Search(null, true);
pFeature = pFtCursor.NextFeature();
//开始插入新的实体对象(插入对象要使用Insert游标)
pFtCursor = pFeatureClass.Insert(true);
try
{
//向缓存游标的Shape属性赋值
pFeatureBuffer.Shape = pGeometry;
}
catch (COMException ex)
{
MessageBox.Show("绘制的几何图形超出了边界!");
return;
}
//判断:几何图形是否为多边形
if (pGeometry.GeometryType.ToString() == "esriGeometryPolygon")
{
int index = pFeatureBuffer.Fields.FindField("STATE_NAME");
pFeatureBuffer.set_Value(index, "California");
}
object featureOID = pFtCursor.InsertFeature(pFeatureBuffer);
//保存实体
pFtCursor.Flush(); //结束编辑
w.StopEditOperation();
//结束事务操作
w.StopEditing(true); //释放游标
Marshal.ReleaseComObject(pFtCursor);
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pLayer, null);
}
else
{
MessageBox.Show("未发现" + layerName + "图层");
}
}
3、添加面事件中需要用到的函数
CreateDrawPolygon
/// <summary>
/// 添加面事件
/// </summary>
/// <param name="activeView"></param>
/// <param name="v"></param>
private void CreateDrawPolygon(IActiveView activeView, string sLayer)
{
//绘制多边形事件
pGeometry = axMapControl1.TrackPolygon();
//通过AddFeature函数的两个参数, sLayer——绘制折线的图层; pGeometry——绘制几何的图层
AddFeature(sLayer, pGeometry);
}
注:AddFeature函数在上面已经提及,调用即可
核心AddFeature函数总结:

谢谢观看!本人初学GIS二次开发,如果有不对的地方,请多多包涵!
ArcGIS Engine简单图形绘制功能的实现(点、线、面)的更多相关文章
- 原生js实现Canvas实现拖拽式绘图,支持画笔、线条、箭头、三角形和圆形等等图形绘制功能,有实例Demo
前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 演示地址:查看演示DEMO 新版本支持IE5+(你没看错,就是某软的IE浏览器)以上任意浏览器的Canvas绘图:htt ...
- ArcGIS Engine 中的绘制与编辑
1.线段绘制 基本步骤 构建形状 1. 创建 IPoint IPoint m_Point = new PointClass(); m_Point.PutCoords(x, y); 2. 创建 IPoi ...
- matlab学习笔记之五种常见的图形绘制功能
分类: 离散数据图形绘制 函数图形绘制 网格图形绘制 曲面图形绘制 特殊图形绘制 本文重点介绍matlab五种图形绘制方法的后三种. 一.网格图形绘制 以绘制函数z=f(x,y)三维网格图为例,下面为 ...
- android之简单图形绘制
首先编写MyView类 代码如下: package com.example.myhello; import android.content.Context; import android.graphi ...
- EmguCV 简单图形绘制
一.圆 public static void cvCircle( IntPtr img, System.Drawing.Point center, //Center of the circle int ...
- ArcGIS Engine开发鹰眼图的功能(代码优化篇)
在上一篇,ArcGIS Engine开发鹰眼图的功能(基础篇) 上一篇的实现效果图如下, 如果仔细观察,会发现一个问题,即在“鹰眼”的区域,只要在红色线框内的注记会被覆盖. 如果红色框包括整张图的话, ...
- ArcGIS Engine开发之图形查询
图形查询是以用户通过鼠标操作生成的图形几何体为输入条件进行查询的查询,其查询结果为该几何体空间范围内的所有要素.常用的查询方式包括点选.线选.多边形选择.圆形选择和矩形选择等. 相关类与接口 图像查询 ...
- Java入门:绘制简单图形
在上一节,我们学习了如何使用swing和awt工具创建一个空的窗口,本节学习如何绘制简单图形. 基本绘图介绍 Java中绘制基本图形,可以使用Java类库中的Graphics类,此类位于java.aw ...
- ArcGIS Engine开发鹰眼图的功能(基础篇)
鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...
随机推荐
- 苹果系统IOS第三方管理工具——imazing 优秀
iMazing 是一款 Windows.macOS 平台的 iPhone.iPad 管理工具,可以进行文件.音乐.视频传输,备份与还原数据,并且可以管理已安装应用,比如重新安装那些已下架的应用,是「史 ...
- sql server 使用 partition by 分区函数 解决不连续数字查询问题
sql server表中的某一列数据为不一定连续的数字,但是需求上要求按照连续数字来分段显示,如:1,2,3,4,5,6,10,11,12,13, 会要求这样显示:1~6,10~13.下面介绍如何实现 ...
- Python-进程相关概念
名词解释: 进程: 一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度运行的基本单位 1. 并行 在某个*时间点*,两件或两件以上的事件(任务)同时执行. 比如说,有三 ...
- 4款黑科技级别的宝藏APP,能够轻松满足你的多种需求,请低调收藏
有没有这样几款软件,在你每次一换新手机的时候就会立刻重新安装下来,感觉自己已经完全离不开它们?今天就来给大家分享几个非常好用的APP. 一.小羊搜搜 在生活中人人都有自己的爱好,无论你是喜欢影视.小说 ...
- 动态set mybatis与ibatis的写法
mybatis: <set> <if test="obj.buyerId != null"> buyerId = #{obj.buyerId}, </ ...
- MangoDB的下载和安装
前面已经简单介绍了MongoDB,今天我们就要正式学习他了,话不多说,咱先来安装. 1.现在MongoDB已经到了4.0版本,咱先去官网下载,MongoDB官网传送门,下载的版本信息如下,点击Do ...
- .net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展
在实际的系统中,可能需要多台机器部署;然而,Signalr的连接信息是跟站点走的,举个例子 推送系统部署了A.B两个服务器,张三访问A服务器,李四访问B服务器,当张三通过A服务器向李四推送的时候,A服 ...
- FFmpeg(二) 解封装相关函数理解
一.解封装基本流程 ①av_register_All()////初始化解封装,注册解析和封装的格式. ②avformat_netword_init()//初始化网络,解析rtsp协议 ③avforma ...
- SpringBootSecurity学习(20)前后端分离版之OAuth2.0刷新token
刷新token 前面的例子和配置都是从头开始申请授权码和令牌,现在来看一下如何根据获取令牌时,回参中的 refresh_token 来刷新令牌.现在在项目中配置的是内存模式的默认用户名密码,第一步先改 ...
- 写mysql语句时tab键与空格键
某网页上复制的一份mysql语句,报错,重写一遍后,好了,对比后,发现, 可以看到在sublime text中,网上复制的缩进是空白的,tab键是横杠,空格键是一个点