ArcGIS Engine 基礎功能(一)
阿新 • • 發佈:2019-02-18
這裡放的程式碼都是目前感覺比較簡潔的,可能會有缺陷,但是還是效率優先吧,以後有問題再補充。
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這麼這麼複雜)
- 選擇要素
- 查詢
- 空間分析