GIS程序設計 知識總結

GIS程序設計

簡答

1. 開發模式,開發軟件的特點,概念

  1. 獨立開發:
    • 定義:不依賴於任何GIS工具軟件,從空間數據的採集、編輯到數據的處理分析及結果輸出,所有的算法都由開發者獨立設計,然後選用某種程序設計語言,如VC++、VB、Delphi、C++ Builder等,在一定的操作系統平臺上編程實現。
    • 特點:
      • 無需依賴任何商業GIS工具軟件,減少了開發成本
      • 綜合程度和操作效率最高
  2. 單純二次開發:
    • 定義:在宏語言中調用DLL庫,定義GIS系統工具不提供或不支持的功能,
    • 特點:
      • 功能弱,程序不美觀,開發收到限制
      • 增加學習負擔
  3. 集成二次開發:
    • 定義:利用專業GIS工具軟件或其提供的組件來實現GIS的基本功能,採用可視化開發工具,進行集成開發。集成二次開發目前主要有OLE/DDE方式和組件式方式兩種。
    • 特點:
      • GIS工具軟件能夠提供成熟的功能。例如:空間數據庫存儲、空間分析等
      • 高效,便捷,不需要從底層學習具體的實現原理,易上手。
  1. 基於arcengine或者arcobject 
  2. 基於com(原理)

2. 接口及類:特,用,概,接口應用

接口的特點:

  1. 接口的多態性:許多不同的類可以支持相同的接口
  2. 接口的繼承性:所有的子類都繼承了父類的接口

面向接口編程:

  • 接口定義了能做什麼,類定義了該怎麼做。類實現了接口中的方法。
  • 接口描述了一系列外部可見操作
  • 接口具有類內置的一組屬性和方法

Com類代碼:

  • 接口模塊:定義方法和屬性
  • 類模塊:實現方法和屬性

COM 對象的接口是抽象的,接口與類不同。因爲接口沒有 任何的實現,所以不能通過自身實例化。因爲接口沒有任何的實現,所以不能通過自身實例化。接口由具體的類來實現由具體的類來實現,功能用接口抽象地模擬,並且用類去真正實現。

地圖接口
  1. ILayer接口:所有圖層類都可以實現該接口,定義了所有圖層公共的方法和屬性。
     - Name屬性:返回圖層名稱;
     - MaximumScale屬性:顯示或設置圖層可以出現的最大比例尺;
     - MinmumScale屬性:顯示或設置圖層可以出現的最小比例尺;
     - ShowTips屬性:指示當鼠標放在圖層中某個要素上時,是否出現Tips;
     - SpatialReference屬性:設置圖層的空間參考。
  2. IFeatureLayer接口:主要用於設置要素圖層的數據源(FeatureClass)
     - DataSourceType屬性:返回圖層的數據源類型;
     - Search方法:通過2個參數,過濾器(IQueryFilter類型的對象)和布爾值(用於返回要素遊標是否循環,返回一個Icursor對象)

IFeatureLayer接口繼承自Ilayer接口,IFeatureClass接口繼承自Iclass接口。

FeatureLayer可以創建自己的對象,FeatureClass不行

  1. Version類庫:ArcEngine 10.0新出的類庫,包含裏將獨立應用程序綁定到特定的ArcGIS系列產品的函數和方法。

  2. System:ystem庫是ArcGIS框架中最底層的一個庫,它包含了一些被其他庫使用的一些基礎組件。

  3. SystemUI:SystemUI庫定義了一些在ArcGIS中被用戶界面組件使用的類型。象ICommand和ITool這樣的接口就在這裏定義。

  4. Geometry:幾何庫包含了核心的幾何對象,比如點,面,線等。在幾何庫中還定義和實現了空間參考的對象,包括投影座標系和幾何座標系。

  5. Display:顯示庫包含了支持在輸出設備上顯示圖形的組件,屏幕顯示、符號、顏色、顯示交互(Feedback)等都在這個庫中定義。

  6. Server:提供了連接、管理ArcGIS Server的核心類,如IServerObjectManager、IServerObject等,其他類庫的對象可以通過ArcGIS Server的IServerContext進行遠程創建。

  7. Output:提供了將MapControl和PagelayoutControl中的地圖輸出到打印機以及其他設備文件中。

