牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例
目录
一、开发环境与框架搭建
二、地图数据加载与文档管理
1. 加载地图文档(MXD)
2. 动态添加数据源
三、地图浏览与交互操作
1. 基础导航功能
2. 书签管理
3. 量测功能
四、要素选择与属性查询
1. 属性查询
2. 空间查询
五、视图同步与鹰眼实现
1. 鹰眼功能
2. 数据视图与布局视图同步
六、实战案例:城市POI查询系统
1.功能需求
2.实现步骤
七、常见问题与优化
一、开发环境与框架搭建
在开始地图操作前,需搭建基础的开发环境。推荐使用Visual Studio 2010+ArcGIS Engine 10.1+.NET Framework 4.0组合,并确保已安装ArcGIS Engine Runtime及许可证管理工具。
框架搭建步骤:
-
创建项目:新建C# Windows窗体应用程序,添加
MapControl
、ToolbarControl
、TOCControl
和LicenseControl
控件至窗体,并调整布局(如设置Dock属性)。 -
控件绑定:右击
ToolbarControl
,设置其Buddy属性为MapControl
,使工具栏与地图控件关联。 -
添加工具:通过ToolbarControl属性页添加
OpenDocument
、ZoomIn
、Pan
等内置命令,实现基础交互功能。
二、地图数据加载与文档管理
1. 加载地图文档(MXD)
通过MapControl.LoadMxFile()
方法加载预定义的地图文档,支持路径选择与异常处理:
axMapControl1.LoadMxFile(@"C:\Data\WorldMap.mxd");
此方法可保留地图的符号化样式与布局设置。
2. 动态添加数据源
支持多种数据格式的加载,如Shapefile、栅格数据、CAD文件等。以下为加载Shapefile的示例:
// 创建工作空间工厂
IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactoryClass();
// 打开工作空间
IWorkspace workspace = workspaceFactory.OpenFromFile(@"C:\Data\Shapefiles", 0);
// 获取要素类
IFeatureClass featureClass = (workspace as IFeatureWorkspace).OpenFeatureClass("Cities");
// 创建图层并添加到地图
ILayer layer = new FeatureLayerClass();
(layer as IFeatureLayer).FeatureClass = featureClass;
axMapControl1.AddLayer(layer);
此方法适用于动态数据集成场景。
三、地图浏览与交互操作
1. 基础导航功能
通过ToolbarControl
集成以下工具:
-
放大/缩小:使用
esriControls.ControlsMapZoomInTool和
esriControls.ControlsMapZoomOutTool
。 -
漫游:
esriControls.ControlsMapPanTool
。 -
全图显示:调用
MapControl.Extent = MapControl.FullExtent
。
2. 书签管理
通过IMapBookmarks
接口实现书签的添加与跳转:
// 添加书签
IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks;
bookmarks.AddBookmark("Beijing", axMapControl1.Extent);
// 跳转至书签
bookmarks.Bookmarks.get_Item("Beijing").ZoomTo();
3. 量测功能
实现距离与面积测量,需监听鼠标事件并计算几何属性:
// 距离测量示例
IPolyline line = new PolylineClass();
line.SpatialReference = axMapControl1.SpatialReference;
// 捕捉鼠标点击事件生成线段
double distance = (line as ICurve).Length;
MessageBox.Show($"距离:{distance} 米");
四、要素选择与属性查询
1. 属性查询
使用IQueryFilter
接口构建SQL查询条件:
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = "Population > 1000000";
IFeatureCursor cursor = featureClass.Search(queryFilter, false);
IFeature feature = cursor.NextFeature();
while (feature != null) {// 处理查询结果feature = cursor.NextFeature();
}
2. 空间查询
通过ISpatialFilter
实现空间关系筛选,如相交、包含等:
ISpatialFilter spatialFilter = new SpatialFilterClass();
spatialFilter.Geometry = selectedGeometry; // 用户绘制的几何图形
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
五、视图同步与鹰眼实现
1. 鹰眼功能
使用两个MapControl
控件,分别作为主视图和鹰眼视图。通过事件同步范围:
private void axMapControl1_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e) {// 更新鹰眼视图的指示框axMapControl2.Extent = axMapControl1.Extent;
}
2. 数据视图与布局视图同步
在PageLayoutControl
中同步MapControl
的地图内容,需共享同一IMap
对象:
axPageLayoutControl1.PageLayout.ReplaceMaps(axMapControl1.get_Maps());
六、实战案例:城市POI查询系统
1.功能需求
-
加载城市基础地图(含道路、行政区划)。
-
实现关键字搜索(如“医院”、“学校”)。
-
点击POI显示属性信息(名称、地址、类别)。
2.实现步骤
-
数据准备:Shapefile文件(城市道路、POI点数据)。
-
界面设计:添加搜索框、DataGridView控件用于结果显示。
-
核心代码:
// 关键字查询
private void btnSearch_Click(object sender, EventArgs e) {IFeatureLayer layer = axMapControl1.get_Layer(0) as IFeatureLayer;IQueryFilter filter = new QueryFilterClass();filter.WhereClause = $"NAME LIKE '%{txtKeyword.Text}%'";IFeatureCursor cursor = layer.FeatureClass.Search(filter, false);// 绑定结果至DataGridViewDataTable dt = new DataTable();dt.Columns.Add("名称");dt.Columns.Add("地址");IFeature feature = cursor.NextFeature();while (feature != null) {dt.Rows.Add(feature.get_Value(1), feature.get_Value(2));feature = cursor.NextFeature();}dataGridView1.DataSource = dt;
}
七、常见问题与优化
-
性能优化:大数据量时使用
IFeatureLayerDefinition
动态过滤可见要素。 -
坐标系转换:通过
IGeometry.Project()
方法统一数据空间参考。 -
异常处理:捕获
COMException
并处理许可失效或数据损坏问题。
源码与数据下载:参考ArcGIS Engine开发实例教程获取完整代码及测试数据
以上为博主自己在学习过程中的学习笔记,用于学习和交流,欢迎大家批评纠正。
希望你越来越优秀!!