C# AE开发 (二):实现地图的放大缩小漫游
使用C#编程实现AE开发的一系列地图视图操作。
包括:地图的放大缩小、按照矩形框放大缩小、移动、全局显示
一、地图的放大缩小
- 放大(Zoom In)
private void zoomInToolStripMenuItem_Click(object sender, EventArgs e)
{
IEnvelope pEnvelop = axMapControl1.Extent;//Extent当前窗口的地图范围 返回envelope对象
//调用接口 几何对象类库
pEnvelop.Expand(0.5, 0.5, true);//X、Y方向按比例被放大成原来的0.5倍
axMapControl1.Extent = pEnvelop;
axMapControl1.Refresh();
}
- 缩小(Zoom Out)
IEnvelope pEnvelop = axMapControl1.Extent;
pEnvelop.Expand(1.5, 1.5, true);
axMapControl1.Extent = pEnvelop;//当前窗口的范围变成缩小后的范围
axMapControl1.Refresh();
二、按照矩形框放大缩小、平移及全局显示
在画矩形框时会激发axmapcontrol的mousedown事件,激发了控件的mousedown事件后才后续实现具体的放大、缩小、平移等操作。故点击不同的菜单按钮都会进入axMapControl1_OnMouseDown函数,只不过执行的具体函数内容有所差异。代码通过两部分函数来实现:
2.1 菜单按钮对应的函数:
点击不同的菜单按钮都会激发控件的mousedown事件,所以定义一个toolAction字段,以区分不同功能。
- 按矩形框放大(Drag Zoom In)
private void dragZoomInToolStripMenuItem_Click(object sender, EventArgs e)
{
toolAction = "Drag Zoom In";//在控件中拉框 激发mousedown事件
}
- 按矩形框缩小(Drag Zoom Out)
private void dragZoomOutToolStripMenuItem_Click(object sender, EventArgs e)
{
toolAction = "Drag Zoom Out";
}
- 平移(Pan)
private void panToolStripMenuItem_Click(object sender, EventArgs e)
{
toolAction = "Pan";
}
- 全局显示(Full Map)
private void fullMapToolStripMenuItem_Click(object sender, EventArgs e)
{
toolAction = "Full Map";
}
2.2 mousedown事件函数
通过对toolAction进行不同的赋值,实现在mousedown事件区分不同的操作。
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
switch (toolAction)
{
case "Drag Zoom In":
IEnvelope pEnvelop = axMapControl1.TrackRectangle();//返回Ienvelope接口
if (pEnvelop == null | pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0)//若没拉框、返回空 拉框没内容、拉了一个直线
{
return;
}
axMapControl1.Extent = pEnvelop;//Extent等于当前框的范围
break;
case "Drag Zoom Out":
IEnvelope pEnvelop2 = axMapControl1.TrackRectangle();//返回Ienvelope接口
if (pEnvelop2 == null || pEnvelop2.IsEmpty || pEnvelop2.Height == 0 || pEnvelop2.Width == 0)
{
return;
}
double x_scale = axMapControl1.Extent.Width / pEnvelop2.Width;//XY尺寸
double y_scale = axMapControl1.Extent.Height / pEnvelop2.Width;
//新窗口的高度宽度=原地图窗口*比例
double width = axMapControl1.Extent.Width * x_scale;
double height = axMapControl1.Extent.Width * y_scale;
//找到窗口的最小值 即XY的最小值
double x_min = pEnvelop2.XMin - (pEnvelop2.XMin - axMapControl1.Extent.XMin) * x_scale;
double y_min = pEnvelop2.YMin - (pEnvelop2.YMin - axMapControl1.Extent.YMin) * y_scale;
//取矩形框的取最大值
double x_max = x_min + width;
double y_max = y_min + height;
//新的envelop
pEnvelop2.PutCoords(x_min, y_min, x_max, y_max);
axMapControl1.Extent = pEnvelop2;
axMapControl1.Refresh();
break;
case "Pan": //实现平移
axMapControl1.Pan();
axMapControl1.Refresh();
break;
case "Full Map":
axMapControl1.Extent = axMapControl1.FullExtent;//FullExtent存放当前地图文档的整个范围
axMapControl1.Refresh();
break;
}
}