牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例

目录

一、开发环境与框架搭建

二、地图数据加载与文档管理

[1. 加载地图文档(MXD)](#1. 加载地图文档(MXD))

[2. 动态添加数据源](#2. 动态添加数据源)

三、地图浏览与交互操作

[1. 基础导航功能](#1. 基础导航功能)

[2. 书签管理](#2. 书签管理)

[3. 量测功能](#3. 量测功能)

四、要素选择与属性查询

[1. 属性查询](#1. 属性查询)

[2. 空间查询](#2. 空间查询)

五、视图同步与鹰眼实现

[1. 鹰眼功能](#1. 鹰眼功能)

[2. 数据视图与布局视图同步](#2. 数据视图与布局视图同步)

六、实战案例:城市POI查询系统

1.功能需求

2.实现步骤

七、常见问题与优化


一、开发环境与框架搭建

在开始地图操作前,需搭建基础的开发环境。推荐使用Visual Studio 2010+ArcGIS Engine 10.1+ .NET Framework 4.0组合,并确保已安装ArcGIS Engine Runtime及许可证管理工具。
框架搭建步骤

  1. 创建项目 :新建C# Windows窗体应用程序,添加MapControlToolbarControlTOCControlLicenseControl控件至窗体,并调整布局(如设置Dock属性)。

  2. 控件绑定 :右击ToolbarControl,设置其Buddy属性为MapControl,使工具栏与地图控件关联。

  3. 添加工具 :通过ToolbarControl属性页添加OpenDocumentZoomInPan等内置命令,实现基础交互功能。


二、地图数据加载与文档管理

1. 加载地图文档(MXD)

通过MapControl.LoadMxFile()方法加载预定义的地图文档,支持路径选择与异常处理:

cs 复制代码
axMapControl1.LoadMxFile(@"C:\Data\WorldMap.mxd");

此方法可保留地图的符号化样式与布局设置。

2. 动态添加数据源

支持多种数据格式的加载,如Shapefile、栅格数据、CAD文件等。以下为加载Shapefile的示例:

cs 复制代码
// 创建工作空间工厂
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.ControlsMapZoomInToolesriControls.ControlsMapZoomOutTool

  • 漫游esriControls.ControlsMapPanTool

  • 全图显示 :调用MapControl.Extent = MapControl.FullExtent

2. 书签管理

通过IMapBookmarks接口实现书签的添加与跳转:

cs 复制代码
// 添加书签
IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks;
bookmarks.AddBookmark("Beijing", axMapControl1.Extent);
// 跳转至书签
bookmarks.Bookmarks.get_Item("Beijing").ZoomTo();

3. 量测功能

实现距离与面积测量,需监听鼠标事件并计算几何属性:

cs 复制代码
// 距离测量示例
IPolyline line = new PolylineClass();
line.SpatialReference = axMapControl1.SpatialReference;
// 捕捉鼠标点击事件生成线段
double distance = (line as ICurve).Length;
MessageBox.Show($"距离:{distance} 米");

四、要素选择与属性查询

1. 属性查询

使用IQueryFilter接口构建SQL查询条件:

cs 复制代码
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实现空间关系筛选,如相交、包含等:

cs 复制代码
ISpatialFilter spatialFilter = new SpatialFilterClass();
spatialFilter.Geometry = selectedGeometry;  // 用户绘制的几何图形
spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

五、视图同步与鹰眼实现

1. 鹰眼功能

使用两个MapControl控件,分别作为主视图和鹰眼视图。通过事件同步范围:

cs 复制代码
private void axMapControl1_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e) {
    // 更新鹰眼视图的指示框
    axMapControl2.Extent = axMapControl1.Extent;
}

2. 数据视图与布局视图同步

PageLayoutControl中同步MapControl的地图内容,需共享同一IMap对象:

cs 复制代码
axPageLayoutControl1.PageLayout.ReplaceMaps(axMapControl1.get_Maps());

六、实战案例:城市POI查询系统

1.功能需求

  1. 加载城市基础地图(含道路、行政区划)。

  2. 实现关键字搜索(如"医院"、"学校")。

  3. 点击POI显示属性信息(名称、地址、类别)。

2.实现步骤

  1. 数据准备:Shapefile文件(城市道路、POI点数据)。

  2. 界面设计:添加搜索框、DataGridView控件用于结果显示。

  3. 核心代码

cs 复制代码
// 关键字查询
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);
    // 绑定结果至DataGridView
    DataTable 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;
}

七、常见问题与优化

  1. 性能优化 :大数据量时使用IFeatureLayerDefinition动态过滤可见要素。

  2. 坐标系转换 :通过IGeometry.Project()方法统一数据空间参考。

  3. 异常处理 :捕获COMException并处理许可失效或数据损坏问题。


源码与数据下载 :参考ArcGIS Engine开发实例教程获取完整代码及测试数据


以上为博主自己在学习过程中的学习笔记,用于学习和交流,欢迎大家批评纠正。

希望你越来越优秀!!

相关推荐
G探险者3 分钟前
《如何在 Spring 中实现 MQ 消息的自动重连:监听与发送双通道策略》
java·开发语言·rpc
weixin_437398211 小时前
转Go学习笔记
linux·服务器·开发语言·后端·架构·golang
StrongerIrene1 小时前
rs build 的process.env的值undefined解决方案
开发语言·javascript·ecmascript
风逸hhh1 小时前
python打卡day58@浙大疏锦行
开发语言·python
茫忙然1 小时前
【WEB】Polar靶场 6-10题 详细笔记
笔记
eric*16881 小时前
尚硅谷张天禹老师课程配套笔记
前端·vue.js·笔记·vue·尚硅谷·张天禹·尚硅谷张天禹
让我们一起加油好吗1 小时前
【C++】list 简介与模拟实现(详解)
开发语言·c++·visualstudio·stl·list
Q_970956391 小时前
java+vue+SpringBoo足球社区管理系统(程序+数据库+报告+部署教程+答辩指导)
java·开发语言·数据库
为了更好的明天而战2 小时前
Java 中的 ArrayList 和 LinkedList 区别详解(源码级理解)
java·开发语言
Allen_LVyingbo2 小时前
数智读书笔记系列035《未来医疗:医疗4.0引领第四次医疗产业变革》
人工智能·经验分享·笔记·健康医疗