ArcEngine主要功能源码 下载本文

using System; using System.IO;

using System.Windows.Forms; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.DataSourcesRaster; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.SystemUI;

namespace MapOperation {

public partial class FormMain : Form {

#region 变量定义

//地图导出窗体

private FormExportMap frmExpMap = null;

//长度、面积量算

private FormMeasureResult frmMeasureResult = null; //量算结果窗体

private INewLineFeedback pNewLineFeedback; //追踪线对象

private INewPolygonFeedback pNewPolygonFeedback; //追踪面对象

private IPoint pPointPt = null; //鼠标点击点

private IPoint pMovePt = null; //鼠标移动时的当前点

private double dToltalLength = 0; //量测总长度

private double dSegmentLength = 0; //片段距离

private IPointCollection pAreaPointCol = new MultipointClass() ;

//面积量算时画的点进行存储;

private string sMapUnits = \未知单位\; //地图单位变量

private object missing = Type.Missing;

//TOC菜单

IFeatureLayer pTocFeatureLayer = null; //点击的要素图层

private FormAtrribute frmAttribute = null; //图层属性窗体

private ILayer pMoveLayer; //需要调整显示顺序的图层 private int toIndex; //存放拖动图层移动到的索引号

//鹰眼同步 private bool bCanDrag; //鹰眼地图上的矩形框可移动的标志

private IPoint pMoveRectPoint; //记录在移动鹰眼地图上的矩形框时鼠标的位置

private IEnvelope pEnv; //记录数据视图的Extent #endregion

#region 初始化

public FormMain() {

InitializeComponent();

axTOCControl.SetBuddyControl(mainMapControl);

EagleEyeMapControl.Extent = mainMapControl.FullExtent; pEnv = EagleEyeMapControl.Extent; DrawRectangle(pEnv); }

#endregion

#region 数据加载

#region LoadMxFile方法加载地图文档文件

private void btnLoadMxFile_Click(object sender, EventArgs e) {

//加载数据前如果有数据则清空 try {

OpenFileDialog pOpenFileDialog = new OpenFileDialog(); pOpenFileDialog.CheckFileExists = true; pOpenFileDialog.Title = \打开地图文档\; pOpenFileDialog.Filter = \文档

(*.mxd)|*.mxd;|ArcMap模板(*.mxt)|*.mxt|发布地图文件(*.pmf)|*.pmf|所有地图格式(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf\;

pOpenFileDialog.Multiselect = false; //不允许多个文件同时选择

pOpenFileDialog.RestoreDirectory = true; //存储打开的文件路径

if (pOpenFileDialog.ShowDialog() == DialogResult.OK) {

string pFileName = pOpenFileDialog.FileName; if (pFileName == \) {

return; }

if (mainMapControl.CheckMxFile(pFileName)) //检查地图文档有效性

{

ClearAllData();

mainMapControl.LoadMxFile(pFileName); } else {

MessageBox.Show(pFileName + \是无效的地图文档!\, \信息提示\);

return; } } }

catch (Exception ex) {

MessageBox.Show(\打开地图文档失败\ + ex.Message); } }

#endregion

#region IMapDocument方法加载Mxd文档文件

private void btnIMapDocument_Click(object sender, EventArgs e) {

try {

OpenFileDialog pOpenFileDialog = new OpenFileDialog(); pOpenFileDialog.CheckFileExists = true; pOpenFileDialog.Title = \打开地图文档\; pOpenFileDialog.Filter = \文档

(*.mxd)|*.mxd;|ArcMap模板(*.mxt)|*.mxt|发布地图文件(*.pmf)|*.pmf|所有地图格式(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf\;

pOpenFileDialog.Multiselect = false;

pOpenFileDialog.RestoreDirectory = true;

if (pOpenFileDialog.ShowDialog() == DialogResult.OK) {

string pFileName = pOpenFileDialog.FileName; if (pFileName == \) {

return; }

if (mainMapControl.CheckMxFile(pFileName)) //检查地图文档有效性

{

//将数据载入pMapDocument并与Map控件关联 IMapDocument pMapDocument = new MapDocument();//using ESRI.ArcGIS.Carto;

pMapDocument.Open(pFileName, \); //获取Map中激活的地图文档 mainMapControl.Map = pMapDocument.ActiveView.FocusMap;

mainMapControl.ActiveView.Refresh(); } else

{

MessageBox.Show(pFileName + \是无效的地图文档!\, \信息提示\);

return; } } }

catch (Exception ex) {

MessageBox.Show(\打开地图文档失败\ + ex.Message); } }

#endregion

#region ControlsOpenDocCommandClass加载地图

private void btncontrolsOpenDocCommandClass_Click(object sender, EventArgs e) {

ICommand command = new ControlsOpenDocCommandClass(); command.OnCreate(mainMapControl.Object); command.OnClick(); }

#endregion

#region 加载Shape文件

private void btnAddShapefile_Click(object sender, EventArgs e) {

//ClearAllData(); try {

OpenFileDialog pOpenFileDialog = new OpenFileDialog(); pOpenFileDialog.CheckFileExists = true; pOpenFileDialog.Title = \打开Shape文件\;

pOpenFileDialog.Filter = \文件(*.shp)|*.shp\; pOpenFileDialog.ShowDialog();

////获取文件路径

//FileInfo pFileInfo = new FileInfo(pOpenFileDialog.FileName);

//string pPath = pOpenFileDialog.FileName.Substring(0, pOpenFileDialog.FileName.Length - pFileInfo.Name.Length);

//mainMapControl.AddShapeFile(pPath, pFileInfo.Name);

IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeatureLayer pFeatureLayer;

string pFullPath = pOpenFileDialog.FileName; if (pFullPath == \) return;

int pIndex = pFullPath.LastIndexOf(\);

string pFilePath = pFullPath.Substring(0, pIndex); //文件路径

string pFileName = pFullPath.Substring(pIndex + 1); //文件名

//实例化ShapefileWorkspaceFactory工作空间,打开Shape文件

pWorkspaceFactory = new ShapefileWorkspaceFactory(); pFeatureWorkspace =

(IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0); //创建并实例化要素集

IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(pFileName);

pFeatureLayer = new FeatureLayer();

pFeatureLayer.FeatureClass = pFeatureClass; pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;

ClearAllData(); //新增删除数据

mainMapControl.Map.AddLayer(pFeatureLayer); mainMapControl.ActiveView.Refresh(); //同步鹰眼

SynchronizeEagleEye(); }

catch (Exception ex) {

MessageBox.Show(\图层加载失败!\ + ex.Message); } }

#endregion

#region 加载栅格文件

private void btnAddRaster_Click(object sender, EventArgs e) {

OpenFileDialog pOpenFileDialog = new OpenFileDialog(); pOpenFileDialog.CheckFileExists = true; pOpenFileDialog.Title = \打开Raster文件\; pOpenFileDialog.Filter = \栅格文件

(*.*)|*.bmp;*.tif;*.jpg;*.img|(*.bmp)|*.bmp|(*.tif)|*.tif|(*.jpg)|*.jpg|(*.img)|*.img\;

pOpenFileDialog.ShowDialog();

string pRasterFileName = pOpenFileDialog.FileName; if (pRasterFileName == \) {

return; }

string pPath =

System.IO.Path.GetDirectoryName(pRasterFileName); string pFileName =

System.IO.Path.GetFileName(pRasterFileName);

IWorkspaceFactory pWorkspaceFactory = new RasterWorkspaceFactory();

IWorkspace pWorkspace =

pWorkspaceFactory.OpenFromFile(pPath, 0);

IRasterWorkspace pRasterWorkspace = pWorkspace as IRasterWorkspace;

IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pFileName); //影像金字塔判断与创建

IRasterPyramid3 pRasPyrmid;

pRasPyrmid = pRasterDataset as IRasterPyramid3; if (pRasPyrmid != null)

{

if (!(pRasPyrmid.Present)) {

pRasPyrmid.Create(); //创建金字塔 } }

IRaster pRaster;

pRaster = pRasterDataset.CreateDefaultRaster(); IRasterLayer pRasterLayer;

pRasterLayer = new RasterLayerClass(); pRasterLayer.CreateFromRaster(pRaster); ILayer pLayer = pRasterLayer as ILayer; mainMapControl.AddLayer(pLayer, 0); }

#endregion

#region 分图层加载CAD数据

private void btnAddCADByLayer_Click(object sender, EventArgs e) {

IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeatureLayer pFeatureLayer; IFeatureClass pFeatureClass;

OpenFileDialog pOpenFileDialog = new OpenFileDialog(); pOpenFileDialog.Filter = \; pOpenFileDialog.Title = \打开CAD数据文件\; pOpenFileDialog.ShowDialog();

string pFullPath = pOpenFileDialog.FileName; if (pFullPath == \) {

return; }

//获取文件名和文件路径

int pIndex = pFullPath.LastIndexOf(\);

string pFilePath = pFullPath.Substring(0, pIndex); string pFileName = pFullPath.Substring(pIndex + 1);

pWorkspaceFactory = new CadWorkspaceFactory(); pFeatureWorkspace =

(IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0); //加载CAD文件中的线文件 pFeatureClass =

pFeatureWorkspace.OpenFeatureClass(pFileName + \); pFeatureLayer = new FeatureLayerClass(); pFeatureLayer.Name = pFileName;

pFeatureLayer.FeatureClass = pFeatureClass;

ClearAllData(); //新增删除数据

mainMapControl.Map.AddLayer(pFeatureLayer); mainMapControl.ActiveView.Refresh(); //同步鹰眼

SynchronizeEagleEye(); }

#endregion

#region 加载整幅CAD图数据

private void btnAddWholeCAD_Click(object sender, EventArgs e) {

IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeatureLayer pFeatureLayer;

IFeatureDataset pFeatureDataset;

OpenFileDialog pOpenFileDialog = new OpenFileDialog(); pOpenFileDialog.Filter = \; pOpenFileDialog.Title = \打开CAD数据文件\; pOpenFileDialog.ShowDialog();

string pFullPath = pOpenFileDialog.FileName; if (pFullPath == \) {

return; }

//获取文件名和文件路径

int pIndex = pFullPath.LastIndexOf(\);

string pFilePath = pFullPath.Substring(0, pIndex); string pFileName = pFullPath.Substring(pIndex + 1); //打开CAD数据集 pWorkspaceFactory = new CadWorkspaceFactoryClass(); //using ESRI.ArcGIS.DataSourcesFile; pFeatureWorkspace =

(IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(pFilePath, 0); //打开一个要素集 pFeatureDataset =

pFeatureWorkspace.OpenFeatureDataset(pFileName);

//IFeatureClassContainer可以管理IFeatureDataset中的每个要素类

IFeatureClassContainer pFeatClassContainer = (IFeatureClassContainer)pFeatureDataset;

ClearAllData(); //新增删除数据

//对CAD文件中的要素进行遍历处理

for (int i = 0; i < pFeatClassContainer.ClassCount; i++) {

IFeatureClass pFeatClass = pFeatClassContainer.get_Class(i);

//如果是注记,则添加注记层 if (pFeatClass.FeatureType == esriFeatureType.esriFTCoverageAnnotation) {

pFeatureLayer = new CadAnnotationLayerClass(); pFeatureLayer.Name = pFeatClass.AliasName; pFeatureLayer.FeatureClass = pFeatClass; mainMapControl.Map.AddLayer(pFeatureLayer); }

else //如果是点、线、面则添加要素层 {

pFeatureLayer = new FeatureLayerClass(); pFeatureLayer.Name = pFeatClass.AliasName; pFeatureLayer.FeatureClass = pFeatClass; mainMapControl.Map.AddLayer(pFeatureLayer); }

mainMapControl.ActiveView.Refresh();

}

//同步鹰眼

SynchronizeEagleEye(); }

#endregion

#region 把CAD作为栅格地图进行加载

private void btnAddRasterByCAD_Click(object sender, EventArgs e)

{

IWorkspaceFactory pCadWorkspaceFactory; IWorkspace pWorkspace;

ICadDrawingWorkspace pCadDrawingWorkspace; ICadDrawingDataset pCadDrawingDataset; ICadLayer pCadLayer;

OpenFileDialog pOpenFileDialog = new OpenFileDialog(); pOpenFileDialog.Filter = \; pOpenFileDialog.Title = \打开CAD数据文件\; pOpenFileDialog.ShowDialog();

string pFullPath = pOpenFileDialog.FileName; if (pFullPath == \) {

return; }

//获取文件名和文件路径

int pIndex = pFullPath.LastIndexOf(\);

string pFilePath = pFullPath.Substring(0, pIndex); string pFileName = pFullPath.Substring(pIndex + 1); pCadWorkspaceFactory = new CadWorkspaceFactoryClass();

pWorkspace = pCadWorkspaceFactory.OpenFromFile(pFilePath, 0);

pCadDrawingWorkspace = (ICadDrawingWorkspace)pWorkspace; //获得CAD文件的数据集 pCadDrawingDataset =

pCadDrawingWorkspace.OpenCadDrawingDataset(pFileName); pCadLayer = new CadLayerClass();

pCadLayer.CadDrawingDataset = pCadDrawingDataset;

mainMapControl.Map.AddLayer(pCadLayer); mainMapControl.ActiveView.Refresh(); }

#endregion

#region 加载personGeodatabase

private void btnAddPersonGeodatabase_Click(object sender, EventArgs e) {

IWorkspaceFactory pAccessWorkspaceFactory;

OpenFileDialog pOpenFileDialog = new OpenFileDialog(); pOpenFileDialog.Filter = \Geodatabase(*.mdb)|*.mdb\;

pOpenFileDialog.Title = \打开PersonGeodatabase文件\; pOpenFileDialog.ShowDialog();

string pFullPath = pOpenFileDialog.FileName; if (pFullPath == \) {

return; }

pAccessWorkspaceFactory = new AccessWorkspaceFactory(); //using ESRI.ArcGIS.DataSourcesGDB; //获取工作空间

IWorkspace pWorkspace =

pAccessWorkspaceFactory.OpenFromFile(pFullPath, 0);

ClearAllData(); //新增删除数据

//加载工作空间里的数据

AddAllDataset(pWorkspace, mainMapControl); }

#endregion

#region 加载文件地理库

private void btnAddFileDatabase_Click(object sender, EventArgs

e)

{

IWorkspaceFactory pFileGDBWorkspaceFactory;

FolderBrowserDialog dlg = new FolderBrowserDialog(); if (dlg.ShowDialog() != DialogResult.OK) return; string pFullPath = dlg.SelectedPath;

if (pFullPath == \) {

return; }

pFileGDBWorkspaceFactory = new

FileGDBWorkspaceFactoryClass(); //using ESRI.ArcGIS.DataSourcesGDB;

ClearAllData(); //新增删除数据

//获取工作空间

IWorkspace pWorkspace =

pFileGDBWorkspaceFactory.OpenFromFile(pFullPath, 0); AddAllDataset(pWorkspace, mainMapControl); }

#endregion

#region 加载SDE数据库 ///

/// 服务器连接 ///

///

private void btnAddSDEByService_Click(object sender, EventArgs e)

{

IWorkspace pWorkspace;

pWorkspace = arcSDEWorkspaceOpen(\, \, \, \, \, \);

//如果工作空间不为空则进行加载 if (pWorkspace != null)

{

AddAllDataset(pWorkspace, mainMapControl); } }

///

/// 直连

///

///

private void btnAddSDEByDirect_Click(object sender, EventArgs e)

{

IWorkspace pWorkspace;

pWorkspace = arcSDEWorkspaceOpen(\, \, \, \, \, \);

//如果工作空间不为空则进行加载 if (pWorkspace != null) {

AddAllDataset(pWorkspace, mainMapControl); } }

///

/// 通过SDE连接打开SDE数据库 ///

///

/// /// /// /// /// ///

private IWorkspace arcSDEWorkspaceOpen(string server, string instance, string user, string password, string database, string version) {

IWorkspace pWorkSpace = null;

//创建和实例化数据集

IPropertySet pPropertySet = new PropertySetClass(); pPropertySet.SetProperty(\, server);

pPropertySet.SetProperty(\, instance); pPropertySet.SetProperty(\, user);

pPropertySet.SetProperty(\, password); pPropertySet.SetProperty(\, database); pPropertySet.SetProperty(\, version); IWorkspaceFactory2 pWorkspaceFactory = new SdeWorkspaceFactoryClass();

try {

pWorkSpace = pWorkspaceFactory.Open(pPropertySet, 0); }

catch (Exception ex) {

MessageBox.Show(ex.Message); }

return pWorkSpace; }

#endregion

#region 加载txt文本数据

private void btnAddTxt_Click(object sender, EventArgs e) {

FormAddtxt frmAddtxt = new FormAddtxt(); frmAddtxt.BuddyMap = mainMapControl; frmAddtxt.Show(); } #endregion

#endregion

#region 保存 //保存地图

private void btnSaveMap_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 SaveFileDialog();

pSaveFileDialog.Title = \请选择保存路径\; pSaveFileDialog.OverwritePrompt = true;

pSaveFileDialog.Filter = \文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt\;

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); }

