C#开发实验--卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例

news2024/12/24 10:12:33

前不久在公众号GIS研发看到了暑假公益C#开发教程,教大家ArcGIS Engine开发。

想到了自己本科阶段也学习了C#开发和AE开发,学习了使用C#添加空间等,进行卫星星历的计算、空间直角坐标和大地坐标的转换、ArcGIS Engine开发的简单实例。

下面的ArcGIS Engine实验主要的内容包括:为程序加载工具栏,添加相应的控件,运用treeview控件显示图形要素的基本属性;编程实现打开、保存、另存地图文档的方法;运用工具栏工具进行地图要素的添加;运用状态栏控件实现地图坐标信息的显示。

总体步骤:

1、 新建项目,添加相应的控件、窗体、类库、命名空间,并按照实验指导修改属性;

2、 添加初始化代码,为窗体添加事件,并为事件添加代码;

3、 为初始化工具栏添加按钮代码;

4、 为第二个窗体添加命名空间与程序代码;

5、 为第一个窗体的axMapControl1与axMapControl1添加相应的事件;

6、 添加代码到如图1所示位置;

7、 为工具栏添加按钮;

8、 按要求添加菜单控件与statusStrip控件;

9、 添加类库或修改类库的嵌入式操作类型为false,添加命名空间;

10、具体代码与实验结果。

详细步骤:

1、新建项目,添加相应的控件、窗体、类库、命名空间,并按照实验指导修改属性。

(1)新建一个C#工程项目,并为默认建立的窗体分别添加“ToolBarControl”“TOCControl”“MapControl”“LicenseControl”控件。执行与MapControl控件的绑定操作,并通过“dock”属性排序;

(2)添加菜单控件,分别修改其text属性为:“图查属性”,其name属性为“PropertyViaFeature”。

(3)为工程添加windows类型的窗体,设其name属性为“formProperty”;在工具箱中“windows所有窗体”中找到“treeview”控件,双击添加到窗体中,同时设其dock属性为fill。

(4)添加ArcGIS的引用ESRI.ArcGIS.Geodatabase类库,并且在第一个窗体的代码窗口导入命名空间:

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;

并且把引用ESRI.ArcGIS.Geodatabase的嵌入式操作类型改为False。

2、添加初始化代码,为窗体添加事件,并为事件添加代码。

(1)在public partial class Form1 : Form代码下添加如下的初始化语句:

public IMapControl2 pMapControl;
public IToolbarControl2 pToolBarControl;
public ITOCControl2 pTocControl;
public bool toolSelected = false;   

(2)为窗体添加load事件,并添加以下代码:

private void Form1_Load(object sender, EventArgs e)
{
pMapControl = (IMapControl2)axMapControl1.Object;
pTocControl = (ITOCControl2)axTOCControl1.Object;
pToolBarControl = (IToolbarControl2)axToolbarControl1.Object;
pToolBarControl.SetBuddyControl(pMapControl);
pTocControl.SetBuddyControl(pMapControl);
CreateToolBarItem();
}

3、 为初始化工具栏添加按钮代码。

为初始化工具栏建立添加按钮的过程:

