ArcGIS中已有Application模板,我们就是模仿这个模板,自己制作一个漂亮的模板
目录
一、创建Windows Application(Engine)
一、创建Windows Application(Engine)
二、添加控件
添加MenuStrip(菜单)和StatusStrip(状态栏)控件,并且两者的Dock属性分别设置为Top,Bottom
添加ToolStripContainer控件
作用:ToolStripContainer的大小随着窗体的大小发生变化
添加ToolbarControl(工具条)控件
先添加一个SplitContainer控件
再添加一个SplitContainer控件,原来panel1和panel1时竖立着,要设置Orientation属性
SplitContainer控件分好的一个个面板中,添加TOCControl和MapControl控件,并设置Dock属性
三、添加代码
在menuStrip中添加【加载shp】并双击,添加如下代码:
private void 加载shpToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog OpenFDLG = new OpenFileDialog();
OpenFDLG.Title = "选择需要加载的地理数据文件";
OpenFDLG.Filter = "Shapefile文件(*.shp)|*.shp";
OpenFDLG.ShowDialog();
string strFileName = OpenFDLG.FileName;
//如果用户没有进行文件选择,则返回
if (strFileName == string.Empty)
return;
//如果用户选择了Shapefile文件
string pathName = System.IO.Path.GetDirectoryName(strFileName);
string fileName = System.IO.Path.GetFileNameWithoutExtension(strFileName);
//将Shapefile文件加载到axMapControl1中,即主窗体
axMapControl1.AddShapeFile(pathName, fileName);
//首先清空axMapControl2(即鸟瞰窗体)中的数据,并加载相同的Shapefile数据
axMapControl2.ClearLayers();
axMapControl2.AddShapeFile(pathName, fileName);
//设置axMapControl2(即鸟瞰窗体)的显示范围为全图
axMapControl2.Extent = axMapControl2.FullExtent;
}
在menuStrip中添加【保存为mxd】并双击,添加如下代码:
private void 保存mxdToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
string sMxdFileName = axMapControl1.DocumentFilename;
IMapDocument pMapDocument = new MapDocument();
if (sMxdFileName != null && axMapControl1.CheckMxFile(sMxdFileName))
{
if (pMapDocument.get_IsReadOnly(sMxdFileName))
{
MessageBox.Show("本地图文档是只读的,不能保存!");
pMapDocument.Close();
return;
}
}
else
{
SaveFileDialog pSaveFileDialog = new SaveFileDialog();
pSaveFileDialog.Title = "请选择保存路径";
pSaveFileDialog.OverwritePrompt = true;
pSaveFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
pSaveFileDialog.RestoreDirectory = true;
if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
{
sMxdFileName = pSaveFileDialog.FileName;
}
else
{
return;
}
}
pMapDocument.New(sMxdFileName);
pMapDocument.ReplaceContents(axMapControl1.Map as IMxdContents);
pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
pMapDocument.Close();
MessageBox.Show("保存地图文档成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
TOCControl建立与MapControl1的关联:
1、可以在TOCControl属性中设置
2、也可以在窗口加载事件中添加代码,如下
private void Form1_Load(object sender, EventArgs e)
{
axTOCControl1.SetBuddyControl(axMapControl1);
}
提高部分
右击菜单
对于TOCControl控件的学习比较重要的就是右键菜单了,例如右键菜单来实现显示属性表等功能。此次通过“显示图层名称”这样一个小功能来说一下右键菜单的实现,更多功能以后再完善。
private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
ILayer pGlobeLayer = null;
if (axMapControl1.LayerCount > 0)
{
esriTOCControlItem pItem = new esriTOCControlItem();
//pGlobeLayer为全局变量
//pGlobeLayer = new FeatureLayer();
IBasicMap pBasicMap = new Map() as IBasicMap;
object pOther = new object();
object pIndex = new object();
//获取点击的位置
axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref pGlobeLayer, ref pOther, ref pIndex);
//点击的是Layer的话,则弹出上下文菜单
if (e.button == 2 && pItem == esriTOCControlItem.esriTOCControlItemLayer)
{
contextMenuStrip1.Show(axTOCControl1, e.x, e.y);
}
}
}
private void 啦啦啦ToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("你想干嘛!!!");
}
数据视图与布局视图
在ArcGIS中,在数据视图中进行地图数据的编辑,在布局视图中制图。
AE模板中,MapControl起到数据视图的作用,PageLayoutControl则为布局视图
但是要添加PageLayoutControl控件,首先添加一个TabControl控件,然后更改TabPages属性信息,tabPage1改为“数据视图”,tabPage2改为“布局视图”,然后在数据视图栏添加MapControl控件,在布局视图栏添加PageLayoutControl控件。
tabControl控件属性中Alignment可以设置选项卡显示在哪里。
添加一下代码,实现两个视图之间的关联。
public void copyToPageLayout()
{
IObjectCopy objectCopy = new ObjectCopy();//对象拷贝接口
object copyFromMap = axMapControl1.Map;//地图对象
object copyMap = objectCopy.Copy(copyFromMap);//将axMapControl1的地图对象拷贝
object copyToMap = axPageLayoutControl1.ActiveView.FocusMap;//axPageLayoutControl1活动视图中的地图
objectCopy.Overwrite(copyMap, ref copyToMap);//将axMapControl1地图对象覆盖axPageLayout1当前地图
}
private void axMapControl1_OnMapReplaced_1(object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
copyToPageLayout();
}
private void axMapControl1_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
{
IActiveView activeView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap;//axPageLayoutControl1的活动视图的地图
IDisplayTransformation displayTransformation = activeView.ScreenDisplay.DisplayTransformation;//活动视图的屏幕显示的显示信息
displayTransformation.VisibleBounds = axMapControl1.Extent;//将axMapControl1的范围赋值给axPageLayoutControl1的范围
axPageLayoutControl1.ActiveView.Refresh();//刷新axPageLayoutControl1的活动视图
copyToPageLayout();//将axMapControl1的地图拷贝到axPageLayoutControl1中
}
转载:https://blog.csdn.net/qq_39972875/article/details/85306706
状态栏
其实状态栏和菜单栏是基本上一致的。
以当前坐标威力:
设置其属性,Name=CoordinateLabel, text=当前坐标
添加一下代码:
public string sMapUnits;
private void axMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
CoordinateLabel.Text = "当前坐标 X=" + e.mapX.ToString() + " Y = " + e.mapY.ToString() + " " + sMapUnits;
}
private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
copyToPageLayout();
ESRI.ArcGIS.esriSystem.esriUnits mapUnits = axMapControl1.MapUnits;
switch (mapUnits)
{
case ESRI.ArcGIS.esriSystem.esriUnits.esriCentimeters:
sMapUnits = "Centimeters";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriDecimalDegrees:
sMapUnits = "Decimal Degrees";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriDecimeters:
sMapUnits = "Decimeters";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriFeet:
sMapUnits = "Feet";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriInches:
sMapUnits = "Inches";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriKilometers:
sMapUnits = "Kilometers";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriMeters:
sMapUnits = "Meters";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriMiles:
sMapUnits = "Miles";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriMillimeters:
sMapUnits = "Millimeters";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriNauticalMiles:
sMapUnits = "NauticalMiles";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriPoints:
sMapUnits = "Points";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriUnknownUnits:
sMapUnits = "Unknown";
break;
case ESRI.ArcGIS.esriSystem.esriUnits.esriYards:
sMapUnits = "Yards";
break;
}
}