牟乃夏《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.pswp.cn/news/903224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903224.shtml
英文地址,請注明出處:http://en.pswp.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;主節點掛了之…