//ICommand command = new ControlsSaveAsDocCommandClass(); //command.OnCreate(mainMapControl.Object); //command.OnClick(); }

//地图另存为

private void btnSaveAsMap_Click(object sender, EventArgs e) {

try {

SaveFileDialog pSaveFileDialog = new SaveFileDialog(); pSaveFileDialog.Title = \另存为\;

pSaveFileDialog.OverwritePrompt = true;

pSaveFileDialog.Filter = \文档(*.mxd)|*.mxd|ArcMap模板(*.mxt)|*.mxt\;

pSaveFileDialog.RestoreDirectory = true;

if (pSaveFileDialog.ShowDialog() == DialogResult.OK) {

string sFilePath = pSaveFileDialog.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);

} }

#endregion

#region 地图浏览 //拉框放大

string pMouseOperate = null;

private void btnZoomIn_Click(object sender, EventArgs e) {

mainMapControl.CurrentTool = null; pMouseOperate = \; mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomIn; }

//拉框缩小

private void btnZoomOut_Click(object sender, EventArgs e) {

mainMapControl.CurrentTool = null; pMouseOperate = \; mainMapControl.MousePointer = esriControlsMousePointer.esriPointerZoomOut;

#region 自定义拉框缩小

//IEnvelope trackExtent, currentExtent, NewIEN = null; //currentExtent = mainMapControl.Extent;

//trackExtent = mainMapControl.TrackRectangle();

//double dXmin = 0, dYmin = 0, dXmax = 0, dYmax = 0, dHeight = 0, dWidth = 0;

//dWidth = currentExtent.Width * (currentExtent.Width / trackExtent.Width);

//dHeight = currentExtent.Height * (currentExtent.Height / trackExtent.Height);

//dXmin = currentExtent.XMin - ((trackExtent.XMin - currentExtent.XMin) * (currentExtent.Width / trackExtent.Width)); //dYmin = currentExtent.YMin - ((trackExtent.YMin -

currentExtent.YMin) * (currentExtent.Height / trackExtent.Height)); //dXmax = dXmin + dWidth; //dYmax = dYmin + dHeight;

