ArcGIS Engine:实现Shp/Mxd数据的加载、图层的简单查询

2023-10-04 09:04

本文主要是介绍ArcGIS Engine:实现Shp/Mxd数据的加载、图层的简单查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本博客参考:BiliBili UP主 <羊羊旸> : Arcgis Engine学习

目录

01 加载控件以及控件的基本信息等调整

02 编写 <菜单-地图控件> 中各个子工具的代码 

2.1 加载Shapefile数据-代码

2.2 加载地图文档数据-代码

2.3 获取图层数量-代码

2.4 获取图层名称-代码

2.5 获取图层索引-代码

2.6 完整代码

03 简单演示


01 加载控件以及控件的基本信息等调整

下面是整个软件的布局:

02 编写 <菜单-地图控件> 中各个子工具的代码 

2.1 加载Shapefile数据-代码

双击进入<加载Shapefile数据>的点击事件中(实际上就是点击了该工具会发生什么事情,这一部分事情放在一个函数中让你自由发挥)

using System.IO;  // 与路径的处理相关(在本程序中), 为了使用其中的Path类(其是静态的)

 使用下面中的Path类需要添加上述引用: 

private void 加载Shapefile数据ToolStripMenuItem_Click(object sender, EventArgs e)
{// 创建一个文件对话框实例获取用户选择的Shp文件OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Title = "加载Shapefile数据";  // 文件对话框的标题openFileDialog.Filter = "Shapefile(*.shp)|*.shp|asa|*.*";  // |前面为描述性信息, 后面为通配符openFileDialog.Multiselect = false;  // 不允许选择多个文件if (openFileDialog.ShowDialog() == DialogResult.OK)  // 其中openFileDialog.ShowDialog()执行打开文件对话框并返回相关值, 这里判断是否为{string shapefile_path = openFileDialog.FileName;try{string shapefile_dir = Path.GetDirectoryName(shapefile_path);string shapefile_name = Path.GetFileName(shapefile_path);MainMapControl.AddShapeFile(shapefile_dir, shapefile_name);// 上面分别传入Shp文件所在文件夹的目录和Shp文件的文件名.MessageBox.Show(string.Format("加载Shapefile数据成功:\n {0}", shapefile_name), "加载成功", MessageBoxButtons.OK, MessageBoxIcon.Information);}catch (Exception ex){//MessageBox.Show($"加载Shapefile数据成失败: {ex.Message}", "");MessageBox.Show(string.Format("加载Shapefile数据失败:\n {0}", ex.Message), "加载失败", MessageBoxButtons.OK, MessageBoxIcon.Error);}}
}

前面都比较常规, 首先先实例化一个OpenFileDialog类用于创建一个文件对话窗口,类似下面这种 :

这样用户才可以选择想要的文件,但是这个不需要我们自己从头去弄,调用人家写好的就好了。

发现了一个这个MessageBox.Show:
传入四个参数(也可以就传入一个字符串,其他都不管等等也可行,看重载方法有没有写)

分别是弹出窗口的内容、弹出窗口标题或者说是窗口的说明性描述性信息、弹出窗口的按钮(我加入了一个OK按钮)、弹出窗口的图标(我这里是如果正常加载就是普通信息的图标,否则是错误的图标),如下:

2.2 加载地图文档数据-代码

private void 加载地图文档数据ToolStripMenuItem_Click(object sender, EventArgs e)
{OpenFileDialog openFileDialog = new OpenFileDialog();  // 实例化一个文件对话框对象openFileDialog.Title = "加载地图文档";  // 文件对话框的标题openFileDialog.Filter = "地图文档(.mxd)|*.mxd";  // 前面为描述性信息, 后面为通配符if (openFileDialog.ShowDialog() == DialogResult.OK)  // 文件对话框打开, 并判断文件对话框是否已经选择了文件(==OK){string mxd_path = openFileDialog.FileName;  // 获取文件对话框所选择的文件的名称try{string mxd_name = Path.GetFileName(mxd_path);MainMapControl.LoadMxFile(mxd_path);MessageBox.Show(string.Format("加载地图文档成功:\n {0}", mxd_name), "加载成功", MessageBoxButtons.OK, MessageBoxIcon.Information);// 在这里调用获取图层数量的函数获取图层数量ToolStripMenuItem_Click(sender, e);}catch (Exception ex){MessageBox.Show(string.Format("加载地图文档失败:\n {0}", ex.Message), "加载失败", MessageBoxButtons.OK, MessageBoxIcon.Error);}}
}

与前面类似,这里不再详细描述,对于其中的

// 在这里调用获取图层数量的函数
获取图层数量ToolStripMenuItem_Click(sender, e);

请看后续代码中该函数的编写.

2.3 获取图层数量-代码

private void 获取图层数量ToolStripMenuItem_Click(object sender, EventArgs e)
{int layers_amount = MainMapControl.LayerCount;  // 获取当前显示在Mapcontrol中的所有要素数量textBox.Text = string.Format("当前图层数量: {0}", layers_amount);
}

2.4 获取图层名称-代码

此处使用ILayer类需要添加引用:

using ESRI.ArcGIS.Carto;  // 用于地图和图层操作,此处为使用其中的ILayer类
private void 获取图层名称ToolStripMenuItem_Click(object sender, EventArgs e)
{//if (int.TryParse(textBox.Text, out int layer_ix))int layer_ix;if (int.TryParse(textBox.Text, out layer_ix)){ILayer layer = MainMapControl.get_Layer(layer_ix);textBox.Text = string.Format("索引为{0}的图层名称为: {1}", layer_ix, layer.Name);}else{MessageBox.Show(string.Format("不存在索引为: <{0}>\n 请重新输入", textBox.Text));textBox.Text = "";}}

2.5 获取图层索引-代码

private void 获取图层索引ToolStripMenuItem_Click(object sender, EventArgs e)
{bool layer_exist = false;for (int ix = 0; ix < MainMapControl.LayerCount; ix++){string layer_name = MainMapControl.get_Layer(ix).Name;if (layer_name == textBox.Text){textBox.Text = string.Format("当前图层 <{0}> 的索引为: {1}", layer_name, ix);layer_exist = true;break;}}if (!layer_exist){MessageBox.Show("当前图层 <{0}> 不存在, 请重新输入", textBox.Text);textBox.Text = "";}}

2.6 完整代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;using System.IO;  // 与路径的处理相关(在本程序中), 为了使用其中的Path类(其是静态的)
using ESRI.ArcGIS.Carto;  // 为了使用其中的ILayer类namespace BasicBStation
{   public partial class Form1 : Form{public Form1(){ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);  // 确保ArcGIS版本清晰, 否则报错.InitializeComponent();}private void 加载Shapefile数据ToolStripMenuItem_Click(object sender, EventArgs e){// 创建一个文件对话框实例获取用户选择的Shp文件OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Title = "加载Shapefile数据";  // 文件对话框的标题openFileDialog.Filter = "Shapefile(*.shp)|*.shp|asa|*.*";  // |前面为描述性信息, 后面为通配符openFileDialog.Multiselect = false;  // 不允许选择多个文件if (openFileDialog.ShowDialog() == DialogResult.OK)  // 其中openFileDialog.ShowDialog()执行打开文件对话框并返回相关值, 这里判断是否为{string shapefile_path = openFileDialog.FileName;try{string shapefile_dir = Path.GetDirectoryName(shapefile_path);string shapefile_name = Path.GetFileName(shapefile_path);MainMapControl.AddShapeFile(shapefile_dir, shapefile_name);// 上面分别传入Shp文件所在文件夹的目录和Shp文件的文件名.MessageBox.Show(string.Format("加载Shapefile数据成功:\n {0}", shapefile_name), "加载成功", MessageBoxButtons.OK, MessageBoxIcon.Information);}catch (Exception ex){//MessageBox.Show($"加载Shapefile数据成失败: {ex.Message}", "");MessageBox.Show(string.Format("加载Shapefile数据失败:\n {0}", ex.Message), "加载失败", MessageBoxButtons.OK, MessageBoxIcon.Error);}}}private void 加载地图文档数据ToolStripMenuItem_Click(object sender, EventArgs e){OpenFileDialog openFileDialog = new OpenFileDialog();  // 实例化一个文件对话框对象openFileDialog.Title = "加载地图文档";  // 文件对话框的标题openFileDialog.Filter = "地图文档(.mxd)|*.mxd";  // 前面为描述性信息, 后面为通配符if (openFileDialog.ShowDialog() == DialogResult.OK)  // 文件对话框打开, 并判断文件对话框是否已经选择了文件(==OK){string mxd_path = openFileDialog.FileName;  // 获取文件对话框所选择的文件的名称try{string mxd_name = Path.GetFileName(mxd_path);MainMapControl.LoadMxFile(mxd_path);MessageBox.Show(string.Format("加载地图文档成功:\n {0}", mxd_name), "加载成功", MessageBoxButtons.OK, MessageBoxIcon.Information);// 在这里调用获取图层数量的函数获取图层数量ToolStripMenuItem_Click(sender, e);}catch (Exception ex){MessageBox.Show(string.Format("加载地图文档失败:\n {0}", ex.Message), "加载失败", MessageBoxButtons.OK, MessageBoxIcon.Error);}}}private void 获取图层数量ToolStripMenuItem_Click(object sender, EventArgs e){int layers_amount = MainMapControl.LayerCount;  // 获取当前显示在Mapcontrol中的所有要素数量textBox.Text = string.Format("当前图层数量: {0}", layers_amount);}private void 获取图层名称ToolStripMenuItem_Click(object sender, EventArgs e){//if (int.TryParse(textBox.Text, out int layer_ix))int layer_ix;if (int.TryParse(textBox.Text, out layer_ix)){ILayer layer = MainMapControl.get_Layer(layer_ix);textBox.Text = string.Format("索引为{0}的图层名称为: {1}", layer_ix, layer.Name);}else{MessageBox.Show(string.Format("不存在索引为: <{0}>\n 请重新输入", textBox.Text));textBox.Text = "";}}private void 获取图层索引ToolStripMenuItem_Click(object sender, EventArgs e){bool layer_exist = false;for (int ix = 0; ix < MainMapControl.LayerCount; ix++){string layer_name = MainMapControl.get_Layer(ix).Name;if (layer_name == textBox.Text){textBox.Text = string.Format("当前图层 <{0}> 的索引为: {1}", layer_name, ix);layer_exist = true;break;}}if (!layer_exist){MessageBox.Show("当前图层 <{0}> 不存在, 请重新输入", textBox.Text);textBox.Text = "";}}}
}

由于时间问题,实在没有精力一一说明代码的详情,可以多看视频(视频和本博客代码稍有出入) 。

03 简单演示

时间精力有限,其他功能不再一一演示。

这篇关于ArcGIS Engine:实现Shp/Mxd数据的加载、图层的简单查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1762

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各