3. 對象模型圖:類和關係,分別有什麼特點

    • 抽象類:不能用於創建對象,對子類例程進行了規定(通過類型繼承)。
    • 普通類:不能直接創建對象,但可以作爲另一個類的屬性或者通過另一個類的實例化來創建對象。
    • 組件類:可以直接創建對象。
  1. 關係

    • 關聯關係:表示類之間的關係。關聯的兩端都定義了多樣性。

    • 組成關係:是一種“整體類”對象控制着“部分類”對象的生命期關係。

    • 類型繼承關係:定義共享父類的屬性和方法,同時又具有了自己獨特的屬性和方法的特定對象類。

    • 實例化關係:表示某個類的對象具有創建另一個類的對象的方法。

    • N元關係:表示兩個以上的類相互關聯。在各個關聯分支的交叉點上放置一個菱形。

    • 多樣性關係:是對能於另一個對象關聯的對象數目的一種限制。關聯和組成關係的兩端都定義了多樣性。

    抽象類(AbstractClass):
    1. 不能創建或實例化

      1. 抽象類永遠不能有實例
    2. 爲子類定義了泛化(general)

      1. 子類集成了抽象類的接口

      抽象類的OMD 符號: 2維灰色矩形

    普通類/可實例化類 (Class)
    1. 不能創建或實例化

    2. 抽象類永遠不能有實例

    3. 爲子類定義了泛化(general)

    4. 子類集成了抽象類的接口

      IRow pNewRow;
      ITable pTable;
      pNewRow = pTable.CreateRow();
      IRow row = table.CreateRow();

      實例化類的OMD符號: 3維白色的矩形

    組件類/可創建的類(CoClass)
    1. 可以創建:使用 New關鍵字

      IMap pmap = new Map();
      
    2. 實例化: 從其它對象獲得

      Imap pMap;
      pMap = m_MapDocument.get_Map(i);
      

      可創建類的OMD符號:3維灰色矩形

  2. AE控件有哪些,分類特點

    1. 製圖控件: MapControl 和PageLayoutControl
    2. 框架控件: TOCControl(內容表控件) 和ToolbarControl(工具條控件)–(buddy控件捆綁)
    3. 許可控件:LicenseControl(啓動時執行License初始化)
    4. 符號控件:SymbologyControl
    5. Reader Control: ReaderControl和ReaderControl
    6. 三維控件:GlobeControl和SceneControl
  3. 矢量數據集相關類的關係

    1. 矢量數據數據的加載,分析,查詢

    接口:

      1. **IWorkspaceFactory**:創建工作工廠
    
      2. **IWorkspace**:工作化工作空間
         3. **IFeatureWorkspace**:接口轉換爲要素工作空間
         4. **IFeatureClass**:創建featureClass
         5. **IFeatureLayer**:創建要素圖層
         6. **IMap**:接收AxMapControl中的地圖對象
    

    類:

    1. ShapefileWorkspaceFactory:作爲子類創建工作空間
    2. FeatureLayer:創建要素圖層用於接收打開的shpfile文件的featureClass,作爲圖層,只是表現形式,真正的數據在FeatureClass中。
    3. FeatureClass是從Dataset繼承過來的,FeatureClass是有空間數據字段的數據集。

程序流程(簡答)

1. 數據訪問,添加矢量

矢量加載:

  1. 獲取文件路徑和文件名稱
  2. 創建地理空間工廠WorkspaceFactory(怎麼創建)
  3. 實例化地理空間Workspace(怎麼實例化)
  4. 獲取FeatureClass
  5. 創建要素圖層FeatureLayer
  6. 爲要素圖層定義數據集FeatureClass
  7. 添加至地圖控件
  8. 刷新地圖視圖