//NewIEN = new EnvelopeClass();

//NewIEN.PutCoords(dXmin, dYmin, dXmax, dYmax); //mainMapControl.Extent = NewIEN; #endregion }

//逐级放大

private void btnZoomInStep_Click(object sender, EventArgs e) {

IEnvelope pEnvelope;

pEnvelope = mainMapControl.Extent; pEnvelope.Expand(0.5, 0.5, true); //这里设置放大为2倍,可以根据需要具体设置

mainMapControl.Extent = pEnvelope; mainMapControl.ActiveView.Refresh(); }

//逐级缩小

private void btnZoomOutStep_Click(object sender, EventArgs e) {

//IEnvelope pEnvelope;

//pEnvelope = mainMapControl.Extent; //pEnvelope.Expand(1.5, 1.5, true); //mainMapControl.Extent = pEnvelope; //mainMapControl.ActiveView.Refresh();

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 envlope = pActiveView.Extent;

envlope.Expand(1.5, 1.5, true); //和放大的区别在于Expand函数的参数不同

pActiveView.Extent.CenterAt(centerPoint); pActiveView.Extent = envlope; pActiveView.Refresh(); }

//漫游

private void btnPan_Click(object sender, EventArgs e) {

mainMapControl.CurrentTool = null; pMouseOperate = \;

mainMapControl.MousePointer = esriControlsMousePointer.esriPointerPan; }

