AE開發環境配置教程 ArcEngine10.2設計與開發課程學習(作業二)——地圖、圖層加載及屬性訪問(附ArcGIS,Engine,VS等的安裝教程)

先說一句,我是新手,剛開課,剛學的C#和engine,剛寫的文章。下面的代碼質量肯定是經不住的,慢慢來,相信有很多和我一樣的未入門級的同志,沒事,都是這麼一竅不通過來的啦,我也是斷斷續續折騰了好幾天搞出來的一點東西。踩了很多坑,也都是很**的坑,建議還是瞭解一下控件和類的功能實現原理等等,那樣捋的舒服點,不然這裏搬一點那裏搬一點不怎麼好整,寫別的代碼也一樣吧,都是從看代碼到模仿的。不過沒有一點C#基礎的話看起來可能會有點喫力。

剛開始學AE,所以自然會遇到無語多的問題,網上搜索到一些資料,還有一些前輩們的博客文章,當然也有書本的,很想收藏但是太多不便於管理,而且都是零散的組合才能達到我做作業的目的(好吧,暴露了,我是以做課堂作業的形式學的,所以肯定很片面了,哈哈),好了好了,步入正題,第一次寫有點緊張,多多多多指教這是我的作業鏈接:https://pan.baidu.com/s/1m89Pw7fGspqyBw0oY9TNZQ提取碼:28uo 

這是本課程所有作業的鏈接:鏈接:https://pan.baidu.com/s/1PILIUfPORfoSRxSTYro6NQ 提取碼:iii8 複製這段內容後打開百度網盤手機App,操作更方便哦

目錄

安裝和部署(ArcGIS10.2+VS2012)

一、準備工作

二、實現思路



安裝和部署(ArcGIS10.2+VS2012)


首先是第一部分安裝和配置了,對應的VS和engine是這樣,vs2012-ArcGIS10.2,vs2013 / 2015-ArcGIS10.4,VS10.6-ArcGIS2015 / 2017,按需求吧,我自己的安裝是參考這位大哥的文章https://blog.csdn.net/qq_35117024/article/details/80131198?utm_source=blogxgwz0 ,很詳細,注意如果有安裝ArcGIS的話看一下破解文件service.txt,改成本地主機。安裝和配置完按照結尾步驟生成一個窗體瞧瞧,相信大家就迫不及待的打開窗體想開始幹活了。

首先大家最好設置一下,桌面右擊,顯示設置,屏幕分辨率爲100%,不然窗體會亂彪,大小定不下來,設置完應該要註銷一下才生效。


首先是關於界面,個人習慣,然後就是按鈕等等這個C#基本的控件,如下圖,控件的分類什麼和基本用法的自己可以去搜索一下,簡單來說就是一個屬性和一個事件。屬性就是控件在基本的顯示效果,在窗體中的位置和一些基本功能的設置,是不需要編寫代碼的;事件則是觸發之後執行相關操作,如按鈕點擊,鼠標移動,下拉選擇等等,選擇控件右擊屬性,右側屬性窗格中一個閃電標誌,就可以點進去寫代碼了,函數體什麼的它都會幫你生成後,淡然也可以按自己需求改動。

工具箱


EX02 關係編寫程序,獲取MapDocument 中的地圖,獲取地圖中的圖層,獲取圖層的基本屬性。

  1. 加載MapDocument,並獲取其包含的地圖--3個地圖。
  2. 獲取當前選中地圖所包含的Layer.Kauai,HI,非洲,歐洲分別有3個圖層
  3. 顯示選中圖層的屬性信息。

一、準備工作

進去正題,首先添加控件進去,依次將地圖控件,LicenseControl拖入窗體(窗體的大小可以自行拉伸),然後在Program.cs中加入下列代碼:

using ESRI.ArcGIS;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.esriSystem;
//引用,本作業程序要用到
有用到別的當然可以自行添加

        static void Main()
        {
            ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
        //engine控件的使用需加入此行
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }


然後這裏先可以在引用裏設置嵌入互操作,具體爲什麼後面瞭解了再作補充,右擊屬性,設置

嵌入互操作類型爲假,我爲了圖方便統一都設置了。

嵌入互操作設置


然後按題目要求把相關控件直接拖進去,在屬性裏設置好文本啊之類的,這裏只用到了拉布勒,按鈕COMBOX,文本框(有一個屬性MultLine可以設置是否爲多列文本),因爲這裏只供顯示,所以我有設置了只讀類型,只讀。控件按鈕什麼的也可以做的好看,圖表啊字體什麼的,有興趣的可以自己整。

界面設置


下一步就是設置地圖了,雙擊LoadMxd進入代碼區,因爲我做的這個題目是點擊加載地圖(也可以在事件中進入),所以選擇了這個事件。

二、實現思路

第一步是地圖的加載,我參考了教材和這位前輩的文章,還是很詳細的,但是我只用到了部分https://blog.csdn.net/weiwanshu/article/details/49784019,可以先看看這個。加載mxd的三種方法:
1。使用IMapControl接口的LoadMxFile加載地圖
2.通過IMapDocument接口加載
3.使用ArcGIS Engine中封裝好的ConstrolsOpenCommandClass

我推薦使用第一種,感覺好些,而且可以自己選擇文件。我這裏也只列出第一種方法實現的代碼

