ArcGIS二次开发——地图居中显示
一、创建 Engine 应用程序
1.启动 Visual Studio 2012,从“文件”->“新建”选中“项目”,在弹出的新建项目对话框中,首先选中Visual C#,然后在模板中选中 Windows 应用窗体程序,为该程序命名为“地图查询”,然后通过点击“浏览”按钮,指定一个存放工程文件的路径,点击“确定”。
2.创建 MapViewer 工程后,该工程会自动创建一个名称为Form1 的窗体,如下
4.拖动窗体右下角,使窗体变大,点击左侧的“工具箱”。在弹出的工具箱中找到“ArcGIS Windows Forms”选项卡,点击选项卡前面的三角,展开该选项卡,双击或者拖动“ToolBarControl”到窗体上。
5.在 MapViewer 窗体界面上选中 ToolBarControl 控件,在属性窗口中找到“Dock”属性,点击下拉按钮,如下图选中“Top”部分。
6.同理和
ToolBarControl 的操作一样,依次将 TOCControl 控件和MapControl 控件拖到窗体上,选中该控件,在属性窗口中找到“Dock”属性,选中“Left”部分。将MapControl 控件的“Dock”属性,设为“Fill”,最后拖入 LicenseControl 控件。
至此 MapViewer 窗体的界面布局设置已经完成。窗体顶部是工具栏,左侧是图层列表,主工作区是地图控件。
7.这时我们需要在 ToolBarControl 上添加 Engine 提供的工具和命令。右键点击窗体上的 ToolbarControl 控件,选择“属性”。在弹出的对话框中,先设置“Buddy
Control”属性为axMapControl1,也就是说我们执行 ToolBarControl 上的工具时,是对 MapControl 进行操作的。然后点击“Items”选项卡。在“Items”选项卡中,点击“Add”按钮。该窗体中列出了所有 Engine 提供的,在 ToolBarControl上可以直接加载使用的工具和命令,这里我们只使用部分工具。在左边的分类中选中“Generic”,双击右侧的“Open”命令。这样“Open”命令加入到工具栏里面了。在左侧依次选中“Map Inquiry”和“Map Navigation”,把“Identify”,“Zoom In”,“Zoom Out”等工具添加到工具栏中。添加完成后效果如下,可以拖动更改这些工具的顺序,点击“OK”按钮。
8.在窗体上右键点击 TOCControl,选择“属性”菜单。设置“Buddy Control”属性为“axMapControl1”,也就是TOC 图层列表中显示的是 MapControl 中的图层。点击“OK”。右键点击 LicenseControl,点击“属性”菜单。浏览弹出的对话框,其中ArcGIS
Engine 已经选中,如果需要其它扩展模块的许可,可以在右侧选中对应的复选框,点击“OK”按钮。
9.开始调试程序,这时会弹出一个错误“ArcGIS version not specified. You must call RuntimeManager.Bind
before creating any ArcGIS components.”,提示我们需要使用 Bind 绑定 ArcGIS 产品。这是因为在
ArcGIS 10.0 版本开始,产品架构发生了一些变化,在开发的时候首先要做的就是绑定产品,绑定的位置放在使用 ArcObjects 对象之前,只需要添加如下代码:ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine)。
10.再次运行程序,即可成功。点击工具栏上的“Open”按钮。打开地图文件,地图文档中包含的图层就加载到了地图控件和图层列表控件中。
二、添加数据
加载地图文档
在 VS2012 的工具箱中,展开菜单和工具栏,双击 MenuStrip控件,这样就在窗体上添加了一个菜单栏。在菜单上点击,输入“File”作为菜单的名称,在其下拉框中点击,输入“Open”菜单项和“Add Data”菜单项。
选中“Open”菜单项,在属性框中点击“Events”按钮,在事件列表中双击“Click”事件或者直接双击该菜单项。自动生成的事件处理方法如下图所示,我们将在方法内输入处理代码。
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog.Filter = "Map
Document(.mxd)|.mxd";
pOpenFileDialog.InitialDirectory = @"E:\Data";
pOpenFileDialog.Multiselect = false;
pOpenFileDialog.Title = "Open Map
Document";
if (pOpenFileDialog.ShowDialog() == DialogResult.OK)
{
string docName = pOpenFileDialog.FileName;
if (axMapControl1.CheckMxFile(docName))
{
axMapControl1.LoadMxFile(docName);
}
}
添加要素类(从数据源角度)
这里需要注意,从.NET
Framework 4.0 平台开始,Reference 属性中新增加了 Embed Interop Types(嵌入互操作类型)选项,需要把ArcGIS相关的引用的嵌入互操作类型设为“False”,否则会报错。
using System.IO;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Controls;
在 Click 事件处理方法中添加代码。
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog.Filter = "shapefile 文件(*.shp)|*.shp";
pOpenFileDialog.InitialDirectory = @"C:\";
pOpenFileDialog.Multiselect = false;
DialogResult pDialogResult =
pOpenFileDialog.ShowDialog();
if (pDialogResult != DialogResult.OK)
return;
string pPath = pOpenFileDialog.FileName;
string pFolder = System.IO.Path.GetDirectoryName(pPath);
string pFileName = System.IO.Path.GetFileName(pPath);
axMapControl1.AddShapeFile(pFolder,
pFileName);
axMapControl1.ActiveView.Refresh();
运行程序,点击“Add Data”菜单项,在弹出的对话框中,选择任意一个 shp 文件,点击“Open”,即可把
shp 文件加载到地图控件中。
属性查询
1.添加控件,在窗体中添加一个Label和一个TextBox,将Label控件的“Text”属性修改为“省名”,TextBox控件的Name属性修改为CityName。
2在控件TextBox的事件中选择KeyUp,在KeyUp事件中添加以下代码:
if (e.KeyCode == Keys.Enter)
{
IFeatureLayer pFeatureLayer;
IFeatureCursor pFeatureCursor;
IQueryFilter pQueryFilter;
IFeature pFeature;
pFeatureLayer = this.axMapControl1.Map.get_Layer(0) as IFeatureLayer;
if (pFeatureLayer.Name != "chinaprj")
return;
this.axMapControl1.Map.ClearSelection();
pQueryFilter = new QueryFilterClass();
pQueryFilter.WhereClause = "NAME='" + CityName.Text + "'";
pFeatureCursor =
pFeatureLayer.Search(pQueryFilter, true);
pFeature =
pFeatureCursor.NextFeature();
if (pFeature != null)
{
this.axMapControl1.Map.SelectFeature(pFeatureLayer,
pFeature);
this.axMapControl1.Extent =
pFeature.Shape.Envelope;
}
else
{
MessageBox.Show("没有找到" + CityName.Text);
}
}
实验结果
运行程序后,添加数据,分别在编辑框中输入“湖北省”和“湖南省”及“湖北”。可以实现基本的Name属性查询及查询结果居中显示,但是不支持模糊查询。