2. 空間數據顯示—圖層渲染
  1. 抽象類:Symbol,MarkerSymbol,LineSymbol,FillSymbol
  2. 組件類:
         1. RgbColor:顏色
         2. SimpleMarkerSymbol,SimplelineSymbol,SimplefillSymbol:簡單點線面符號
         3. SimpleRenderer:簡單渲染
  1. 實例化ISimpleMarkerSymbol,提供簡單點符號
  2. 實例化ISimpleRenderer,提供簡單渲染器
  3. 獲取渲染圖層賦值給IGeoFeatureLayer,提供要素圖層對成員控制地理特徵渲染的入口,獲取渲染圖層
  4. 調用pGeoFeatureLayer.Renderer屬性賦值渲染器
  5. 刷新地圖視圖
3. 元素添加至地圖
  1. 獲取pagelayerout對象、活動視圖pActiveView、圖形容器pGraphicsContainer、地圖窗口MapFrame
  2. 創建UID對象,設置value
  3. 通過MapFrameCreateSurroundFrame(uid,null)方法創建mapSurroundFrame
  4. 實例化一個區域幾何envelope(包裹元素的盒子)。通過PutCoords(xmin, ymin, xmax, ymax)方法設置地圖上的位置
  5. 通過mapSurroundFrame獲取Element,設置框架的幾何體屬性Geometry爲區域幾何對象envelope
  6. 通過圖形容器pGraphicsContainerAddElement(Element,ZOrder)方法把地圖要素添加地圖佈局。
  7. 刷新視圖。

接口:

  1. IGraphicsContainer:管理map上的Element對象,獲取圖形容器
  2. IMapFrame:訪問控制地圖元素對象的成員
  3. IMapSurroundFrame:獲取或更新存儲在幀中的環繞對象(指北針、比例尺條或圖例)
  4. IEnvelope:地物的外接矩形,用來放置元素。
  5. IElement:通過這一屬性設置該元素的外接矩形在地圖上的位置。所有圖形元素和框架元素都實現的接口,可以確定元素的Geometry屬性。

類:

  1. UID用來設置元素類型的編碼
  2. MapFrame: 用於顯示地圖的圖形元素。
  3. MapSurroundFrame:用於顯示地圖包圍的圖形元素。
  4. Envelope:包絡線,是每個幾何形體的最小外接矩形。每個Geometry都擁有一個Envelope
  5. Element:抽象類
public void add(string value,double xmin,double ymin, double xmax, double ymax)
{
    //獲取圖形容器
    IGraphicsContainer graphicsContainer = pageLayoutControl.PageLayout as IGraphicsContainer;
    
    //根據MapSurround的uid,創建相應的MapSurroundFrame和MapSurround
    UID uid = new UID();
    uid.Value = value;
    IMapFrame mapFrame = pageLayoutControl.PageLayout as IMapFrame;
    IMapSurroundFrame mapSurroundFrame = mapFrame.CreateSurroundFrame(uid, null);
    
    //爲要素實例化一個區域幾何。元素的外接矩形
    envelope = new Envelope() as IEnvelope;
    envelope.PutCoords(xmin, ymin, xmax, ymax);
       
    //獲取Element,用來設置框架的幾何體屬性
    IElement eement = mapSurroundFrame as IElement;
    
    //geometry屬性控制區域幾何在地圖上的位置
    element.Geometry = envelope;
    
    graphicsContainer.AddElement(element, 0);  
    activeView.Refresh();
    pagelayoutcontrol.Refresh();
}
4. 屬性查詢
步驟:
  1. 獲取數據源FeatureClass
  2. 循環給每一列寫字段名
  3. 獲取查詢返回的遊標,null代表沒有查詢條件,返回整個表
  4. IFeature接收指針指向的數據
  5. 將指針指向第一個要素屬性行
  6. 如果pFeature不爲空則循環7,8,9步
  7. 獲取表中的新行,並將引用賦值給DataRow
  8. 爲每一個屬性單元格賦值
  9. 遊標指向下一行要素並重新賦值給pFeature
  10. DataTable賦值給dataGridView的數據源
