最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C#配合ArcGIS Engine進(jìn)行地理信息系統(tǒng)開發(fā)

 更新時(shí)間:2016年02月19日 14:49:06   作者:G1SLu  
這篇文章主要介紹了使用C#配合ArcGIS Engine進(jìn)行地理信息系統(tǒng)開發(fā),ArcGIS Engine是Windows系統(tǒng)上可以讓程序員創(chuàng)建自定義的GIS桌面程序,需要的朋友可以參考下

簡(jiǎn)單的地圖讀取、展示
終于到暑假了。。。開始認(rèn)真整理整理相關(guān)學(xué)習(xí)的心得體會(huì)咯~
先把很久之前挖的關(guān)于C# 二次開發(fā)的坑給填上好了~ 這次先計(jì)劃用一個(gè)月把C# ArcEngine 10.0相關(guān)開發(fā)的學(xué)習(xí)心得給發(fā)布出來(lái)好啦~

第一部分就是最簡(jiǎn)單的helloworld了:掌握使用控件創(chuàng)建簡(jiǎn)單的GIS應(yīng)用程序~
(前期相關(guān)環(huán)境配置略掉~請(qǐng)自行百度~)

首先打開VS2010,,通過(guò)(文件--新建--項(xiàng)目--Windos窗體應(yīng)用程序) ,我們新建一個(gè)名叫“MyHelloWorld”的Windows 窗體應(yīng)用程序。然后就要開始往里面填控件了:
在 VS 的工具箱中找到到和 ArcGIS Engine 相關(guān)的控件 ,在這里我們使用AxTOCControl(目錄控件),AxLicenseControl  (許可控件),以及MapControl,在這里MapControl對(duì)應(yīng)于 ArcMap 中的數(shù)據(jù)視圖,它封裝了Map 對(duì)象,并提供了額外的屬性,方法,事件等。是我們?cè)诮觼?lái)下的一系列開發(fā)中必不可少的一環(huán)。
將3個(gè)控件排列一下后,效果如下圖所示:

2016219144504973.jpg (903×463)

注意:
1.其中AxLicenseControl  控件是整個(gè)Arcengine開發(fā)中必須的許可控件,如果沒有它或者沒有ArcEngine的Lisence許可的話,我們是無(wú)法調(diào)用任何GIS功能的。
2.將三個(gè)控件拖入窗體后,我們會(huì)發(fā)現(xiàn)系統(tǒng)自動(dòng)導(dǎo)入了相關(guān)引用,但無(wú)論是系統(tǒng)自己導(dǎo)入的引用還是我們手動(dòng)導(dǎo)入的,請(qǐng)注意將引用屬性中的“復(fù)制本地”設(shè)置為False,否則可能會(huì)產(chǎn)生無(wú)法運(yùn)行代碼的情況。
控件設(shè)置好之后,我們打開Program.cs,在系統(tǒng)的入口處添加這樣一行代碼:  

ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop); 

這主要是針對(duì)Arcgis10.0的變化而設(shè)置的,添加后的代碼如下:

namespace MyHelloWorld 
{ 
  static class Program 
  { 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
 
      ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop); 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 

接下來(lái),我們就可以通過(guò)設(shè)置編輯ToolbarControl的屬性,來(lái)給它添加上我們需要的工具了,同時(shí)要記得在ToolBar控件和axTOCCControl1控件的屬性設(shè)置中,將ToolBar的Buddy選項(xiàng)設(shè)置為axTOCCControl1,這樣就可以將二者進(jìn)行聯(lián)動(dòng)。
在ToolbarControl的屬性設(shè)置中,我們可以通右鍵——屬性——Item來(lái)給Toolbar控件設(shè)置我們需要的工具,在這里我選擇了一些常用的工具:保存、移動(dòng)、撤銷、放大、縮小等等,過(guò)程如下圖所示:

2016219144535867.jpg (457×303)

全部設(shè)置后之后,第一章的內(nèi)容就基本結(jié)束了,將程序調(diào)試后,最終效果如下圖,一個(gè)最簡(jiǎn)單的GIS桌面程序就出來(lái)啦~~

2016219144552570.jpg (904×463)

打開地圖文檔、鷹眼圖的制作
首先是制作一個(gè)按鈕來(lái)負(fù)責(zé)打開地圖文檔:
在toolbox中選擇Button控件拖入我們的Form中,接下來(lái)在該button的Cilck事件中調(diào)用 OpenFileDialog類獲取文件路徑后,
 將文件路徑調(diào)用到axMapControl1.LoadMxFile(path)中就可以打開MXD文檔了。