IExtentStack pExtentStack; //前一视图

private void btnFrontView_Click(object sender, EventArgs e) {

pExtentStack = mainMapControl.ActiveView.ExtentStack; //判断是否可以回到前一视图,第一个视图没有前一视图 if (pExtentStack.CanUndo()) {

pExtentStack.Undo();

btnForWardView.Enabled = true; if (!pExtentStack.CanUndo()) {

btnFrontView.Enabled = false; } }

mainMapControl.ActiveView.Refresh(); }

//后一视图

private void btnForWardView_Click(object sender, EventArgs e) {

pExtentStack = mainMapControl.ActiveView.ExtentStack; //判断是否可以回到后一视图,最后一个视图没有后一视图 if (pExtentStack.CanRedo()) {

pExtentStack.Redo();

btnFrontView.Enabled = true; if (!pExtentStack.CanRedo()) {

btnForWardView.Enabled = false; } }

mainMapControl.ActiveView.Refresh(); }

//全图显示

private void btnFullView_Click(object sender, EventArgs e) {

mainMapControl.Extent = mainMapControl.FullExtent; }

#endregion

#region 地图导出 //区域导出

private void btnExportRegion_Click(object sender, EventArgs e) {

mainMapControl.CurrentTool = null; mainMapControl.MousePointer =

esriControlsMousePointer.esriPointerCrosshair; pMouseOperate = \; }

//全域导出

private void btnExportMap_Click(object sender, EventArgs e) {

if (frmExpMap == null || frmExpMap.IsDisposed) {

frmExpMap = new FormExportMap(mainMapControl); }

frmExpMap.IsRegion = false;

frmExpMap.GetGeometry = mainMapControl.ActiveView.Extent; frmExpMap.Show();

frmExpMap.Activate(); }

#endregion

#region 书签管理 //添加书签

private void btnAddBookMark_Click(object sender, EventArgs e) {

FormBookmark frmBookMark = new FormBookmark(); frmBookMark.ShowDialog(); string pName = string.Empty; int check = frmBookMark.Check;

if (check == 1) {

pName = frmBookMark.Bookmark; }

if (string.IsNullOrEmpty(pName)) return;

//书签进行重名判断

IMapBookmarks mapBookmarks= mainMapControl.Map as IMapBookmarks;

IEnumSpatialBookmark enumSpatialBookmarks = mapBookmarks.Bookmarks;

enumSpatialBookmarks.Reset();

ISpatialBookmark pSpatialBookmark;

while ((pSpatialBookmark = enumSpatialBookmarks.Next()) != null)

{

if (pName == pSpatialBookmark.Name) {

DialogResult dr = MessageBox.Show(\此书签名已存在!是否替换?\, \提示\, MessageBoxButtons.YesNoCancel); if (dr == DialogResult.Yes) {

mapBookmarks.RemoveBookmark(pSpatialBookmark); }

else if (dr == DialogResult.No) {

frmBookMark.ShowDialog(); } else {

return; } } }

//获取当前地图的对象

IActiveView pActiveView = mainMapControl.Map as IActiveView;

//创建一个新的书签并设置其位置范围为当前视图的范围 IAOIBookmark pBookmark = new AOIBookmarkClass(); pBookmark.Location = pActiveView.Extent; //获得书签名

pBookmark.Name = pName;

//通过IMapBookmarks接口访问当前地图书签集,添加书签到地图的书签集中

IMapBookmarks pMapBookmarks = mainMapControl.Map as IMapBookmarks;

pMapBookmarks.AddBookmark(pBookmark); }

//管理书签

private void btnMangeBookMark_Click(object sender, EventArgs e) {

try {

FormManageBookMarks frmManageBookMark = new FormManageBookMarks(mainMapControl.Map);

frmManageBookMark.ShowDialog(); }

catch (Exception ex) {

MessageBox.Show(ex.Message); } }

#endregion

#region 地图量测 //距离量测

private void btnMeasureLength_Click(object sender, EventArgs e)

{

mainMapControl.CurrentTool = null; pMouseOperate = \; mainMapControl.MousePointer =

esriControlsMousePointer.esriPointerCrosshair; if (frmMeasureResult == null || frmMeasureResult.IsDisposed) {

frmMeasureResult = new FormMeasureResult(); frmMeasureResult.frmClosed += new

FormMeasureResult.FormClosedEventHandler(frmMeasureResult_frmColsed); frmMeasureResult.lblMeasureResult.Text = \; frmMeasureResult.Text = \距离量测\; frmMeasureResult.Show(); } else {

frmMeasureResult.Activate(); } }

//面积测量