類:
  1. QueryFilter:過濾數據通過屬性值或者屬性之間的關係
  2. QueryDef:代表了數據庫中基於一個或多個表、要素類的進行的屬性查詢,通過這個對象,用戶可以在多個表間建立連接,並且保證在這個連接基礎上的查詢可以實現。
  3. FeatureCursor:普通類,通過pFeatureClass.Search(filter, false);實例化
接口:
  1. IFeatureClass:數據源
  2. IQueryFilter:用於屬性查詢
  3. IFeatureCursor:查詢返回的遊標
  4. IFeature:要素,返回遊標中要素集單位
5. 空間查詢
步驟:
  1. 獲取pFeatureLayer
  2. 實例化過濾器pSpatialFilter
  3. 創建geometry,用來裝載框選範圍
  4. 將框選幾何geometry賦給pSpatialFilter
  5. 設置空間範圍的查詢條件(從空間查詢窗體獲得)
  6. 實例化查詢接口pfeatureSelection
  7. 調用查詢方法SelectFeatures(過濾器, esriSelectionResultEnum.esriSelectionResultNew, false);實現高亮
  8. 刷新圖層
接口:
  1. IFeatureLayer:當前的要素圖層,用於接口轉換
  2. ISpatialFilter:過濾器,用來設置空間範圍的查詢條件
  3. IGeometry:幾何類型,獲取框選範圍
  4. IFeatureSelection:查詢接口,用於查詢,沒有返回值,實現高亮
類:
  1. FeatureLayer:組件類,要素圖層
  2. SpatialFilter:組件類,過濾器
  3. Geometry:普通類,通過mapControl.TrackRectangle();實例化,幾何類型

程序設計題

1. 面向接口的編程及接口轉換

2. 接口的繼承

3. 圖層的顯示及渲染

///
//Shp
///
OpenFileDialog pOpenfileDialog = new OpenFileDialog();
if (pOpenfileDialog.ShowDialog() == DialogResult.OK)
{
    string path = pOpenfileDialog.FileName;
    bool shp = path.EndsWith(".shp");
    if (shp)
        openShpFile(path);
}
private void openShpFile(string file)
{
    int index = 0;
    //獲取最後一個“\\”時的索引位置
    index = file.LastIndexOf("\\");
    //獲得shp文件的路徑
    string filePath = file.Substring(0, index);
    //獲得shp文件名
    string fileName = file.Substring(index + 1, file.Length - (index + 1));
    //由工作空間工廠創建shp工作空間工廠類
    IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
    //打開工作空間
    IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(filePath, 0);
    //轉換工作空間爲要素工作空間
    IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
    //打開要素類
    IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass(fileName);
    //創建要素圖層
    IFeatureLayer pFLayer = new FeatureLayer();
    //設置圖層的featureclass爲上面打開的文件
    pFLayer.FeatureClass = pFC;
    //設置圖層的名稱
    pFLayer.Name = pFC.AliasName;
    //轉換featurelayer爲layer
    ILayer pLayer = pFLayer as ILayer;
    IMap pMap = mapControl.Map;
    //添加圖層
    pMap.AddLayer(pLayer);
    //刷新
    mapControl.ActiveView.Refresh();
}


///
//渲染
///

