using System;
using System.Collections.Generic;
using System.Text;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.SystemUI;
namespace WMS.Class
{
public class OverViewManager
{
#region 字段
private AxMapControl MainMap;
private AxMapControl OverViewMap;
private IFillShapeElement _OverViewElement = new RectangleElementClass();//鹰眼图Element
private IEnvelope _CurrentEnveop = null;
protected bool _LeftButtonDown = false;
#endregion
#region 构造器
public OverViewManager(AxMapControl sMainMap, AxMapControl sOverViewMap)
{
MainMap = sMainMap;
OverViewMap = sOverViewMap;
OverViewMap.Extent = OverViewMap.FullExtent;
_OverViewElement.Symbol = DefineSimpleFillSymbol();
_CurrentEnveop = MainMap.Extent;
MainMap.OnExtentUpdated += new IMapControlEvents2_Ax_OnExtentUpdatedEventHandler(MainMap_OnExtentUpdated);
MainMap.OnMapReplaced += new IMapControlEvents2_Ax_OnMapReplacedEventHandler(MainMap_OnMapReplaced);
MainMap.OnViewRefreshed += new IMapControlEvents2_Ax_OnViewRefreshedEventHandler(MainMap_OnViewRefreshed);
OverViewMap.OnMouseMove += new IMapControlEvents2_Ax_OnMouseMoveEventHandler(OverViewMap_OnMouseMove);
OverViewMap.OnMouseDown += new IMapControlEvents2_Ax_OnMouseDownEventHandler(OverViewMap_OnMouseDown);
OverViewMap.OnMouseUp += new IMapControlEvents2_Ax_OnMouseUpEventHandler(OverViewMap_OnMouseUp);
InitOverViewMap(OverViewMap.Extent);
}
#endregion
#region 地图事件
/// <summary>
/// 该事件在地图加载MXD文档时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void MainMap_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
OverViewMap.ClearLayers();
int count = MainMap.LayerCount;
for (int i = count - 1; i >= 0; i--)
{
ILayer layer = MainMap.get_Layer(i);
OverViewMap.AddLayer(layer);
}
InitOverViewMap(OverViewMap.Extent);
}
protected void MainMap_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
{
UpdateOverViewMap(e.newEnvelope as IEnvelope);
}
/// <summary>
/// 该事件主要用于在添加图层后,主鹰眼视图图层一致
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void MainMap_OnViewRefreshed(object sender, IMapControlEvents2_OnViewRefreshedEvent e)
{
int count = MainMap.LayerCount;
if (count != OverViewMap.LayerCount)
{
OverViewMap.ClearLayers();
for (int i = count - 1; i >= 0; i--)
{
ILayer layer = MainMap.get_Layer(i);
OverViewMap.AddLayer(layer);
}
InitOverViewMap(OverViewMap.Extent);
UpdateOverViewMap(MainMap.Extent);
}
}
#endregion
#region 鹰眼图事件
protected void OverViewMap_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 1)
{
_LeftButtonDown = true;
IPoint cPt = new PointClass();
cPt.X = e.mapX; cPt.Y = e.mapY;
_CurrentEnveop.CenterAt(cPt);
MainMap.Extent = _CurrentEnveop;
}
}
protected void OverViewMap_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
if (_LeftButtonDown)
{
IPoint cPt = new PointClass();
cPt.X = e.mapX; cPt.Y = e.mapY;
_CurrentEnveop.CenterAt(cPt);
MainMap.Extent = _CurrentEnveop;
}
}
protected void OverViewMap_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
{
_LeftButtonDown = false;
}
#endregion
#region 私有方法
private void InitOverViewMap(IEnvelope evp)
{
if (MainMap.SpatialReference == null)
{
ISpatialReferenceFactory m_SpFactory = new SpatialReferenceEnvironment();
ISpatialReference psp = m_SpFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
MainMap.SpatialReference = psp;
}
OverViewMap.SpatialReference = MainMap.SpatialReference;
evp.Expand(-evp.Width*0.38, -evp.Height*0.4, false);
IElement element = _OverViewElement as IElement;
element.Geometry = evp;
OverViewMap.ActiveView.GraphicsContainer.DeleteAllElements();
OverViewMap.ActiveView.GraphicsContainer.AddElement(element, 0);
OverViewMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
private void UpdateOverViewMap(IEnvelope evp)
{
_CurrentEnveop = evp;
IPoint pt = new PointClass();
pt.X = evp.XMax - evp.Width / 2;
pt.Y = evp.YMax - evp.Height / 2;
IEnvelope evp2 = ((IElement)_OverViewElement).Geometry.Envelope;
evp2.CenterAt(pt);
IElement element=(IElement)_OverViewElement;
element.Geometry = evp2;
OverViewMap.ActiveView.GraphicsContainer.UpdateElement(element);
OverViewMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
private ISimpleFillSymbol DefineSimpleFillSymbol()
{
ISimpleFillSymbol _SimpleFillSymbol = new SimpleFillSymbolClass();
IRgbColor rgbColor = new RgbColorClass();
rgbColor.Red = 0;
rgbColor.Green = 255;
rgbColor.Blue = 0;
rgbColor.Transparency = 255;
ILineSymbol lineSymbol = new SimpleLineSymbolClass();
lineSymbol.Width = 1.5;
lineSymbol.Color = rgbColor;
IRgbColor rgbColor2 = new RgbColorClass();
rgbColor2.Red = 255;
rgbColor2.Green = 0;
rgbColor2.Blue = 0;
rgbColor2.Transparency = 0;
_SimpleFillSymbol.Color = rgbColor2;
_SimpleFillSymbol.Outline = lineSymbol;
return _SimpleFillSymbol;
}
public void OverViewLodMxd(string pFilePath)
{
OverViewMap.LoadMxFile(pFilePath);
}
#endregion
}
}
using System.Collections.Generic;
using System.Text;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.SystemUI;
namespace WMS.Class
{
public class OverViewManager
{
#region 字段
private AxMapControl MainMap;
private AxMapControl OverViewMap;
private IFillShapeElement _OverViewElement = new RectangleElementClass();//鹰眼图Element
private IEnvelope _CurrentEnveop = null;
protected bool _LeftButtonDown = false;
#endregion
#region 构造器
public OverViewManager(AxMapControl sMainMap, AxMapControl sOverViewMap)
{
MainMap = sMainMap;
OverViewMap = sOverViewMap;
OverViewMap.Extent = OverViewMap.FullExtent;
_OverViewElement.Symbol = DefineSimpleFillSymbol();
_CurrentEnveop = MainMap.Extent;
MainMap.OnExtentUpdated += new IMapControlEvents2_Ax_OnExtentUpdatedEventHandler(MainMap_OnExtentUpdated);
MainMap.OnMapReplaced += new IMapControlEvents2_Ax_OnMapReplacedEventHandler(MainMap_OnMapReplaced);
MainMap.OnViewRefreshed += new IMapControlEvents2_Ax_OnViewRefreshedEventHandler(MainMap_OnViewRefreshed);
OverViewMap.OnMouseMove += new IMapControlEvents2_Ax_OnMouseMoveEventHandler(OverViewMap_OnMouseMove);
OverViewMap.OnMouseDown += new IMapControlEvents2_Ax_OnMouseDownEventHandler(OverViewMap_OnMouseDown);
OverViewMap.OnMouseUp += new IMapControlEvents2_Ax_OnMouseUpEventHandler(OverViewMap_OnMouseUp);
InitOverViewMap(OverViewMap.Extent);
}
#endregion
#region 地图事件
/// <summary>
/// 该事件在地图加载MXD文档时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void MainMap_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
OverViewMap.ClearLayers();
int count = MainMap.LayerCount;
for (int i = count - 1; i >= 0; i--)
{
ILayer layer = MainMap.get_Layer(i);
OverViewMap.AddLayer(layer);
}
InitOverViewMap(OverViewMap.Extent);
}
protected void MainMap_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
{
UpdateOverViewMap(e.newEnvelope as IEnvelope);
}
/// <summary>
/// 该事件主要用于在添加图层后,主鹰眼视图图层一致
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void MainMap_OnViewRefreshed(object sender, IMapControlEvents2_OnViewRefreshedEvent e)
{
int count = MainMap.LayerCount;
if (count != OverViewMap.LayerCount)
{
OverViewMap.ClearLayers();
for (int i = count - 1; i >= 0; i--)
{
ILayer layer = MainMap.get_Layer(i);
OverViewMap.AddLayer(layer);
}
InitOverViewMap(OverViewMap.Extent);
UpdateOverViewMap(MainMap.Extent);
}
}
#endregion
#region 鹰眼图事件
protected void OverViewMap_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 1)
{
_LeftButtonDown = true;
IPoint cPt = new PointClass();
cPt.X = e.mapX; cPt.Y = e.mapY;
_CurrentEnveop.CenterAt(cPt);
MainMap.Extent = _CurrentEnveop;
}
}
protected void OverViewMap_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
if (_LeftButtonDown)
{
IPoint cPt = new PointClass();
cPt.X = e.mapX; cPt.Y = e.mapY;
_CurrentEnveop.CenterAt(cPt);
MainMap.Extent = _CurrentEnveop;
}
}
protected void OverViewMap_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
{
_LeftButtonDown = false;
}
#endregion
#region 私有方法
private void InitOverViewMap(IEnvelope evp)
{
if (MainMap.SpatialReference == null)
{
ISpatialReferenceFactory m_SpFactory = new SpatialReferenceEnvironment();
ISpatialReference psp = m_SpFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
MainMap.SpatialReference = psp;
}
OverViewMap.SpatialReference = MainMap.SpatialReference;
evp.Expand(-evp.Width*0.38, -evp.Height*0.4, false);
IElement element = _OverViewElement as IElement;
element.Geometry = evp;
OverViewMap.ActiveView.GraphicsContainer.DeleteAllElements();
OverViewMap.ActiveView.GraphicsContainer.AddElement(element, 0);
OverViewMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
private void UpdateOverViewMap(IEnvelope evp)
{
_CurrentEnveop = evp;
IPoint pt = new PointClass();
pt.X = evp.XMax - evp.Width / 2;
pt.Y = evp.YMax - evp.Height / 2;
IEnvelope evp2 = ((IElement)_OverViewElement).Geometry.Envelope;
evp2.CenterAt(pt);
IElement element=(IElement)_OverViewElement;
element.Geometry = evp2;
OverViewMap.ActiveView.GraphicsContainer.UpdateElement(element);
OverViewMap.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
private ISimpleFillSymbol DefineSimpleFillSymbol()
{
ISimpleFillSymbol _SimpleFillSymbol = new SimpleFillSymbolClass();
IRgbColor rgbColor = new RgbColorClass();
rgbColor.Red = 0;
rgbColor.Green = 255;
rgbColor.Blue = 0;
rgbColor.Transparency = 255;
ILineSymbol lineSymbol = new SimpleLineSymbolClass();
lineSymbol.Width = 1.5;
lineSymbol.Color = rgbColor;
IRgbColor rgbColor2 = new RgbColorClass();
rgbColor2.Red = 255;
rgbColor2.Green = 0;
rgbColor2.Blue = 0;
rgbColor2.Transparency = 0;
_SimpleFillSymbol.Color = rgbColor2;
_SimpleFillSymbol.Outline = lineSymbol;
return _SimpleFillSymbol;
}
public void OverViewLodMxd(string pFilePath)
{
OverViewMap.LoadMxFile(pFilePath);
}
#endregion
}
}