private void btnMeasureArea_Click(object sender, EventArgs e) {

mainMapControl.CurrentTool = null; pMouseOperate = \; mainMapControl.MousePointer =

esriControlsMousePointer.esriPointerCrosshair; if (frmMeasureResult == null || frmMeasureResult.IsDisposed) {

frmMeasureResult = new FormMeasureResult(); frmMeasureResult.frmClosed += new

FormMeasureResult.FormClosedEventHandler(frmMeasureResult_frmColsed); frmMeasureResult.lblMeasureResult.Text = \; frmMeasureResult.Text = \面积量测\; frmMeasureResult.Show(); } else

{

frmMeasureResult.Activate(); } }

//测量结果窗口关闭响应事件

private void frmMeasureResult_frmColsed() {

//清空线对象

if (pNewLineFeedback != null) {

pNewLineFeedback.Stop(); pNewLineFeedback = null; }

//清空面对象

if (pNewPolygonFeedback != null) {

pNewPolygonFeedback.Stop(); pNewPolygonFeedback = null; pAreaPointCol.RemovePoints(0, pAreaPointCol.PointCount); //清空点集中所有点 }

//清空量算画的线、面对象

mainMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);

//结束量算功能

pMouseOperate = string.Empty; mainMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault; }

#endregion

#region 要素选择 //要素选择

private void btnSelFeature_Click(object sender, EventArgs e) {

//bSelectFeature = true; #region 调用类库资源

mainMapControl.CurrentTool = null; ControlsSelectFeaturesTool pTool = new ControlsSelectFeaturesToolClass();

pTool.OnCreate(mainMapControl.Object);

mainMapControl.CurrentTool = pTool as ITool; #endregion

//pMouseOperate = \ }

//缩放至选择

private void btnZoomToSel_Click(object sender, EventArgs e) {

#region 调用类库资源

//ICommand pCommand = new

ESRI.ArcGIS.Controls.ControlsZoomToSelectedCommandClass(); //pCommand.OnCreate(mainMapControl.Object); //pCommand.OnClick(); #endregion

int nSlection = mainMapControl.Map.SelectionCount; if (nSlection == 0) {

MessageBox.Show(\请先选择要素!\, \提示\); } else {

ISelection selection = mainMapControl.Map.FeatureSelection;

IEnumFeature enumFeature = (IEnumFeature) selection; enumFeature.Reset();

IEnvelope pEnvelope = new EnvelopeClass(); IFeature pFeature = enumFeature.Next(); while (pFeature != null) {

pEnvelope.Union(pFeature.Extent); pFeature = enumFeature.Next(); }

pEnvelope.Expand(1.1, 1.1, true);

mainMapControl.ActiveView.Extent = pEnvelope;

mainMapControl.ActiveView.Refresh(); } }

//清除选择

private void btnClearSel_Click(object sender, EventArgs e) {

#region 调用类库资源

//ICommand pCommand = new

ESRI.ArcGIS.Controls.ControlsClearSelectionCommandClass(); //pCommand.OnCreate(mainMapControl.Object); //pCommand.OnClick(); #endregion

IActiveView pActiveView = mainMapControl.ActiveView; pActiveView.FocusMap.ClearSelection();

pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, pActiveView.Extent); }

#endregion

#region mainMapControl事件

private void mainMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) {

//屏幕坐标点转化为地图坐标点

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 \:

pEnvelope = mainMapControl.TrackRectangle(); //如果拉框范围为空则返回

if (pEnvelope == null || pEnvelope.IsEmpty || pEnvelope.Height == 0 || pEnvelope.Width == 0) {

return; }

//如果有拉框范围,则放大到拉框范围 pActiveView.Extent = pEnvelope; pActiveView.Refresh(); break;

#endregion

#region 拉框缩小

case \:

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

#region 漫游

case \:

mainMapControl.Pan(); break;

#endregion

#region 选择要素

case \: IEnvelope pEnv = mainMapControl.TrackRectangle();

IGeometry pGeo = pEnv as IGeometry;

//矩形框若为空,即为点选时,对点范围进行扩展 if (pEnv.IsEmpty == true) {

tagRECT r;

r.left = e.x - 5; r.top = e.y - 5; r.right = e.x + 5; r.bottom = e.y + 5;

pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv,

ref r, 4);

pEnv.SpatialReference = pActiveView.FocusMap.SpatialReference; }

pGeo = pEnv as IGeometry;

mainMapControl.Map.SelectByShape(pGeo, null, false);

mainMapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

break;

#endregion

#region 区域导出

case \: //删除视图中数据

mainMapControl.ActiveView.GraphicsContainer.DeleteAllElements(); mainMapControl.ActiveView.Refresh(); IPolygon pPolygon = DrawPolygon(mainMapControl);

if (pPolygon == null) return; ExportMap.AddElement(pPolygon, mainMapControl.ActiveView);

if (frmExpMap == null || frmExpMap.IsDisposed) {

frmExpMap = new FormExportMap(mainMapControl); }

frmExpMap.IsRegion = true;

frmExpMap.GetGeometry = pPolygon as IGeometry; frmExpMap.Show();

frmExpMap.Activate(); break; #endregion

#region 距离量算

case \:

//判断追踪线对象是否为空,若是则实例化并设置当前鼠标点为起始点

if (pNewLineFeedback == null) {

//实例化追踪线对象 pNewLineFeedback = new NewLineFeedbackClass();

pNewLineFeedback.Display = (mainMapControl.Map as IActiveView).ScreenDisplay;

//设置起点,开始动态线绘制

pNewLineFeedback.Start(pPointPt); dToltalLength = 0; }

else //如果追踪线对象不为空,则添加当前鼠标点 {

pNewLineFeedback.AddPoint(pPointPt); }

//pGeometry = m_PointPt; if (dSegmentLength != 0) {

dToltalLength = dToltalLength + dSegmentLength;

}

break; #endregion

#region 面积量算 case \:

if (pNewPolygonFeedback == null) {

//实例化追踪面对象

pNewPolygonFeedback = new NewPolygonFeedback();

pNewPolygonFeedback.Display = (mainMapControl.Map as IActiveView).ScreenDisplay; ;

pAreaPointCol.RemovePoints(0, pAreaPointCol.PointCount);

//开始绘制多边形

pNewPolygonFeedback.Start(pPointPt); pAreaPointCol.AddPoint(pPointPt, ref missing, ref missing); } else {

pNewPolygonFeedback.AddPoint(pPointPt); pAreaPointCol.AddPoint(pPointPt, ref missing, ref missing); }