//簡單渲染,點符號
public static void easy_point(string filename, IRgbColor point_rgb, int width)
{
     //實例化ISimpleFillSysmbol變量, 提供簡單的填充符號類型
	ISimpleMarkerSymbol pSimplemarkerSymbol = new SimpleMarkerSymbol();
     pSimplemarkerSymbol.Color = point_rgb;
     pSimplemarkerSymbol.OutlineSize = width;
     //實例化簡單渲染變量
     ISimpleRenderer pSimpleRender = new SimpleRenderer();
     //設置pSimpleRender的符號樣式
     pSimpleRender.Symbol = pSimplemarkerSymbol as ISymbol;
	Render_tool(pSimpleRender, filename);
}
private static void Render_tool(ISimpleRenderer pSimpleRenderer, string filename)
{
      //提供要素圖層對成員控制地理特徵渲染的入口,獲取渲染圖層
      IGeoFeatureLayer pGeoFeatureLayer = getGeoLayer(filename);
      if (pGeoFeatureLayer != null)
          //調用Renderer屬性, 具體說明如何通過圖層要素渲染器渲染圖層
          pGeoFeatureLayer.Renderer = pSimpleRenderer as IFeatureRenderer;
      mapControl.ActiveView.Refresh();
}
public static IGeoFeatureLayer getGeoLayer(string layerName)
{
      ILayer pLayer; //定義圖層
      IGeoFeatureLayer pGeoFeatureLayer; //定義要素圖層
      for (int i = 0; i < CSR_mapControl.LayerCount; i++)
      {
           pLayer = CSR_mapControl.get_Layer(i);
           //若當前圖層不爲空且與與layerName的值相同
           if (pLayer != null && pLayer.Name == layerName)
           {
                pGeoFeatureLayer = pLayer as IGeoFeatureLayer;
                return pGeoFeatureLayer;
           }
      }
      return null;
}

///
//Tiff
///

//工作空間實例化
IWorkspaceFactory pRasterWsF = new RasterWorkspaceFactory();
IWorkspace pWs = pRasterWsF.OpenFromFile(RasterPath, 0);
IRasterWorkspace pRasterWs = pWs as IRasterWorkspace;
IRasterDataset pRasterDS = pRasterWs.OpenRasterDataset(RasterName);
//影像金字塔的判斷和創建
IRasterPyramid pRasterPyramid = pRasterDS as IRasterPyramid;
if ((pRasterPyramid != null) && (!pRasterPyramid.Present))
{
    pRasterPyramid.Create();
}
//新建柵格圖層
IRasterLayer pRasterLayer = new RasterLayer();
pRasterLayer.CreateFromRaster(pRasterDS.CreateDefaultRaster());
IMap pmap = mapControl.Map;
//加載顯示
pmap.AddLayer(pRasterLayer);
mapControl.ActiveView.Refresh();

4. 屬性查詢

public static DataTable getFeatureLayerTable(IFeatureLayer pFeatureLayer)
{
    //獲取數據源FeatureClass
    IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
    DataTable dt = new DataTable();
    for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
    {
        //循環給每一列寫字段名
    	dt.Columns.Add(pFeatureClass.Fields.get_Field(i).Name);
    }
    //獲取查詢返回的遊標,null代表沒有查詢條件,返回整個表
    IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
    //將指針指向第一個要素屬性行
    IFeature pFeature = pFeatureCursor.NextFeature();
    while (pFeature != null)
    {
        //獲取表中的新行,並將引用賦值給DataRow
        DataRow dataR = dt.Rows.Add();
        for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)
        {
            //爲每一個屬性單元格賦值
            if (pFeature.get_Value(j) == null)
                dataR[j] = pFeatureClass.ShapeType.ToString();
            else
                dataR[j] = pFeature.get_Value(j);
        }
        //遊標指向下一行要素
        pFeature = pFeatureCursor.NextFeature();
    }
    return dt;
}

5. 空間查詢

IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;

//實例化一個過濾器,用來設置空間範圍的查詢條件
ISpatialFilter pSpatialFilter = new SpatialFilter();
IGeometry geometry = mapControl.TrackRectangle();
//將幾何範圍賦值給pSpatialFilter
pSpatialFilter.Geometry = geometry;
//設置空間範圍的查詢條件
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
//實例化查詢接口
IFeatureSelection pfeatureSelection = pFeatureLayer as IFeatureSelection;
//實現高亮
pfeatureSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
mapControl.Refresh();//地圖刷新

分值

  1. 填空:1*15
  2. 選擇:2*10
  3. 簡答:基本概念、總結及功能流程 4*5
  4. 程序閱讀:改錯、對象模型圖 5*3
  5. 程序設計:2*15
發佈了178 篇原創文章 · 獲贊 72 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章