載入矢量數據的程式碼優化
- 2019 年 10 月 22 日
- 筆記
深入來看,依據ESRI公司數據瀏覽架構,數據打開需要經歷以下流程:
首先利用新建工作空間工廠的方法打開工作空間;然後強制轉換為要素工作空間或者柵格工作空間;最後使用要素工作空間或者柵格工作空間的方法打開(要素/矢量或柵格)數據。
對於ShapeFile來說,工作空間就是它所在的文件夾,打開工作空間需要使用對應的工作空間工廠,即ShapeFileWorkspaceFactoryClass,然後調用IWorkspaceFactory的OpenFromFile方法,就可以得到一個工作空間,這也是設計模式中工廠方法的體現。工作空間工廠的打開方法返回的是一般意義的工作空間,根據具體數據還需要進行介面轉換。因為ShapeFile是矢量數據,所以把工作空間介面跳轉到IFeatureWorkspace,從而讀取其中的要素類。
這一點對於多種格式的數據(如Coverage、GeoDatabase、ArcSDE數據格式)都是一樣。
對比程式碼:
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(); }
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二次開發,如果有不對的地方,請多多包涵!