break; #endregion

#region 要素选择

case \:

IPoint point = new PointClass();

IGeometry pGeometry = point as IGeometry; mainMapControl.Map.SelectByShape(pGeometry, null, false);

mainMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

break; #endregion

default: break; } }

else if (e.button == 2) {

pMouseOperate = \;

mainMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault; } }

private void mainMapControl_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)

{

sMapUnits = GetMapUnit(mainMapControl.Map.MapUnits);

barCoorTxt.Text = String.Format(\当前坐标:X = {0:#.###} Y = {1:#.###} {2}\, e.mapX, e.mapY, sMapUnits); pMovePt = (mainMapControl.Map as

IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);

#region 长度量算

if (pMouseOperate == \) {

if (pNewLineFeedback != null) {

pNewLineFeedback.MoveTo(pMovePt); }

double deltaX = 0; //两点之间X差值 double deltaY = 0; //两点之间Y差值

if ((pPointPt != null) && (pNewLineFeedback != null)) {

deltaX = pMovePt.X - pPointPt.X; deltaY = pMovePt.Y - pPointPt.Y;

dSegmentLength = Math.Round(Math.Sqrt((deltaX * deltaX) + (deltaY * deltaY)), 3);

dToltalLength = dToltalLength + dSegmentLength; if (frmMeasureResult != null) {

frmMeasureResult.lblMeasureResult.Text = String.Format(

\当前线段长度:{0:.###}{1};\\r\\n总长度为: {2:.###}{1}\,

dSegmentLength, sMapUnits, dToltalLength); dToltalLength = dToltalLength - dSegmentLength; //鼠标移动到新点重新开始计算 }

frmMeasureResult.frmClosed += new

FormMeasureResult.FormClosedEventHandler(frmMeasureResult_frmColsed); } }

#endregion

#region 面积量算

if (pMouseOperate == \) {

if (pNewPolygonFeedback != null) {

pNewPolygonFeedback.MoveTo(pMovePt); }

IPointCollection pPointCol = new Polygon(); IPolygon pPolygon = new PolygonClass(); IGeometry pGeo = null;

ITopologicalOperator pTopo = null;

for (int i = 0; i <= pAreaPointCol.PointCount - 1; i++) {

pPointCol.AddPoint(pAreaPointCol.get_Point(i), ref missing, ref missing); }

pPointCol.AddPoint(pMovePt, ref missing, ref missing);

if (pPointCol.PointCount < 3) return; pPolygon = pPointCol as IPolygon;

if ((pPolygon != null)) {

pPolygon.Close();

pGeo = pPolygon as IGeometry;

pTopo = pGeo as ITopologicalOperator; //使几何图形的拓扑正确 pTopo.Simplify();

pGeo.Project(mainMapControl.Map.SpatialReference); IArea pArea = pGeo as IArea;

frmMeasureResult.lblMeasureResult.Text = String.Format(

\总面积为:{0:.####}平方{1};\\r\\n总长度为:

{2:.####}{1}\,

pArea.Area, sMapUnits, pPolygon.Length); pPolygon = null; } }

#endregion }

private void mainMapControl_OnDoubleClick(object sender, IMapControlEvents2_OnDoubleClickEvent e) {

#region 长度量算

if (pMouseOperate == \) {

if (frmMeasureResult != null) {

frmMeasureResult.lblMeasureResult.Text = \线段总长度为:\ + dToltalLength + sMapUnits; }

if (pNewLineFeedback != null) {

pNewLineFeedback.Stop(); pNewLineFeedback = null; //清空所画的线对象 (mainMapControl.Map as

IActiveView).PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);

}

dToltalLength = 0; dSegmentLength = 0; }

#endregion

#region 面积量算

if (pMouseOperate == \) {

if (pNewPolygonFeedback != null) {

pNewPolygonFeedback.Stop();

pNewPolygonFeedback = null; //清空所画的线对象 (mainMapControl.Map as

IActiveView).PartialRefresh(esriViewDrawPhase.esriViewForeground, null, null);

}

pAreaPointCol.RemovePoints(0, pAreaPointCol.PointCount); //清空点集中所有点 }

#endregion }

#endregion

#region 封装的方法 ///

/// 加载工作空间里面的要素和栅格数据 ///

///

private void AddAllDataset(IWorkspace pWorkspace, AxMapControl mapControl) {

IEnumDataset pEnumDataset =

pWorkspace.get_Datasets(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);

pEnumDataset.Reset();

//将Enum数据集中的数据一个个读到DataSet中 IDataset pDataset = pEnumDataset.Next(); //判断数据集是否有数据 while (pDataset != null) {

if (pDataset is IFeatureDataset) //要素数据集 {

IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;

IFeatureDataset pFeatureDataset = pFeatureWorkspace.OpenFeatureDataset(pDataset.Name); IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;

pEnumDataset1.Reset();

IGroupLayer pGroupLayer = new GroupLayerClass(); pGroupLayer.Name = pFeatureDataset.Name; IDataset pDataset1 = pEnumDataset1.Next(); while (pDataset1 != null) {

if (pDataset1 is IFeatureClass) //要素类 {

IFeatureLayer pFeatureLayer = new FeatureLayerClass();

pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset1.Name);

if (pFeatureLayer.FeatureClass != null) {

pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;

pGroupLayer.Add(pFeatureLayer);

mapControl.Map.AddLayer(pFeatureLayer); } }

pDataset1 = pEnumDataset1.Next(); } }

else if (pDataset is IFeatureClass) //要素类 {

IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;

IFeatureLayer pFeatureLayer = new FeatureLayerClass();

pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);

pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;

mapControl.Map.AddLayer(pFeatureLayer); }

else if (pDataset is IRasterDataset) //栅格数据集 {

IRasterWorkspaceEx pRasterWorkspace =

(IRasterWorkspaceEx)pWorkspace;

IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pDataset.Name); //影像金字塔判断与创建

IRasterPyramid3 pRasPyrmid;

pRasPyrmid = pRasterDataset as IRasterPyramid3; if (pRasPyrmid != null) {

if (!(pRasPyrmid.Present)) {

pRasPyrmid.Create(); //创建金字塔 } }

IRasterLayer pRasterLayer = new RasterLayerClass(); pRasterLayer.CreateFromDataset(pRasterDataset); ILayer pLayer = pRasterLayer as ILayer; mapControl.AddLayer(pLayer, 0); }

pDataset = pEnumDataset.Next(); }