我加載地圖的代碼如下:(別看一坨,很多都是我加了解釋,畢竟我小白弄不很清楚,不過保證都是我手打手敲的HH慢慢磨)

       private void btn1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openfiledialog = new OpenFileDialog();
            openfiledialog.Title = "打開地圖文檔文件";
            openfiledialog.Filter = "地圖文檔 (*.mxd)|*.mxd";
            if (openfiledialog.ShowDialog() == DialogResult.OK)   //檢查地圖文檔有效性
            {
                string filePath = openfiledialog.FileName;//獲取文件地址
                
                if (axMapControl1.CheckMxFile(filePath))      
                 //  CheckMxFile用來判斷地址是否有效 
                {
                    axMapControl1.LoadMxFile(filePath, 0, Type.Missing);
                    //使用axMapControl來加載mxd地圖文檔,下面的代碼是依次訪問各個地圖並將地圖            
                  名寫入combox.item中去

                    IMapDocument pMapDocument = new MapDocumentClass();
                    pMapDocument.Open(filePath, null);
                   //這裏也可以直接連接到當前地圖,我這裏是借用了之前寫的代碼,重新加載了文件, 
                   後續有時間改改
                    for (int i = 0; i < pMapDocument.MapCount; i++)//依次訪問地圖
                    {
                        axMapControl1.Map = pMapDocument.get_Map(i);                        
                        comboBox1.Items.Add(axMapControl1.Map.Name);
                    }//添加
                    axMapControl1.Refresh();    //可選,刷新
                    axMapControl1.Extent = axMapControl1.FullExtent;    //全局顯示
                }
                else
                {
                    MessageBox.Show("無法打開!" + filePath + "不是有效的地圖文檔");
                }//在窗體中不用Console.write(),一般是通過MessageBox.Show()彈窗顯示,也可以 
             用來作簡單的調試什麼的,具體的調試當然還是運行過程中間變量。
 
            }            
        }

到了這裏可以運行試試看了哈哈,要是各種報錯我就沒辦法一一列出了,不過完全不要灰心,我也是在經歷了Ñ次百度各種錯誤解決,猜坑嘛,踩多了就好。

然後就是下拉選擇了,下拉框有一個SelectChange的事件,點進去開始編寫,因爲我一開始沒注意到地圖裏有一個柵格文件,所以按照書本“的ArcGIS中的應用於開發”,學校的教材(有需要可以發PDF),很薄的,在P31面,按照順序模仿敲好可以顯示。

我才用的是較爲方便直接的索引,有興趣的可以嘗試值值改變,下面是我的代碼。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string filePath = axMapControl1.DocumentFilename;
            int i = comboBox1.SelectedIndex;    //存下拉選擇框的索引

            IMapDocument pMapDocument = new MapDocumentClass();
            pMapDocument.Open(filePath, null);
            axMapControl1.Map = pMapDocument.get_Map(i);//按照選擇的索引獲取響應的map

            IMap pMap = axMapControl1.Map;//加載當前選擇地圖
            axMapControl1.Extent = axMapControl1.FullExtent;    //全局顯示

            textBox1.Clear();//每次選擇肯定要清空原來的文本啊

            /*讀取地圖中的圖層信息,這是註釋掉了,枚舉方法,可自己實現
            UID id = new UIDClass();
            id.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}";//FeatureLayer
            IEnumLayer pLayers = pMap.get_Layers(id, false);
            pLayers.Reset();*/

            for (int j=0; j<pMap.LayerCount; j++)
            {
                ILayer layer = pMap.get_Layer(j);
                textBox1.Text += layer.Name;
                textBox1.Text += "\r\n";
            }//按理來說是應該有方法可以lines字符串直接賦值寫入的吧,但是我只會手動加換行haha, 
            //第一幅地圖中 Kauai and Niihau爲柵格地圖,所以用UID方法將第一個不能完全加載
            
            bool showtips = pMap.get_Layer(0).ShowTips;
            textBox2.Text = pMap.get_Layer(0).MaximumScale.ToString();
            textBox3.Text = pMap.get_Layer(0).MinimumScale.ToString();
            textBox4.Text = showtips.ToString();
//這裏就是下面文本框的的信息顯示了,只有第一個圖有信息,我也不知道爲啥,湊合用吧,以後會了再回來改
        }

馬上大功告成,,窗口顯示出來了,還能選擇,一個關閉把我難住了,找了半天沒有找到關閉的函數,就找到一個clearlayer()能用,就用它了,但是清除完還得記得把下拉框,文本框裏的東西存儲的東西清除掉,對了,我對自己的按鈕和文本框有些可能改了文本,但是應該不影響。


        //清除圖層及顯示的所有信息
        private void btn2_Click(object sender, EventArgs e)
        {
            axMapControl1.ClearLayers();
            axMapControl1.Refresh();
            comboBox1.Items.Clear();
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();
            textBox4.Clear();
        }

這個就沒什麼好解釋的了,我對所有代碼也就是這個樣子的,我這裏能正常工作,作爲我的的第一個窗體作業可以說灰常興奮了哈哈。祝好運。要趕緊做下個作業了,老師催的緊。朋友們可以關注一起學習啊,有老師前輩指點就更棒了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章