牟乃夏《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及许可证管理工具。
框架搭建步骤

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

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

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


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

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.ControlsMapZoomInToolesriControls.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.功能需求

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

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

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

2.实现步骤

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

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

  3. 核心代码

// 关键字查询
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;
}

七、常见问题与优化

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

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

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


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


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

希望你越来越优秀!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt指ModbusTcp协议的使用

Modbus 是一套通信“语言”(协议),而 RS485 / RS232 / TCP 是通信“管道”(物理接口)。 编写modubusTcp程序,避免不了调试,首先用到的两个工具助手 poll是主机,slave是从机。主机也就是发送数据…

探索大语言模型(LLM):自监督学习——从数据内在规律中解锁AI的“自学”密码

文章目录 自监督学习:从数据内在规律中解锁AI的“自学”密码一、自监督学习的技术内核:用数据“自问自答”1. 语言建模:预测下一个单词2. 掩码语言模型(MLM):填补文本空缺3. 句子顺序预测(SOP&a…

CentOS7.9安装Python 3.10.11并包含OpenSSL1.1.1t

1. 安装编译 Python 所需的依赖包 yum -y install gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel wget2. 安装 OpenSSL 1.1.1 或更新版本 (自定义路径安装的 OpenSSL 1.1.1 不会影响系统原有的…

qt事件过滤与传递机制

当点击 QLabel 时,正常情况下并不会直接触发 MyWidget 的 mousePressEvent 函数,原因在于事件的传递机制和事件过滤器的存在。下面详细分析这个过程: 事件传递机制 在 Qt 里,事件的传递是从子控件往父控件冒泡的。不过&#xff…

ubuntu 安装ollama后,如何让外网访问?

官网下载linux版本:https://ollama.com/download/linux 1、一键安装和运行 curl -fsSL https://ollama.com/install.sh | sh 2、下载和启动deepseek-r1大模型 ollama run deepseek-r1 这种方式的ollama是systemd形式的服务,会随即启动。默认开启了 …

kotlin与MVVM结合使用总结(三)

1. MVVM 架构详细介绍及源码层面理解 整体架构 MVVM(Model - View - ViewModel)架构是为了解决视图和数据模型之间的耦合问题而设计的。它通过引入 ViewModel 作为中间层,实现了视图和数据的分离,提高了代码的可维护性和可测试性…

A系统使用iframe嵌套B系统时登录跨域问题!

我这边两个项目都是独立的,问题是做了跨域配置之后点击登录接口调用成功但是页面没有跳转进去 显示以下报错 这个错误明确指出了问题的核心原因:由于跨站点Cookie设置未正确声明SameSiteNone,导致浏览器拦截了Cookie。这是现代浏览器&#x…

消息唯一ID算法参考

VUE // src/utils/idGenerator.js/*** 雪花算法风格的 ID 生成器**//*** 前缀 w代表web端,m代表手机端**/ const DEFAULT_PREFIX = w; const DEFAULT_TOTAL_LENGTH = 16; const CHARS

《WebGIS之Vue零基础教程》(5)计算属性与侦听器

1 计算属性 1) 什么是计算属性 :::info 计算属性就是基于现有属性计算后的属性 ::: 2) 计算属性的作用 计算属性用于对原始数据的再次加工 3) 案例 :::warning **需求** 实现如下效果 ::: 使用表达式实现 html Document 请输入一个字符串: 反转后的字符串: {{msg.split(…

洞悉 NGINX ngx_http_access_module基于 IP 的访问控制实战指南

一、模块概述 ngx_http_access_module 是 NGINX 核心模块之一,用于基于客户端 IP 地址或 UNIX 域套接字限制访问。它通过简单的 allow/deny 规则,对请求进行最先匹配原则的过滤。与基于密码(auth_basic)、子请求(auth…

数据中台-数据质量管理系统:从架构到实战

一、数据质量管理系统核心优势解析​ ​ (一)可视化驱动的敏捷数据治理​ 在数据治理的复杂流程中,Kettle 的 Spoon 图形化界面堪称一把利器,为数据工程师们带来了前所未有的便捷体验。想象一下,你不再需要花费大量时间和精力去编写冗长且复杂的 SQL 脚本,只需通过简单…

数据分析之 商品价格分层之添加价格带

在分析货品数据的时候,我们会对商品的价格进行分层汇总,也叫价格带,​​ 一、价格带的定义​​ ​​价格带(Price Band)​​:将商品按价格区间划分(如0-50元、50-100元、100-200元等&#xff…

Maven 依赖范围(Scope)详解

Maven 依赖范围&#xff08;Scope&#xff09;详解 Maven 是一个强大的项目管理工具&#xff0c;广泛用于 Java 开发中构建、管理和部署应用程序。在使用 Maven 构建项目时&#xff0c;我们经常需要引入各种第三方库或框架作为项目的依赖项。通过在 pom.xml 文件中的 <depe…

vue3实现v-directive;vue3实现v-指令;v-directive不触发

文章目录 场景&#xff1a;问题&#xff1a;原因&#xff1a;‌ 场景&#xff1a; 列表的操作列有按钮&#xff0c;通过v-directive指令控制按钮显隐&#xff1b;首次触发了v-directive指令&#xff0c;控制按钮显隐正常&#xff1b;但是再次点击条件查询后&#xff0c;列表数…

数据结构【树和二叉树】

树和二叉树 前言1.树1.1树的概念和结构1.2树的相关术语1.3树的表示方法1.4 树形结构实际运用场景 2.二叉树2.1二叉树的概念和结构2.2二叉树具备以下特点&#xff1a;2.3二叉树分类 3.满二叉树4.完全二叉树5.二叉树性质6.附&#xff1a;树和二叉树图示 前言 欢迎莅临姜行运主页…

css面板视觉高度

css面板视觉高度 touch拖拽 在手机端有时候会存在实现touch上拉或者下拉的样式操作 此功能实现可以参考&#xff1a; https://blog.csdn.net/u012953777/article/details/147465162?spm1011.2415.3001.5331 面板视觉高度 前提需求&#xff1a; 1、展示端分为两部分&…

【Linux系统】详解Linux权限

文章目录 前言一、学习Linux权限的铺垫知识1.Linux的文件分类2.Linux的用户2.1 Linux下用户分类2.2 创建普通用户2.3 切换用户2.4 sudo&#xff08;提升权限的指令&#xff09; 二、Linux权限的概念以及修改方法1.权限的概念2.文件访问权限 和 访问者身份的相关修改&#xff08…

路由器的基础配置全解析:静态动态路由 + 华为 ENSP 命令大全

&#x1f680; 路由器的基础配置全解析&#xff1a;静态&动态路由 华为 ENSP 命令大全 &#x1f310; 路由器的基本概念&#x1f4cd; 静态路由配置&#x1f4e1; 动态路由协议&#xff1a;RIP、OSPF、BGP&#x1f5a5; 华为 ENSP 路由器命令大全&#x1f539; 路由器基本…

详细图解 Path-SAM2: Transfer SAM2 for digital pathology semantic segmentation

✨ 背景动机 数字病理中的语义分割&#xff08;semantic segmentation&#xff09;是非常关键的&#xff0c;比如肿瘤检测、组织分类等。SAM&#xff08;Segment Anything Model&#xff09;推动了通用分割的发展&#xff0c;但在病理图像上表现一般。 病理图像&#xff08;Pa…

初识Redis · 哨兵机制

目录 前言&#xff1a; 引入哨兵 模拟哨兵机制 配置docker环境 基于docker环境搭建哨兵环境 对比三种配置文件 编排主从节点和sentinel 主从节点 sentinel 模拟哨兵 前言&#xff1a; 在前文我们介绍了Redis的主从复制有一个最大的缺点就是&#xff0c;主节点挂了之…