mapControl.ActiveView.Refresh(); //同步鹰眼

SynchronizeEagleEye(); }

private void ClearAllData() {

if (mainMapControl.Map != null && mainMapControl.Map.LayerCount > 0) {

//新建mainMapControl中Map

IMap dataMap = new MapClass(); dataMap.Name = \;

mainMapControl.DocumentFilename = string.Empty; mainMapControl.Map = dataMap;

//新建EagleEyeMapControl中Map

IMap eagleEyeMap = new MapClass();

eagleEyeMap.Name = \;

EagleEyeMapControl.DocumentFilename = string.Empty; EagleEyeMapControl.Map = eagleEyeMap; } }

///

/// 获取RGB颜色 ///

/// /// /// ///

private IRgbColor GetRgbColor(int intR, int intG, int intB) {

IRgbColor pRgbColor = null;

if (intR < 0 || intR > 255 || intG < 0 || intG > 255 || intB < 0 || intB > 255) {

return pRgbColor; }

pRgbColor = new RgbColorClass(); pRgbColor.Red = intR; pRgbColor.Green = intG; pRgbColor.Blue = intB; return pRgbColor; }

///

/// 获取地图单位 ///

///

private string GetMapUnit(esriUnits _esriMapUnit) {

string sMapUnits = string.Empty; switch (_esriMapUnit) {

case esriUnits.esriCentimeters:

sMapUnits = \厘米\; break;

case esriUnits.esriDecimalDegrees: sMapUnits = \十进制\; break;

case esriUnits.esriDecimeters: sMapUnits = \分米\; break;

case esriUnits.esriFeet: sMapUnits = \尺\; break;

case esriUnits.esriInches: sMapUnits = \英寸\; break;

case esriUnits.esriKilometers: sMapUnits = \千米\; break;

case esriUnits.esriMeters: sMapUnits = \米\; break;

case esriUnits.esriMiles: sMapUnits = \英里\; break;

case esriUnits.esriMillimeters: sMapUnits = \毫米\; break;

case esriUnits.esriNauticalMiles: sMapUnits = \海里\; break;

case esriUnits.esriPoints: sMapUnits = \点\; break;

case esriUnits.esriUnitsLast: sMapUnits = \; break;

case esriUnits.esriUnknownUnits: sMapUnits = \未知单位\; break;

case esriUnits.esriYards:

sMapUnits = \码\; break; default: break; }

return sMapUnits; }

///

/// 绘制多边形 ///

///

public IPolygon DrawPolygon(AxMapControl mapCtrl) {

IGeometry pGeometry = null;

if (mapCtrl == null) return null;

IRubberBand rb = new RubberPolygonClass();

pGeometry = rb.TrackNew(mapCtrl.ActiveView.ScreenDisplay, null);

return pGeometry as IPolygon; }

#endregion

#region 鹰眼的实现及同步

private void mainMapControl_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e) {

SynchronizeEagleEye(); }

private void SynchronizeEagleEye() {

if (EagleEyeMapControl.LayerCount > 0) {

EagleEyeMapControl.ClearLayers(); }

//设置鹰眼和主地图的坐标系统一致

EagleEyeMapControl.SpatialReference =

mainMapControl.SpatialReference;

for (int i = mainMapControl.LayerCount - 1; i >= 0; i--) {

//使鹰眼视图与数据视图的图层上下顺序保持一致 ILayer pLayer = mainMapControl.get_Layer(i);

if (pLayer is IGroupLayer || pLayer is ICompositeLayer) {

ICompositeLayer pCompositeLayer = (ICompositeLayer)pLayer;

for (int j = pCompositeLayer.Count - 1; j >= 0; j--) {

ILayer pSubLayer = pCompositeLayer.get_Layer(j);

IFeatureLayer pFeatureLayer = pSubLayer as IFeatureLayer;

if (pFeatureLayer != null) {

//由于鹰眼地图较小,所以过滤点图层不添加 if

(pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint &&

pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint) {

EagleEyeMapControl.AddLayer(pLayer); } } } } else {

IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;

if (pFeatureLayer != null) {

if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint && pFeatureLayer.FeatureClass.ShapeType !=

esriGeometryType.esriGeometryMultipoint) {

EagleEyeMapControl.AddLayer(pLayer); } } }

//设置鹰眼地图全图显示 EagleEyeMapControl.Extent = mainMapControl.FullExtent; pEnv = mainMapControl.Extent as IEnvelope; DrawRectangle(pEnv);

EagleEyeMapControl.ActiveView.Refresh(); } }

private void EagleEyeMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) {

if (EagleEyeMapControl.Map.LayerCount > 0) {

//按下鼠标左键移动矩形框 if (e.button == 1) {

//如果指针落在鹰眼的矩形框中,标记可移动

if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax) {

bCanDrag = true; }

pMoveRectPoint = new PointClass();

pMoveRectPoint.PutCoords(e.mapX, e.mapY); //记录点击的第一个点的坐标 }

//按下鼠标右键绘制矩形框 else if (e.button == 2) {

IEnvelope pEnvelope = EagleEyeMapControl.TrackRectangle();

IPoint pTempPoint = new PointClass();

pTempPoint.PutCoords(pEnvelope.XMin + pEnvelope.Width / 2, pEnvelope.YMin + pEnvelope.Height / 2); mainMapControl.Extent = pEnvelope;

//矩形框的高宽和数据试图的高宽不一定成正比,这里做一个中心调整

mainMapControl.CenterAt(pTempPoint); } } }

//移动矩形框

private void EagleEyeMapControl_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e) {

if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax) {

//如果鼠标移动到矩形框中,鼠标换成小手,表示可以拖动 EagleEyeMapControl.MousePointer =

esriControlsMousePointer.esriPointerHand;

if (e.button == 2) //如果在内部按下鼠标右键,将鼠标演示设置为默认样式 {

EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault; } } else {

//在其他位置将鼠标设为默认的样式 EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault; }

if (bCanDrag) {

double Dx, Dy; //记录鼠标移动的距离 Dx = e.mapX - pMoveRectPoint.X; Dy = e.mapY - pMoveRectPoint.Y;

pEnv.Offset(Dx, Dy); //根据偏移量更改 pEnv 位置 pMoveRectPoint.PutCoords(e.mapX, e.mapY); DrawRectangle(pEnv);

mainMapControl.Extent = pEnv; } }

