ArcGIS Engine 基于C#的开发
(一)基本界面的搭建
* 无法嵌入互操作类型的问题的解决
*COM技术中的IUnknown接口和QueryInterface
(二)打开,保存,另存为功能
(三)鹰眼功能
之前在界面的左下角加了一个小的mapControl这个就是用来显示鹰眼视图的,如图:
关键有两点:
1,主控件axMapControl1
和鹰眼控件axMapControl2
数据的共享(保持一致);
2,如何绘制鹰眼控件中的显示方框,然后让主视图的显示范围根据鹰眼视图中的显示方框发生相应变化。
IEnvelope:IEnvelope是指地物的外接矩形;
IGraphicsContainer:Map 对象通过 IGraphicsContainer
接口来管理这些元素对象。
IElement:地图除了地理数据外,还可以拥有元素(Element),主要分为:图形元素(graphic element)和框架元素(frame element)
axMapControl1
和鹰眼控件axMapControl2
数据的共享 ///
/// 地图发生改变事件
///
///
///
private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
{
if (axMapControl1.LayerCount > 0)
{
for (int i = 0; i <= axMapControl1.Map.LayerCount - 1; ++i)
{
axMapControl2.Map.AddLayer(axMapControl1.Map.get_Layer(i));
}
axMapControl2.Extent = axMapControl1.FullExtent;//设置鹰眼视图为全局视图
axMapControl2.Refresh();
}
}
过程为先实例一个point
对象,然后将当前鹰眼视图的mapX,Y
坐标通过PutCoords
方法对point
对象进行赋值,然后再调用axMapControl
的CenterAt
方法改变主视图的显示范围。
///
/// 鹰眼视图上鼠标点击事件
///
///
///
private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
if (axMapControl2.Map.LayerCount > 0)
{
if (e.button == 1)//左键将所点击的位置,设置为主视图的中心
{
IPoint pPoint = new PointClass();
pPoint.PutCoords(e.mapX, e.mapY);//设置point对象的坐标
axMapControl1.CenterAt(pPoint);
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
else if (e.button == 2)//右键拉框范围设置为主视图显示范围
{
IEnvelope pEnv = axMapControl2.TrackRectangle();//获得拉框的范围
axMapControl1.Extent = pEnv;
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
}
}
///
/// 鹰眼视图上鼠标移动事件
///
///
///
private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
{
if (e.button == 1)//左键点击移动,俩个视图联动
{
IPoint pPoint = new PointClass();
pPoint.PutCoords(e.mapX, e.mapY);
axMapControl1.CenterAt(pPoint);
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
}
///
/// 主窗体视图范围变化
///
///
///
private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
{
//获得当前地图视图的外包矩形
IEnvelope pEnvelope = (IEnvelope)e.newEnvelope;
//获得GraphicsContainer对象
IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;
IActiveView pActiveView = pGraphicsContainer as IActiveView;
//清除对象中的所有图形元素
pGraphicsContainer.DeleteAllElements();
//获得矩形图形元素
IRectangleElement pRectangleEle = new RectangleElementClass();
IElement pElement = pRectangleEle as IElement;
pElement.Geometry = pEnvelope;
//设置FillShapeElement对象的symbol
IFillShapeElement pFillShapeEle = pElement as IFillShapeElement;
pFillShapeEle.Symbol = getFillSymbol();
//进行填充
pGraphicsContainer.AddElement((IElement)pFillShapeEle, 0);
//刷新视图
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
///
/// 获得鹰眼视图显示方框的symbol
///
///
private IFillSymbol getFillSymbol()
{
//矩形框的边界线颜色
IRgbColor pColor = new RgbColorClass();
pColor.Red = 255;
pColor.Green = 0;
pColor.Blue = 0;
pColor.Transparency = 255;
//边界线
ILineSymbol pOutline = new SimpleLineSymbolClass();
pOutline.Width = 3;
pOutline.Color = pColor;
//symbol的背景色
pColor = new RgbColorClass();
pColor.Red = 255;
pColor.Green = 0;
pColor.Blue = 0;
pColor.Transparency = 0;
//获得显示的图形元素
IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
pFillSymbol.Color = pColor;
pFillSymbol.Outline = pOutline;
return pFillSymbol;
}
重点:
将图像元素显示在视图上一般的步骤为:
1. 产生一个新的元素对象(element
);
主要分为:图形元素(graphic element)和框架元素(frame element),这里的鹰眼视图中添加的元素为矩形图形元素,通过
IRectangleElement pRectangleEle = new RectangleElementClass();
IElement pElement = pRectangleEle as IElement;
实例RectangleElement
对象,然后再跳转到RectangleElementClass
实现的IElement
接口上。
2.确定元素(element
)显示时使用的Symbol
(符号)和Geometry
(几何形体对象);
这里Geometry
(几何形体对象)比较好确定通过事件参数,然后调用其属性直接获得其外包矩形
IEnvelope pEnvelope = (IEnvelope)e.newEnvelope;
pElement.Geometry = pEnvelope;
但是要注意的是设置Symbol
(符号)属性却不属于IElement
接口的范畴,它属于IFillShapeElement
接口的规范内容所有要先由IElement
接口跳转到IFillShapeElement
接口,然后再将getFillSymbol()
方法获取到的Symbol
(符号)赋值给该对象。
IFillShapeElement pFillShapeEle = pElement as IFillShapeElement;
pFillShapeEle.Symbol = getFillSymbol();
3.使用IGraphicsContainer.AddElement
把元素添加到视图中去;、
之前在主要使用到的接口中说到我们通过GraphicsContainer
对象来管理元素对象,我们可以通过IMap
接口跳转到该接口
IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;
然后可以通过该对象清除图形元素:
pGraphicsContainer.DeleteAllElements();
最后将获得的元素(element
),添加到视图中去
pGraphicsContainer.AddElement((IElement)pFillShapeEle, 0);
4.刷新视图,让添加的元素可以显示出来。
通过axMapControl
的IActiveView
的PartialRefresh
方法进行刷新
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
或者通过接口跳转到IActiveView
IActiveView pActiveView = pGraphicsContainer as IActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
其中esriViewDrawPhase.esriViewGraphics
为枚举值表示绘制注释。