private void CreateToolBarItem() {

pToolBarControl.AddItem("esriControls.ControlsOpenDocCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsAddDataCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapZoomInTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapZoomOutTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapZoomInFixedCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapZoomOutFixedCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapPanTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapFullExtentCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapZoomToLastExtentBackCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapZoomToLastExtentForwardCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsSelectFeaturesTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsClearSelectionCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsSelectTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapIdentifyTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapFindCommand", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

pToolBarControl.AddItem("esriControls.ControlsMapMeasureTool", -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

4、 为第二个窗体添加命名空间与程序代码。

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase; 
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;

在 public partial class frmProperty : Form下添加如下代码:

public IMapControl2 pMapControl;
public IEnvelope pEnvelop;
public frmProperty(IMapControl2 pFMapControl, IEnvelope pFEnvelop)
{
    InitializeComponent();
    pMapControl = pFMapControl;
    pEnvelop = pFEnvelop;
}
public void SelectPropertyViaFeature()
{
   treeView1.Nodes.Clear();
   for (int i = 0; i < pMapControl.Map.LayerCount; i++)
      {
        IFeatureLayer pFeatureLayer = (IFeatureLayer)pMapControl.Map.get_Layer(i);
        IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
        ISpatialFilter pSpatialFilter = new SpatialFilterClass();
        pSpatialFilter.Geometry = pEnvelop;
        pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
        pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
        IFields pFields = pFeatureClass.Fields;
        IFeatureCursor pFeatureCursor = pFeatureClass.Search(pSpatialFilter, false);
        TreeNode nodeParent;
        IFeature pFeature;
        pFeature = pFeatureCursor.NextFeature();        
        nodeParent = treeView1.Nodes.Add(pFeatureLayer.Name.ToString());
        while (pFeature != null)
         {
            TreeNode nodeSon;
           for (int j = 0; j < pFields.FieldCount; j++)
           {
              string fldValue;
              string fldName;
              fldName = pFields.get_Field(j).Name;
              if (fldName == "Shape")
              {
                fldValue = Convert.ToString(pFeature.Shape.GeometryType);
              }
              else
              fldValue = Convert.ToString(pFeature.get_Value(j));
              nodeSon = nodeParent.Nodes.Add(fldValue);
            }
            pMapControl.Map.SelectFeature(pFeatureLayer, pFeature);
            pFeature = pFeatureCursor.NextFeature();
          }
      }

      IActiveView pActiveView;
      pActiveView = (IActiveView)pMapControl.Map;
      pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
    }
    private void frmProperty_Load(object sender, EventArgs e)
    {
      SelectPropertyViaFeature();
    }

5、 为第一个窗体的axMapControl1与axMapControl1添加相应的事件。

Private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
    {
      if (e.button == 1 && toolSelected == true)
      {
        IEnvelope pEnvelop = pMapControl.TrackRectangle();
        pMapControl.Map.ClearSelection();
        frmProperty fProperty = new frmProperty(pMapControl, pEnvelop);
        fProperty.Show();
      }
    }

6、 添加代码到如图1所示位置。

在这里插入图片描述
**关注公众号后,回复:C#实验**

但是老师教程将代码添加到了图2位置中,我一开始是添加错了,后来也能运行。再看下图,没有相应的语句产生。所以也可以当有错误提示时,将该句复制过去。

7、 为工具栏添加按钮。

为工具栏添加如下控件

8、 按要求添加菜单控件与statusStrip控件。

(1)添加菜单控件,依次添加菜单栏的主菜单text属性为“文件”,其name属性为“menuFile”,依次添加子菜单,其text属性分别为“打开文档”,“保存文档”,“另存为….”,“退出”,其name属性分别为“menuOpenDoc”,“menuSaveDoc”,“menuSaveAsDoc”,“menuExitApp”。

(2) 打开工具箱,通过添加选项,添加statusBar控件,并双击添加到窗体上

9、 添加类库或修改类库的嵌入式操作类型为false,添加命名空间。

添加ArcGIS的引用ESRI.ArcGIS.GeodatabaseESRI.ArcGIS.ADF类库,修改嵌入式操作类型,在第一个窗体的代码窗口导入命名空间:

using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.SystemUI;

代码:

Form1.cs

Program.cs

结果图:

打开地图文档
图层属性查询
工具条的使用
文档另存

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

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

相关文章

数据结构与算法--插入排序与选择排序

文章目录 回顾提要排序基本概念排序的分类排序算法的稳定性排序算法的性能指标内排序 排序方法直接插入排序直接插入排序的要点直接插入排序的实现直接插入排序性能分析直接插入排序的适用情景 简单选择排序简单选择排序的要点简单选择排序的执行过程简单选择排序的实现简单选择…

虚幻5|布料模拟

打开骨骼网格体 1.Mass Prooerties 如果给角色施加风力&#xff0c;密度越大越难飘&#xff0c;相反密度越小飘动浮度也小 2.Material Proerties Edge Stiffness,对衣服的折痕处的调整&#xff0c;其值越大就越能维持原本的折痕&#xff0c;相反折痕就会变小&#xff0c;但…

【Mudo】实战项目之应用层模块

文章目录 前言正文1. Util1.1 File1.2 Url1.3 Str1.4 Infor 2. Http2.1 Request2.2 Response2.3 Context2.4 Server 尾序 前言 在上一篇文章当中&#xff0c;博主从代码的层面介绍了服务器模块的实现&#xff0c;最终封装出了一个传输层的TcpServer模块&#xff0c;那么在本篇…

中国篆刻艺术孙溟㠭凿木《未来之门》

孙溟㠭凿木《未来之门》 每人都有着自己对未来的期盼&#xff0c;未来并不遥远&#xff0c;下一秒就是未来&#xff0c;当下的一切好和一切的恶是暂时的&#xff0c;都会随着时间一秒一秒过去&#xff0c;走向未来&#xff0c;希望每人都能尽早打开未来之门&#xff0c;到达自己…

Arduino开源四足蜘蛛机器人制作教程

视频教程&#xff1a;手把手叫你做四足蜘蛛机器人——1零件介绍_哔哩哔哩_bilibili 一、项目介绍 1.1 项目介绍 Arduino主控&#xff0c;图形化编程&#xff0c;趣味学习 Arduino nano开发板舵机扩展底板 4.8V可充电电池&#xff0c;支持Arduino C语言编程和米思齐图形化编程…

Linux os下借助Qt+libvlc是实现多路拉取摄像头rtsp数据流并实时显示

前言 应客户方的一个实际项目需求&#xff0c;需要在Linux操作系统下拉取多路摄像头的RTSP数据流并实时显示。 该项目的硬件平台基于飞腾2000四核处理器与景嘉微显卡&#xff0c;搭载了Kylin V10操作系统。 当前景嘉微GPU最多支持同时连接16路摄像头&#xff0c;拉取1920x108…

C++中二叉搜索树的底层原理及实现

小编在学习完二叉搜索树(SearchBinaryTree)之后觉得虽然二叉搜索树不是很难&#xff0c;但是它对于后面学习C中的AVL树和红黑树及map和set的封装都有重要的作用&#xff0c;因此小编今天带给大家二叉搜索树的原理及实现&#xff0c;话不多说&#xff0c;开始学习&#xff01;~~…

<Linux> git

在使用git之前&#xff0c;要先在linux中安装git yum list | grep git yum install -y 文件名 在第一次安装git时&#xff0c;需要进行下面的操作 git config --global user.email "你的邮箱名" git config --global user.name "你想要的名字" 1. git clon…

LeetCode 热题 HOT 100 (038/100)【宇宙最简单版】

【动态规划】No. 0337 打家劫舍III【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&a…

NGINX 常用内置变量

目录 $remote_addr 变量 $args 变量 $is_args 变量 $document_root 变量 $document_uri 变量 $host 变量 $limit_rate 变量 $remote_port 变量 $remote_port --显示客户端端口 $request_method 变量 --返回请求方式 $request_filename 变量 --返回请求实际路径 $request_uri…

eNSP 华为ACL配置

华为ACL配置 需求&#xff1a;公司保证财务部数据安全&#xff0c;禁止研发部门和互联网访问财务服务器&#xff0c;但总裁办不受影响 R1&#xff1a; <Huawei>sys [Huawei]sys Router1 [Router1]undo info-center enable [Router1]int g1/0/0 [Router1-GigabitEthern…

AI 工程应用 建筑表面检测及修复

文章目录 1 项目概述&#xff08;必写&#xff09;&#xff1a;2 技术方案与实施步骤2.1 模型选择&#xff08;必写&#xff09;&#xff1a;2.2 数据的构建&#xff1a;2.3 功能整合&#xff08;进阶&#xff09;&#xff1a; 3 实施步骤&#xff1a;3.1 环境搭建&#xff08;…

【Nginx】nginx的核心配置

1.nginx的文件启动 [rootNginx ~]# vim /lib/systemd/system/nginx.service [Unit] DescriptionThe NGINX HTTP and reverse proxy server Aftersyslog.target network-online.target remote-fs.target nss-lookup.target Wantsnetwork-online.target [Service] Typeforking P…

Python -- GUI图形界面编程—GUI编程实例 博主也在持续学习中[ 持续更新中!!! 欢迎白嫖 也求粉啊啊啊~ ]

本文介绍了GUI的图形界面编程&#xff08;相关视频是哔站上的应该搜这个题目就能找到&#xff09;&#xff0c;文章还是很基础的&#xff0c;反正我是小白从0开始&#xff0c;主要的结构tinkter库、重要组件简介&#xff08;这个不用死记硬背 用的时候再说&#xff09;、Label&…

诊断知识:DTC Status中pending位的使用

文章目录 前言OCC6的定义pending位的定义pending位的使用总结 前言 上一篇文章介绍了ConfirmedDTCLimit的使用&#xff0c;诊断知识&#xff1a;ConfirmedDTCLimit的使用&#xff0c;后面发现理解还是有问题的&#xff0c;其实原来的图画的没有问题&#xff0c;之前对OCC6理解…

【业余玩儿AI】Day 1

【业余玩儿AI】Day 1 实际是昨天的事儿了&#xff0c;记录以下 魔法 不管三七二十一&#xff0c;重新启用魔法&#xff0c;没有魔法这些事情肯定是不行滴 种子任务 把收藏了两个星期的短视频都看了一遍&#xff0c;挑了个种子任务&#xff0c;《本地部署Llama3.1》&#x…

【Web IDE】WebContainer容器在浏览器中启动运行nodejs并使用vite启动项目

参考了文章WebContainer/api 基础&#xff08;Web IDE 技术探索 一&#xff09; 在浏览器中运行vite的vue3项目 示例站点 最终效果 主要流程 加载WebContainer》加载代码压缩包>解压代码压缩包》生成文件树》挂载文件树》pnpm安装依赖》启动项目 代码 <script setup…

Unity动画模块 之 3D模型导入基础设置Model页签

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 创建模型&#xff1a;在 Unity 外部创建模型 - Unity 手册 导入模型&#xff1a;将模型导入 Unity - Unity 手册 1.…

算法的学习笔记—二叉树的镜像(牛客JZ27)

&#x1f600;前言 在二叉树相关的问题中&#xff0c;镜像操作是一个非常经典且常见的题目。本文将通过一道具体的题目&#xff0c;详细讲解如何将一棵二叉树转换为它的镜像&#xff0c;并提供实现该操作的Java代码示例。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 …

【LVGL9学习笔记-2.添加百问网demo至工程模板】

添加百问网demo至工程模板 上一节使用codeBlocks运行了LVGL ,以此作为模板&#xff0c;将百问网的一些demo添加至该工程中 拷贝文件与配置文件至该目录下 打开工程包含文件 –>add files recusively –>add files 编译一次出现如下情况&#xff08;后面学到了再做解决…