这里放的代码都是目前感觉比较简洁的,可能会有缺陷,但是还是效率优先吧,以后有问题再补充。
1. 打开地图文档(简便、建议)
//using ESRI.ArcGIS.Controls; 引用
ICommand command = new ControlsOpenDocCommandClass();
command.OnCreate(mainMapControl.Object);
command.OnClick();
mainTOCControl.SetBuddyControl(mainMapControl); // 手动绑定伙伴控件
1.2 打开地图文档(不建议)
// using ESRI.ArcGIS.Carto;
OpenFileDialog open = new OpenFileDialog();
//设置参数
//检查文件是否存在
open.CheckFileExists = true;
open.Title = "打开地图文档";
// 不允许多个文件同时打开
open.Multiselect = false;
// 存储时打开的文件路径
open.RestoreDirectory = true;
//打开文件格式
open.Filter = @"地图文档(*.mxd)|*.mxd;|ArcMap模板(*.mxt)|*.mxt;|所有地图格式(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf";//文件过滤条件
open.Multiselect = false;//禁止多选
open.RestoreDirectory = true;
//打开窗口
open.ShowDialog();
// 存储打开的文件路径
string fileName = open.FileName;
if (mainMapControl.CheckMxFile(fileName))
{
//将数据载入pMapDocument并与Map控件关联
IMapDocument pMapDocument = new MapDocument(); // using ESRI.ArcGIS.Carto;
pMapDocument.Open(fileName, "");
//获取Map地图中激活的地图文档
mainMapControl.Map = pMapDocument.ActiveView.FocusMap;
mainMapControl.ActiveView.Refresh();
}
2. 打开数据(数据库,shp, 栅格等多种数据类型)
// 加载很多种数据
ICommand command = new ControlsAddDataCommandClass();
command.OnCreate(mainMapControl.Object);
command.OnClick();
mainMapControl.ActiveView.Refresh();
2.2 添加shp数据(为了效率不建议)
// using ESRI.ArcGIS.Geodatabase;
// using ESRI.ArcGIS.DataSourcesFile;
// using ESRI.ArcGIS.DataSourcesRaster;
private void 添加ShapefileToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
//同样实例化一个打开文件的类对象
OpenFileDialog open = new OpenFileDialog();
// 如果打开正确
if (open.ShowDialog() == DialogResult.OK)
{
//首先定义一个空的路径
string filePath = string.Empty;
// 然后定义一个空的文件名
string file = string.Empty;
// 获取完整的文件路径
string filedir = open.FileName;
//如果路径为空,嘛都不返回
if (fileDir == "") return;
// 对完整路径进行截取 获取最后一个斜杠的索引
int pos = filedir.LastIndexOf('\');
// 截取字符串 路径
filePath =filedir.Substring(0, pos);
//文件名
file = filedir.Substring(pos+1);
// 需要两个参数
axMapControl1.AddShapeFile(filePath, file);
//刷新
axMapControl1.ActiveView.Refresh();
}
}
catch (Exception)
{
MessageBox.Show("请打开正确的文档!", "提醒",MessageBoxButtons.OK, MessageBoxIcon.Error );
}
}
3. 地图浏览
3…1 全图
private void FullExtentTSButton_Click(object sender, EventArgs e)
{
mainMapControl.Extent = mainMapControl.FullExtent;
}
3.2 等比例放大
private void btnZoomInStep_Click(object sender, EventArgs e)
{
IEnvelope pEnvelope = mainMapControl.Extent;
pEnvelope.Expand(0.5, 0.5, true); //放大2倍
mainMapControl.Extent = pEnvelope;
mainMapControl.ActiveView.Refresh();
}
3.3 等比例缩小(与放大的区别在于多亿过中心点的设置)
private void btnZoomIOutStep_Click(object sender, EventArgs e)
{
IActiveView pActiveView = mainMapControl.ActiveView;
IPoint centerPoint = new PointClass();
centerPoint.PutCoords((pActiveView.Extent.XMin + pActiveView.Extent.XMax) / 2, (pActiveView.Extent.YMax + pActiveView.Extent.YMin) / 2);
IEnvelope envlop = pActiveView.Extent;
envlop.Expand(1.5, 1.5, true); //与放大的区别在于Expand的参数不同
pActiveView.Extent.CenterAt(centerPoint);
pActiveView.Extent = envlop;
pActiveView.Refresh();
}
3.4 上一视图
// 定义全局变量
IExtentStack pExtentStack;
private void PreViewTSButton_Click(object sender, EventArgs e)
{
pExtentStack = mainMapControl.ActiveView.ExtentStack;
//判断是否可以回到前一视图,第一个视图没有前视图
if (pExtentStack.CanUndo())
{
pExtentStack.Undo(); //撤销到上一视图范围
NextViewTSButton.Enabled = true; //后一视图可以使用
if (!pExtentStack.CanUndo())
{
PreViewTSButton.Enabled = false; //前一视图不能使用
}
}
mainMapControl.ActiveView.Refresh();
}
3.5 下一视图
private void NextViewTSButton_Click(object sender, EventArgs e)
{
pExtentStack = mainMapControl.ActiveView.ExtentStack;
//判断是否可以回到后一视图,最后一个视图没有后一视图
if (pExtentStack.CanRedo()) //如果可以重做下一视图
{
pExtentStack.Redo(); //重做到下一视图
PreViewTSButton.Enabled = true; //上一视图按钮可以使用
if (!pExtentStack.CanRedo()) //如果不可以重做下一视图
{
NextViewTSButton.Enabled = false; //下一视图不能用
}
}
mainMapControl.ActiveView.Refresh();
}
下面着几个功能是有关联的,所以放在了一起:
先定义一个枚举:
//枚举
public enum DownButton
{
no = 0,
pan = 1,
bigger = 2, //拉框放大
smaller = 3, //拉框缩小
}
3.6 漫游
private void PanTSButton_MouseDown(object sender, MouseEventArgs e)
{
// EjectAllButton(); //弹起所有得按钮
PanTSButton.Checked = true;
DButton = DownButton.pan;
mainMapControl.MousePointer = esriControlsMousePointer.esriPointerPan;
mainMapControl.CurrentTool = null; //将勾选得其他工具取消
}
3.7 拉框放大
private void btnBigger_Click(object sender, EventArgs e)
{
// EjectAllButton(); //弹起所有得按钮
btnBigger .Checked = true;
mainMapControl.CurrentTool = null;
DButton = DownButton.bigger;
mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomIn;
}
3.8 拉框缩小
private void btnSmaller_Click(object sender, EventArgs e)
{
// EjectAllButton(); //弹起所有得按钮
btnSmaller.Checked = true;
mainMapControl.CurrentTool = null; //将勾选的其他工具去掉
DButton = DownButton.smaller;
mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomOut;
}
然后,编写主地图的OnMouseDown事件
private void mainMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
//将屏幕的坐标转换为地图的坐标点
//IPoint pPoint = (mainMapControl.Map as IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
if (e.button == 1)
{//表示鼠标的左键
IActiveView pActiveView = mainMapControl.ActiveView;
IEnvelope pEnvelop = new EnvelopeClass();
switch (DButton)
{
//拉框放大
case DownButton.bigger:
#region 拉框放大
pEnvelop = mainMapControl.TrackRectangle();
//如果拉框的范围为空则返回
if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0)
{
return;
}
//如果有拉框范围则放大到拉框范围
pActiveView.Extent = pEnvelop;
pActiveView.Refresh();
break;
#endregion
case DownButton.smaller:
#region 拉框缩小
pEnvelop = mainMapControl.TrackRectangle();
//如果拉框范围为空则退出
if (pEnvelop == null || pEnvelop.IsEmpty || pEnvelop.Height == 0 || pEnvelop.Width == 0)
{
return;
}
else //如果有拉框范围、则以拉框范围为中心,缩小倍数为当前视图范围/拉框范围
{
double dWidth = pActiveView.Extent.Width * pActiveView.Extent.Width / pEnvelop.Width;
double dHeight = pActiveView.Extent.Height * pActiveView.Extent.Height / pEnvelop.Height;
double dXmin = pActiveView.Extent.XMin - ((pEnvelop.XMin - pActiveView.Extent. XMin) * pActiveView.Extent.Width / pEnvelop.Width);
double dYmin = pActiveView.Extent.YMin - ((pEnvelop.YMin - pActiveView.Extent.YMin) * pActiveView.Extent.Height / pEnvelop.Height);
double dXmax = dXmin + dWidth;
double dYmax = dYmin + dHeight;
pEnvelop.PutCoords(dXmin, dYmin, dXmax, dYmax);
}
pActiveView.Extent = pEnvelop;
pActiveView.Refresh();
break;
#endregion
case DownButton.pan:
#region 漫游
mainMapControl.Pan();
break;
#endregion
}
}
}
4. 保存地图文档
private void saveToolStrip_Click(object sender, EventArgs e)
{
try
{
string sMxdFileName = mainMapControl.DocumentFilename;
IMapDocument pMapDocument = new MapDocumentClass();
//检查文档是否为空以及有效性
if (sMxdFileName != null && mainMapControl.CheckMxFile(sMxdFileName))
{
if (pMapDocument.get_IsReadOnly(sMxdFileName))
{
MessageBox.Show("地图本当为只读,不能保存!");
pMapDocument.Close();
return;
}
else
{
SaveFileDialog pSaveFileDialog = new System.Windows.Forms.SaveFileDialog();
pSaveFileDialog.Title = "请选择保存路径";
pSaveFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
//当相同的文件存在是提示错误
pSaveFileDialog.OverwritePrompt = true;
pSaveFileDialog.RestoreDirectory = true;
if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
{
//获取名字
sMxdFileName = pSaveFileDialog.FileName;
}
else
{
return;
}
pMapDocument.New(sMxdFileName);
pMapDocument.ReplaceContents(mainMapControl.Map as IMxdContents);
//保存为绝对路径
pMapDocument.Save(pMapDocument.UsesRelativePaths, true);
pMapDocument.Close();
MessageBox.Show("保存文档成功");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
4.2 另存为
private void saveAsToolStrip_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog pSaveDialog = new System.Windows.Forms.SaveFileDialog();
pSaveDialog.Title = "另存为";
pSaveDialog.OverwritePrompt = true;//当相同的文件存在是提示错误
pSaveDialog.Filter = "ArcMap文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt";
pSaveDialog.RestoreDirectory = true;
if (pSaveDialog.ShowDialog() == DialogResult.OK)
{
string sFilePath = pSaveDialog.FileName;
IMapDocument pMapDocument = new MapDocumentClass();
pMapDocument.New(sFilePath);
pMapDocument.ReplaceContents(mainMapControl.Map as IMxdContents);
pMapDocument.Save(true, true);
pMapDocument.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
- 输出地图(这里真的想用python写脚本, engine这么这么复杂)
- 选择要素
- 查询
- 空间分析