載入矢量數據的程式碼優化

  • 2019 年 10 月 22 日
  • 筆記

深入來看,依據ESRI公司數據瀏覽架構,數據打開需要經歷以下流程

首先利用新建工作空間工廠的方法打開工作空間;然後強制轉換為要素工作空間或者柵格工作空間;最後使用要素工作空間或者柵格工作空間的方法打開(要素/矢量或柵格)數據。

 

 

對於ShapeFile來說,工作空間就是它所在的文件夾,打開工作空間需要使用對應的工作空間工廠,即ShapeFileWorkspaceFactoryClass,然後調用IWorkspaceFactory的OpenFromFile方法,就可以得到一個工作空間,這也是設計模式中工廠方法的體現。工作空間工廠的打開方法返回的是一般意義的工作空間,根據具體數據還需要進行介面轉換。因為ShapeFile是矢量數據,所以把工作空間介面跳轉到IFeatureWorkspace,從而讀取其中的要素類。

這一點對於多種格式的數據(如Coverage、GeoDatabase、ArcSDE數據格式)都是一樣。

對比程式碼:

最簡單的ArcGIS Engine應用程式(上)

private void menuAddShp_Click(object sender, EventArgs e)  {      IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();      IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(@"D:data", 0);      IFeatureWorkspace pFeatureWorkspce = pWorkspace1 as IFeatureWorkspace;      IFeatureClass pFC = pFeatureWorkspce.OpenFeatureClass("華東地區.shp");      IFeatureLayer pFLayer = new FeatureLayerClass();      pFLayer.FeatureClass = pFC;      pFLayer.Name = pFC.AliasName;      ILayer pLayer = pFLayer as ILayer;      IMap pMap = axMapControl1.Map;      pMap.AddLayer(pLayer);      axMapControl1.ActiveView.Refresh();  }

 

介紹ArcGIS中各種數據的打開方法——shp(矢量文件)

private void addShapeFile2()  {      ... //省略      IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();      IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(filePath,0) as IFeatureWorkspace;      IFeatureLayer pFLayer = new FeatureLayerClass();      pFLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName);      pFLayer.Name = pFLayer.FeatureClass.AliasName;      this.axMapControl1.AddLayer(pFLayer as ILayer);      this.axMapControl1.Refresh();  }

 

第二處的程式碼明顯要少於第一處的程式碼,但是在理解上第一處的程式碼更加容易讓人讀。(所以需要結合一下)

經過測試

1、

IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();

可以寫為(推薦使用):

IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();

 

2、

(推薦使用)

IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(@"D:data", 0);  IFeatureWorkspace pFeatureWorkspce = pWorkspace1 as IFeatureWorkspace;

可以寫為:

IFeatureWorkspace pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(@"D:data", 0)  as IFeatureWorkspace;

 

3、

相同

IFeatureLayer pFLayer = new FeatureLayerClass();

 

4、

(推薦使用)

IFeatureClass pFC = pFeatureWorkspce.OpenFeatureClass("華東地區.shp");  pFLayer.FeatureClass = pFC;

可以寫為:

pFLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(fileName); 

 

5、

(推薦使用)

pFLayer.Name = pFC.AliasName;

可以寫為:

pFLayer.Name = pFLayer.FeatureClass.AliasName;

 

5、

ILayer pLayer = pFLayer as ILayer;  IMap pMap = axMapControl1.Map;  pMap.AddLayer(pLayer);

可以寫為:

this.axMapControl1.AddLayer(pFLayer as ILayer);

或者可以寫為(推薦使用)

this.axMapControl1.AddLayer(pFLayer);

 

7、

axMapControl1.ActiveView.Refresh();

可以寫為(推薦使用)

this.axMapControl1.Refresh();

 

像其他數據的載入基本上都是大同小異的,以下列出的是載入矢量數據的程式碼。

個人推薦使用的總結程式碼:

IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();  IWorkspace pWorkspace1 = pWorkspaceFactory.OpenFromFile(@"D:data", 0);  IFeatureWorkspace pFeatureWorkspce = pWorkspace1 as IFeatureWorkspace;  IFeatureClass pFC = pFeatureWorkspce.OpenFeatureClass("華東地區.shp");  IFeatureLayer pFLayer = new FeatureLayerClass();  pFLayer.FeatureClass = pFC;  pFLayer.Name = pFC.AliasName;  this.axMapControl1.AddLayer(pFLayer);  this.axMapControl1.Refresh();

 

圖解程式碼:

 

謝謝觀看!本人初學GIS二次開發,如果有不對的地方,請多多包涵!