    private void button1_Click(object sender, EventArgs e) 
    { 
   OpenFileDialog OpenMXD = new OpenFileDialog(); 
   OpenMXD.Title = "打開地圖"; 
   OpenMXD.InitialDirectory = "E:"; 
   OpenMXD.Filter = "Map Documents (*.mxd)|*.mxd"; 
   if (OpenMXD.ShowDialog() == DialogResult.OK) 
   { 
   string MxdPath = OpenMXD.FileName; 
   axMapControl1.LoadMxFile(MxdPath); 
<span style="white-space:pre">  </span>} 
    } 

我們可以通過(guò)相同的方法打開shape文件,但是這里要注意:
axMapControl1.AddShapeFile()方法中,并不是像LoadMx一樣直接輸入文件路徑就行,而是AddShapeFile(filePath, fileName),因此我們要先編寫一個(gè)函數(shù)將文件路徑的字符串進(jìn)行分割:

private void button2_Click(object sender, EventArgs e) 
{ 
  { 
    string[] S = OpenShapeFile(); 
    try 
    { 
      axMapControl1.AddShapeFile(S[0], S[1]); 
    } 
    catch 
    { 
      MessageBox.Show("請(qǐng)至少選擇一個(gè)shape文件", "ERROR"); 
     
     } 
 
    } 
  } 
 
 
public string[] OpenShapeFile() 
{ 
  string[] ShpFile = new string[2]; 
  OpenFileDialog OpenShpFile = new OpenFileDialog(); 
  OpenShpFile.Title = "打開Shape文件"; 
  OpenShpFile.InitialDirectory = "E:"; 
  OpenShpFile.Filter = "Shape文件(*.shp)|*.shp"; 
  if (OpenShpFile.ShowDialog() == DialogResult.OK) 
  { 
    string ShapPath = OpenShpFile.FileName; 
    //利用"\\"將文件路徑分成兩部分 
    int Position = ShapPath.LastIndexOf("\\"); 
    string FilePath = ShapPath.Substring(0, Position); 
    string ShpName = ShapPath.Substring(Position + 1); 
    ShpFile[0] = FilePath; 
    ShpFile[1] = ShpName; 
     
  } 
  return ShpFile; 
} 

運(yùn)行后結(jié)果如下:

2016219144634652.jpg (477×278)

這部分完成后,接下來(lái)是鷹眼圖的制作~:

鷹眼圖的操作主要分為兩個(gè)部分,當(dāng)在主控件中重新加載一幅圖的時(shí)候,另外一個(gè)控件的圖也發(fā)生相應(yīng)的變化, 大致思路是在獲得你在打開主地圖后,向鷹眼圖(MapControl2)中添加相同的圖層,并不斷更新你在主地圖的當(dāng)前范圍,再在鷹眼圖的對(duì)應(yīng)區(qū)域中繪制一個(gè)紅框表示對(duì)應(yīng)范圍。
這里主要使用了IEnvelope和IPoint接口,用來(lái)獲取鼠標(biāo)所在坐標(biāo)、繪制表示范圍的紅框,具體用法可以參考這里~

我們?cè)趂orm中拖入第二個(gè)地圖控件axMapControl2,用它作為axMapControl1的鷹眼圖進(jìn)行表示。
這里首先對(duì)MapControl1的OnMapReplaced事件和OnExtentUpdated事件進(jìn)行編寫,讓我們獲得MapControl1的地圖范圍更新,并向MapControl2添加圖層、繪制矩形:

private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e) 
{ 
  //設(shè)置一個(gè)新的外接矩形 
  IEnvelope pEnvelope = (IEnvelope)e.newEnvelope; 
  IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer; 
  IActiveView pActiveView = pGraphicsContainer as IActiveView; 
  //在繪制前,清除axMapControl2中的任何圖形元素 
  pGraphicsContainer.DeleteAllElements(); 
  IRectangleElement pRectangleEle = new RectangleElementClass(); 
  IElement pElement = pRectangleEle as IElement; 
  pElement.Geometry = pEnvelope; 
  //設(shè)置鷹眼圖中的紅線框 
  IRgbColor pColor = new RgbColorClass(); 
  pColor.Red = 255; 
  pColor.Green = 0; 
  pColor.Blue = 0; 
  pColor.Transparency = 255; 
  //產(chǎn)生一個(gè)線符號(hào)對(duì)象 
  ILineSymbol pOutline = new SimpleLineSymbolClass(); 
  pOutline.Width = 3; 
  pOutline.Color = pColor; 
  //設(shè)置顏色屬性 
  pColor = new RgbColorClass(); 
  pColor.Red = 255; 
  pColor.Green = 0; 
  pColor.Blue = 0; 
  pColor.Transparency = 0; 
  //設(shè)置填充符號(hào)的屬性 
  IFillSymbol pFillSymbol = new SimpleFillSymbolClass(); 
  pFillSymbol.Color = pColor; 
  pFillSymbol.Outline = pOutline; 
  IFillShapeElement pFillShapeEle = pElement as IFillShapeElement; 
  pFillShapeEle.Symbol = pFillSymbol; 
  pGraphicsContainer.AddElement((IElement)pFillShapeEle, 0); 
  pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); 
  //將地圖范圍顯示在StripStatus中 
  IPoint ll, Ur; 
  ll = axMapControl1.Extent.LowerLeft; 
  Ur = axMapControl1.Extent.LowerRight; 
  toolStripStatusLabel3.Text = "(" + Convert.ToString(ll.X) + "," + Convert.ToString(ll.Y) + ")"; 
 
} 

private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e) 
{                                                                               //向MapControl2添加圖層 
  if (axMapControl1.LayerCount > 0) 
  { 
    axMapControl2.Map = new MapClass(); 
    for (int i = 0; i <= axMapControl1.Map.LayerCount - 1; i++) 
    { 
       
      axMapControl2.AddLayer(axMapControl1.get_Layer(i)); 
    } 
    axMapControl2.Extent = axMapControl1.Extent; 
    axMapControl2.Refresh(); 
 
  } 
} 

接下來(lái)就是對(duì)MapControl2控件的On_MouseDown 和 On_MouseMove事件進(jìn)行編寫,這樣可以讓我們通過(guò)拖動(dòng)鷹眼圖上的紅框反向操作MapControl1中的地圖位置:

private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e) 
    { 
      if (e.button == 1) 
      { 
        IPoint pPoint = new PointClass(); 
        pPoint.PutCoords(e.mapX, e.mapY); 
        axMapControl1.CenterAt(pPoint); 
        axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, 
        null, null); 
      } 
    } 
 
    private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) 
    { 
      if (axMapControl2.Map.LayerCount > 0) 
      { 
        if (e.button == 1) 
        { 
          IPoint pPoint = new PointClass();                                                             //將點(diǎn)擊位置的坐標(biāo)轉(zhuǎn)換后設(shè)為MapControl1的中心 
          pPoint.PutCoords(e.mapX, e.mapY); 
          axMapControl1.CenterAt(pPoint); 
          axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); 
        } 
        else if (e.button == 2) 
        { 
          IEnvelope pEnv = axMapControl2.TrackRectangle(); 
          axMapControl1.Extent = pEnv; 
          axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); 
        } 
      } 
 
    } 

最后在Form左下角再添加一個(gè)statusStrip控件,就可以實(shí)時(shí)顯示當(dāng)前圖幅的范圍了~
最終效果如下:

2016219144709064.jpg (906×536)

屬性表的訪問(wèn)與顯示
這里主要是訪問(wèn)并顯示shapefile的屬性表~

大致思路如下:新建一個(gè)Form用來(lái)獲取選中要素的屬性表,而在初始界面右鍵點(diǎn)擊對(duì)應(yīng)的矢量要素后,便打開新form將要素屬性表展示出來(lái)。
下面就開始咯~
首先要添加ESRI.ArcGIS.Controls、Geodatabase的引用,更新命名空間;
然后我們添加一個(gè)用于顯示屬性表內(nèi)容新的 Form 窗體,在這個(gè)新的窗體上添加 dataGridView 控件,并添加Column。

2016219144728985.jpg (446×435)

在Form2中,我們先將可能獲得的屬性表數(shù)據(jù)類型進(jìn)行預(yù)定義:

public static string ParseFieldType(esriFieldType fieldType)//將EsriType 轉(zhuǎn)換為String 
   { 
     switch (fieldType) 
     { 
       case esriFieldType.esriFieldTypeBlob: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeDate: 
         return "System.DateTime"; 
       case esriFieldType.esriFieldTypeDouble: 
         return "System.Double"; 
       case esriFieldType.esriFieldTypeGeometry: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeGlobalID: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeGUID: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeInteger: 
         return "System.Int32"; 
       case esriFieldType.esriFieldTypeOID: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeRaster: 
         return "System.String"; 
       case esriFieldType.esriFieldTypeSingle: 
         return "System.Single"; 
       case esriFieldType.esriFieldTypeSmallInteger: 
         return "System.Int32"; 
       case esriFieldType.esriFieldTypeString: 
         return "System.String"; 
       default: 
         return "System.String"; 
     } 
   } 

然后就是獲取shpaefile的屬性表了,這里我們主要使用 IField、IFeatureCursor、IFeature 這三個(gè)接口來(lái)達(dá)成目標(biāo):
接口說(shuō)明如下:

  • IField 接口:用于獲取要素表。
  • IFeature 接口:用來(lái)接收查詢出來(lái)的要素。
  • IFeatureCursor 接口:通過(guò)Search進(jìn)行查詢,可以將結(jié)果保存在這里,從而利用NextFeature方法,遍歷所有要素。

代碼如下:

public void Opentable() 
    { 
      IFields pFields; 
      pFields = pFeaturelayer.FeatureClass.Fields; 
      dataGridView1.ColumnCount = pFields.FieldCount; 
      for (int i = 0; i < pFields.FieldCount; i++) 
      { 
        string fldName = pFields.get_Field(i).Name; 
        dataGridView1.Columns[i].Name = fldName; 
        dataGridView1.Columns[i].ValueType = System.Type.GetType(ParseFieldType(pFields.get_Field(i).Type)); 
      } 
      IFeatureCursor pFeatureCursor; 
      pFeatureCursor = pFeaturelayer.FeatureClass.Search(null, false); 
      IFeature pFeature; 
      pFeature = pFeatureCursor.NextFeature(); 
      while (pFeature != null) 
      { 
        string[] fldValue = new string[pFields.FieldCount]; 
        for (int i = 0; i < pFields.FieldCount; i++) 
        { 
          string fldName; 
          fldName = pFields.get_Field(i).Name; 
          if (fldName == pFeaturelayer.FeatureClass.ShapeFieldName) 
          { 
            fldValue[i] = Convert.ToString(pFeature.Shape.GeometryType); 
          } 
          else 
            fldValue[i] = Convert.ToString(pFeature.get_Value(i)); 
        } 
        dataGridView1.Rows.Add(fldValue); 
        pFeature = pFeatureCursor.NextFeature(); 
      } 
    } 

搞定~接下來(lái)就是在初始界面選定要素后跳轉(zhuǎn)界面顯示屬性表了~

先在form1中進(jìn)行預(yù)定義:

IFeatureLayer pFeatureLayer = null; 
public IFeatureLayer pGlobalFeatureLayer; //定義全局變量 
public ILayer player; 



因?yàn)闆Q定在右擊鼠標(biāo)時(shí)顯示選項(xiàng),在Form1窗體中添加contextMenuStrip控件,添加選項(xiàng)”顯示屬性表“,在click事件中打開新form:

Form2 Ft = new Form2(player as IFeatureLayer); 
      Ft.Show(); 

然后就保證右鍵點(diǎn)擊相關(guān)圖層要素后能夠成功打開對(duì)應(yīng)屬性表啦,這里主要用了TOCControl的 HitTest()方法:
publicvoid HitTest ( int X, int Y, ref esriTOCControlItem ItemType, ref IBasicMapBasicMap, ref ILayer Layer, ref object Unk, ref object Data );
其中

  • X,Y:鼠標(biāo)點(diǎn)擊的坐標(biāo);
  • ITemType:esriTOCControlItem枚舉常量
  • BasicMap:綁定MapControl的IBasicMap接口
  • Layer:被點(diǎn)擊的圖層
  • Unk:TOCControl的LegendGroup對(duì)象
  • Data:LegendClass在LegendGroup中的Index。

在TOCControl控件的 OnMouseDown 事件下添加如下代碼即可~:

if (axMapControl1.LayerCount > 0) 
{ 
  esriTOCControlItem pItem = new esriTOCControlItem(); 
  pGlobalFeatureLayer = new FeatureLayerClass(); 
  IBasicMap pBasicMap = new MapClass(); 
  object pOther = new object(); 
  object pIndex = new object(); 
  axTOCControl1.HitTest(e.x, e.y, ref pItem, ref pBasicMap, ref player, ref pOther, ref pIndex); 
} 
if (e.button == 2) 
{ 
  contextMenuStrip1.Show(axTOCControl1, e.x, e.y); 
} 

