基於ArcGIS Base Command模板放大縮小
[地址]http://blog.csdn.net/eof_2011/article/details/8014075
既能拉框也能點擊放大縮小,原作者寫的非常好收藏了。
基於ESRI.ArcGIS.Controls命名空間
這種esriControlsMousePointer方式實現的放大縮小只能拉框不能點擊
放大
//寫在功能按鈕中
axMapControl1.MousePointer=esriControlsMousePointer.esriPointerZoomIn;
flag= a number //以flag number來判斷 //寫在OnMouseDown之類的事件中 下同
IEnvelope pEnvelope = axMapControl1.TrackRectangle(); axMapControl1.Extent = pEnvelope ;
縮小
axMapControl1.MousePointer = esriControlsMousePointer.esriPointerZoomOut;
pEnvelope = axMapControl1.TrackRectangle(); pEnvelope = axMapControl1.Extent; pEnvelope .Expand(2, 2, true); axMapControl1.Extent = pEnvelope ;
漫游
axMapControl1.MousePointer = esriControlsMousePointer.esriPointerPan;
pEnvelope = axMapControl1.Extent; axMapControl1.Pan();
全局顯示
axMapControl1.Extent = axMapControl1.FullExtent;
Tips:
可以根據flag來if判斷寫何種類型操作之后的代碼
基於IEnvolope的Expand方法
這種方法只能拉框放大
private void Zoom_Out(AxMapControl map) { var _map = axMapControl1; _map.Extent = _map.FullExtent; IEnvelope pEnvelope = null; pEnvelope = _map.Extent; pEnvelope.Expand(0.5, 0.5, true); _map.Extent = pEnvelope; //_map.MousePointer = esriControlsMousePointer.esriPointerDefault; _map.ActiveView.Refresh(); } //ZoomIn放大 private void Zoom_In() { IActiveView pAtView = axMapControl1.ActiveView; IPoint centerPoint = new PointClass(); centerPoint.PutCoords((pAtView.Extent.XMin + pAtView.Extent.XMax) * 2, (pAtView.Extent.YMax + pAtView.Extent.YMin) * 2); IEnvelope pEnvlope = pAtView.Extent; pEnvlope.Expand(1.5, 1.5, true); 與放大的區別在於參數不同 pAtView.Extent.CenterAt(centerPoint); pAtView.Extent = pEnvlope; pAtView.Refresh(); }
基於IEnvolope的Expand方法還有下面寫法。
//這些寫在放大按鈕事件里
Property.axMapControl.CurrentTool = null;
pMouseOperate = "ZoomIn";
Property.axMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomIn;
//同理 縮小的
mainMapControl.CurrentTool = null;
pMouseOperate = "ZoomOut";
mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomOut;
//這些方法axMapControl中鼠標按下事件中
//屏幕坐標點轉化為地圖坐標點
pPointPt = (mainMapControl.Map as IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
if (e.button == 1)
{
IActiveView pActiveView = mainMapControl.ActiveView;
IEnvelope pEnvelope = new EnvelopeClass();
switch (pMouseOperate)
{
#region 拉框放大
case "ZoomIn":
pEnvelope = mainMapControl.TrackRectangle();
//如果拉框范圍為空則返回
if (pEnvelope == null || pEnvelope.IsEmpty || pEnvelope.Height == 0 || pEnvelope.Width == 0)
{
return;
}
//如果有拉框范圍,則放大到拉框范圍
pActiveView.Extent = pEnvelope;
pActiveView.Refresh();
break;
#endregion
#region 拉框縮小
case "ZoomOut":
pEnvelope = mainMapControl.TrackRectangle();
//如果拉框范圍為空則退出
if (pEnvelope == null || pEnvelope.IsEmpty || pEnvelope.Height == 0 || pEnvelope.Width == 0)
{
return;
}
//如果有拉框范圍,則以拉框范圍為中心,縮小倍數為:當前視圖范圍/拉框范圍
else
{
double dWidth = pActiveView.Extent.Width*pActiveView.Extent.Width/pEnvelope.Width;
double dHeight = pActiveView.Extent.Height*pActiveView.Extent.Height/pEnvelope.Height;
double dXmin = pActiveView.Extent.XMin -
((pEnvelope.XMin - pActiveView.Extent.XMin)*pActiveView.Extent.Width/
pEnvelope.Width);
double dYmin = pActiveView.Extent.YMin -
((pEnvelope.YMin - pActiveView.Extent.YMin)*pActiveView.Extent.Height/
pEnvelope.Height);
double dXmax = dXmin + dWidth;
double dYmax = dYmin + dHeight;
pEnvelope.PutCoords(dXmin, dYmin, dXmax, dYmax);
}
pActiveView.Extent = pEnvelope;
pActiveView.Refresh();
break;
#endregion
}
}