private void EagleEyeMapControl_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e) {

if (e.button == 1 && pMoveRectPoint!=null) {

if (e.mapX == pMoveRectPoint.X && e.mapY == pMoveRectPoint.Y) {

mainMapControl.CenterAt(pMoveRectPoint); }

bCanDrag = false; } }

//绘制矩形框

private void mainMapControl_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e) {

//得到当前视图范围

pEnv = (IEnvelope)e.newEnvelope; DrawRectangle(pEnv); }

//在鹰眼地图上面画矩形框

private void DrawRectangle(IEnvelope pEnvelope) {

//在绘制前,清除鹰眼中之前绘制的矩形框 IGraphicsContainer pGraphicsContainer = EagleEyeMapControl.Map as IGraphicsContainer;

IActiveView pActiveView = pGraphicsContainer as IActiveView;

pGraphicsContainer.DeleteAllElements();

//得到当前视图范围

IRectangleElement pRectangleElement = new RectangleElementClass();

IElement pElement = pRectangleElement as IElement; pElement.Geometry = pEnvelope;

//设置矩形框(实质为中间透明度面)

IRgbColor pColor = new RgbColorClass(); pColor = GetRgbColor(255, 0, 0); pColor.Transparency = 255;

ILineSymbol pOutLine = new SimpleLineSymbolClass(); pOutLine.Width = 2;

pOutLine.Color = pColor;

IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); pColor = new RgbColorClass(); pColor.Transparency = 0; pFillSymbol.Color = pColor;

pFillSymbol.Outline = pOutLine; //向鹰眼中添加矩形框

IFillShapeElement pFillShapeElement = pElement as IFillShapeElement;

pFillShapeElement.Symbol = pFillSymbol;

pGraphicsContainer.AddElement((IElement)pFillShapeElement, 0);

//刷新

pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); }

#endregion

#region 布局视图与数据视图的同步 private void CopyToPageLayout() {

IObjectCopy pObjectCopy = new ObjectCopyClass(); object copyFromMap = mainMapControl.Map;

object copiedMap = pObjectCopy.Copy(copyFromMap);//复制地图到copiedMap中

object copyToMap =

axPageLayoutControl.ActiveView.FocusMap;

pObjectCopy.Overwrite(copiedMap, ref copyToMap); //复制地图

axPageLayoutControl.ActiveView.Refresh(); }

private void mainMapControl_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e) {

IActiveView pActiveView =

(IActiveView)axPageLayoutControl.ActiveView.FocusMap;

IDisplayTransformation displayTransformation = pActiveView.ScreenDisplay.DisplayTransformation; displayTransformation.VisibleBounds = mainMapControl.Extent;

axPageLayoutControl.ActiveView.Refresh(); CopyToPageLayout(); }

#endregion

#region TOC右键菜单的添加及功能实现

private Point pMoveLayerPoint= new Point(); //鼠标在TOC中左键按下时点的位置

//TOC右键菜单的添加

private void axTOCControl_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e) {

try {

if (e.button == 2) {

esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone; IBasicMap pMap = null; ILayer pLayer = null; object unk = null; object data = null;

axTOCControl.HitTest(e.x, e.y, ref pItem, ref pMap, ref pLayer, ref unk, ref data);

pTocFeatureLayer = pLayer as IFeatureLayer; if (pItem ==

esriTOCControlItem.esriTOCControlItemLayer && pTocFeatureLayer != null) {

btnLayerSel.Enabled = !pTocFeatureLayer.Selectable;

btnLayerUnSel.Enabled = pTocFeatureLayer.Selectable;

contextMenuStrip.Show(Control.MousePosition); } }

if (e.button == 1) {

esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone;

IBasicMap pMap = null; object unk = null; object data = null; ILayer pLayer = null;

axTOCControl.HitTest(e.x, e.y, ref pItem, ref pMap, ref pLayer, ref unk, ref data);

if (pLayer == null) return;

pMoveLayerPoint.PutCoords(e.x, e.y); if (pItem ==

esriTOCControlItem.esriTOCControlItemLayer) {

if (pLayer is IAnnotationSublayer) {

return; } else {

pMoveLayer = pLayer; } } } }

catch (Exception ex) {

MessageBox.Show(ex.Message);

} }

private void axTOCControl_OnMouseUp(object sender, ITOCControlEvents_OnMouseUpEvent e) {

try {

if (e.button == 1 && pMoveLayer != null && pMoveLayerPoint.Y != e.y) {

esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone;

IBasicMap pBasicMap = null; object unk = null; object data = null; ILayer pLayer = null; axTOCControl.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref pLayer, ref unk, ref data);

IMap pMap = mainMapControl.ActiveView.FocusMap; if (pItem ==

esriTOCControlItem.esriTOCControlItemLayer || pLayer != null) {

if (pMoveLayer != pLayer) {

ILayer pTempLayer;

//获得鼠标弹起时所在图层的索引号

for (int i = 0; i < pMap.LayerCount; i++) {

pTempLayer = pMap.get_Layer(i); if (pTempLayer == pLayer) {

toIndex = i; } } } }

//移动到最前面 else if (pItem ==

esriTOCControlItem.esriTOCControlItemMap) {

toIndex = 0; }

//移动到最后面 else if (pItem ==

esriTOCControlItem.esriTOCControlItemNone) {

toIndex = pMap.LayerCount - 1; }

pMap.MoveLayer(pMoveLayer, toIndex); mainMapControl.ActiveView.Refresh(); axTOCControl.Update(); } }

catch (Exception ex) {

MessageBox.Show(ex.Message); } }

// 属性表窗口

private void btnAttribute_Click(object sender, EventArgs e) {

if (frmAttribute == null || frmAttribute.IsDisposed) {

frmAttribute = new FormAtrribute(); }

frmAttribute.CurFeatureLayer = pTocFeatureLayer; frmAttribute.InitUI();

frmAttribute.ShowDialog(); }

//缩放到图层

private void btnZoomToLayer_Click(object sender, EventArgs e) {

if (pTocFeatureLayer == null) return;

(mainMapControl.Map as IActiveView).Extent = pTocFeatureLayer.AreaOfInterest; (mainMapControl.Map as

IActiveView).PartialRefresh(esriViewDrawPhase.esriViewGeography, null,