大功告成~~
運(yùn)行結(jié)果如下:
右擊顯示屬性表:

2016219144838917.jpg (884×529)

點(diǎn)擊后出現(xiàn)屬性表~~~:

2016219144856185.jpg (884×529)

相關(guān)文章

  • 使用apidoc管理RESTful風(fēng)格Flask項(xiàng)目接口文檔方法

    使用apidoc管理RESTful風(fēng)格Flask項(xiàng)目接口文檔方法

    下面小編就為大家分享一篇使用apidoc管理RESTful風(fēng)格Flask項(xiàng)目接口文檔方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Python的Matplotlib庫(kù)應(yīng)用實(shí)例超詳細(xì)教程

    Python的Matplotlib庫(kù)應(yīng)用實(shí)例超詳細(xì)教程

    這篇文章主要介紹了Python的Matplotlib庫(kù)應(yīng)用的相關(guān)資料,Matplotlib是一個(gè)強(qiáng)大的Python數(shù)據(jù)可視化庫(kù),支持繪制2D和3D圖像,它提供了簡(jiǎn)單易用的API,廣泛應(yīng)用于數(shù)據(jù)分析和科學(xué)研究,需要的朋友可以參考下
    2025-01-01
  • python六種基本數(shù)據(jù)類型及常用函數(shù)展示

    python六種基本數(shù)據(jù)類型及常用函數(shù)展示

    這篇文章主要為大家介紹了python六種基本數(shù)據(jù)類型及常用函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • 基于Python打造一個(gè)高效開發(fā)輔助全能工具箱

    基于Python打造一個(gè)高效開發(fā)輔助全能工具箱

    在日常開發(fā)過(guò)程中,我們經(jīng)常需要進(jìn)行各種瑣碎但又必不可少的操作,本文介紹一款基于?Python?編寫的?全能工具箱,它涵蓋了開發(fā)過(guò)程中常用的功能,希望對(duì)大家有所幫助
    2025-03-03
  • Python 2.6.6升級(jí)到Python2.7.15的詳細(xì)步驟

    Python 2.6.6升級(jí)到Python2.7.15的詳細(xì)步驟

    這篇文章主要介紹了Python 2.6.6升級(jí)到Python2.7.15的詳細(xì)步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 如何使用Tkinter進(jìn)行窗口的管理與設(shè)置

    如何使用Tkinter進(jìn)行窗口的管理與設(shè)置

    Tkinter是Python的標(biāo)準(zhǔn)GUI庫(kù),它實(shí)際是建立在Tk技術(shù)上的。在大多數(shù)Unix平臺(tái)以及Windows系統(tǒng)上都可用
    2021-06-06
  • 使用Keras加載含有自定義層或函數(shù)的模型操作

    使用Keras加載含有自定義層或函數(shù)的模型操作

    這篇文章主要介紹了使用Keras加載含有自定義層或函數(shù)的模型操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python collections.deque雙邊隊(duì)列原理詳解

    Python collections.deque雙邊隊(duì)列原理詳解

    這篇文章主要介紹了Python collections.deque雙邊隊(duì)列原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導(dǎo)到3.8.1的詳細(xì)步驟

    在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導(dǎo)到3.8.1的

    這篇文章主要介紹了如何在linux系統(tǒng)中安裝python3.8.1?并卸載?python3.6.2?更新python3引導(dǎo)到3.8.1,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Django框架模板用法詳解

    Django框架模板用法詳解

    本文詳細(xì)講解了Django框架中模板的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論

论坛| 轮台县| 定州市| 石泉县| 周口市| 沙雅县| 丹巴县| 古交市| 乌拉特后旗| 南皮县| 塔城市| 潮州市| 吉首市| 日照市| 都昌县| 柳林县| 赤水市| 通山县| 扶沟县| 乌兰察布市| 黄石市| 文成县| 平阳县| 都兰县| 错那县| 乌兰察布市| 龙门县| 博爱县| 通河县| 林周县| 云浮市| 涿州市| 夏邑县| 麟游县| 白朗县| 枝江市| 铜川市| 涿州市| 响水县| 泸溪县| 岑巩县|