GIS程序設計
簡答
1. 開發模式,開發軟件的特點,概念
- 獨立開發:
- 定義:不依賴於任何GIS工具軟件,從空間數據的採集、編輯到數據的處理分析及結果輸出,所有的算法都由開發者獨立設計,然後選用某種程序設計語言,如VC++、VB、Delphi、C++ Builder等,在一定的操作系統平臺上編程實現。
- 特點:
- 無需依賴任何商業GIS工具軟件,減少了開發成本
- 綜合程度和操作效率最高
- 單純二次開發:
- 定義:在宏語言中調用DLL庫,定義GIS系統工具不提供或不支持的功能,
- 特點:
- 功能弱,程序不美觀,開發收到限制
- 增加學習負擔
- 集成二次開發:
- 定義:利用專業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不行
類
-
Version類庫:ArcEngine 10.0新出的類庫,包含裏將獨立應用程序綁定到特定的ArcGIS系列產品的函數和方法。
-
System:ystem庫是ArcGIS框架中最底層的一個庫,它包含了一些被其他庫使用的一些基礎組件。
-
SystemUI:SystemUI庫定義了一些在ArcGIS中被用戶界面組件使用的類型。象ICommand和ITool這樣的接口就在這裏定義。
-
Geometry:幾何庫包含了核心的幾何對象,比如點,面,線等。在幾何庫中還定義和實現了空間參考的對象,包括投影座標系和幾何座標系。
-
Display:顯示庫包含了支持在輸出設備上顯示圖形的組件,屏幕顯示、符號、顏色、顯示交互(Feedback)等都在這個庫中定義。
-
Server:提供了連接、管理ArcGIS Server的核心類,如IServerObjectManager、IServerObject等,其他類庫的對象可以通過ArcGIS Server的IServerContext進行遠程創建。
-
Output:提供了將MapControl和PagelayoutControl中的地圖輸出到打印機以及其他設備文件中。
3. 對象模型圖:類和關係,分別有什麼特點
-
類
- 抽象類:不能用於創建對象,對子類例程進行了規定(通過類型繼承)。
- 普通類:不能直接創建對象,但可以作爲另一個類的屬性或者通過另一個類的實例化來創建對象。
- 組件類:可以直接創建對象。
-
關係
-
關聯關係:表示類之間的關係。關聯的兩端都定義了多樣性。
-
組成關係:是一種“整體類”對象控制着“部分類”對象的生命期關係。
-
類型繼承關係:定義共享父類的屬性和方法,同時又具有了自己獨特的屬性和方法的特定對象類。
-
實例化關係:表示某個類的對象具有創建另一個類的對象的方法。
-
N元關係:表示兩個以上的類相互關聯。在各個關聯分支的交叉點上放置一個菱形。
-
多樣性關係:是對能於另一個對象關聯的對象數目的一種限制。關聯和組成關係的兩端都定義了多樣性。
抽象類(AbstractClass):
-
不能創建或實例化
- 抽象類永遠不能有實例
-
爲子類定義了泛化(general)
- 子類集成了抽象類的接口
抽象類的OMD 符號: 2維灰色矩形
普通類/可實例化類 (Class)
-
不能創建或實例化
-
抽象類永遠不能有實例
-
爲子類定義了泛化(general)
-
子類集成了抽象類的接口
IRow pNewRow;
ITable pTable;
pNewRow = pTable.CreateRow();
IRow row = table.CreateRow();實例化類的OMD符號: 3維白色的矩形
組件類/可創建的類(CoClass)
-
可以創建:使用 New關鍵字
IMap pmap = new Map();
-
實例化: 從其它對象獲得
Imap pMap; pMap = m_MapDocument.get_Map(i);
可創建類的OMD符號:3維灰色矩形
-
-
AE控件有哪些,分類特點
- 製圖控件: MapControl 和PageLayoutControl
- 框架控件: TOCControl(內容表控件) 和ToolbarControl(工具條控件)–(buddy控件捆綁)
- 許可控件:LicenseControl(啓動時執行License初始化)
- 符號控件:SymbologyControl
- Reader Control: ReaderControl和ReaderControl
- 三維控件:GlobeControl和SceneControl
-
矢量數據集相關類的關係
- 矢量數據數據的加載,分析,查詢
接口:
1. **IWorkspaceFactory**:創建工作工廠 2. **IWorkspace**:工作化工作空間 3. **IFeatureWorkspace**:接口轉換爲要素工作空間 4. **IFeatureClass**:創建featureClass 5. **IFeatureLayer**:創建要素圖層 6. **IMap**:接收AxMapControl中的地圖對象
類:
- ShapefileWorkspaceFactory:作爲子類創建工作空間
- FeatureLayer:創建要素圖層用於接收打開的shpfile文件的featureClass,作爲圖層,只是表現形式,真正的數據在FeatureClass中。
- FeatureClass是從Dataset繼承過來的,FeatureClass是有空間數據字段的數據集。
程序流程(簡答)
1. 數據訪問,添加矢量
矢量加載:
- 獲取文件路徑和文件名稱
- 創建地理空間工廠WorkspaceFactory(怎麼創建)
- 實例化地理空間Workspace(怎麼實例化)
- 獲取FeatureClass
- 創建要素圖層FeatureLayer
- 爲要素圖層定義數據集FeatureClass
- 添加至地圖控件
- 刷新地圖視圖
2. 空間數據顯示—圖層渲染
1. 抽象類:Symbol,MarkerSymbol,LineSymbol,FillSymbol
2. 組件類:
1. RgbColor:顏色
2. SimpleMarkerSymbol,SimplelineSymbol,SimplefillSymbol:簡單點線面符號
3. SimpleRenderer:簡單渲染
- 實例化
ISimpleMarkerSymbol
,提供簡單點符號 - 實例化
ISimpleRenderer
,提供簡單渲染器 - 獲取渲染圖層賦值給
IGeoFeatureLayer
,提供要素圖層對成員控制地理特徵渲染的入口,獲取渲染圖層 - 調用
pGeoFeatureLayer.Renderer
屬性賦值渲染器 - 刷新地圖視圖
3. 元素添加至地圖
- 獲取
pagelayerout
對象、活動視圖pActiveView
、圖形容器pGraphicsContainer
、地圖窗口MapFrame
- 創建
UID
對象,設置value
- 通過
MapFrame
的CreateSurroundFrame(uid,null)
方法創建mapSurroundFrame
- 實例化一個區域幾何
envelope
(包裹元素的盒子)。通過PutCoords(xmin, ymin, xmax, ymax)
方法設置地圖上的位置 - 通過
mapSurroundFrame
獲取Element
,設置框架的幾何體屬性Geometry
爲區域幾何對象envelope
- 通過圖形容器
pGraphicsContainer
的AddElement(Element,ZOrder)
方法把地圖要素添加地圖佈局。 - 刷新視圖。
接口:
- IGraphicsContainer:管理map上的Element對象,獲取圖形容器
- IMapFrame:訪問控制地圖元素對象的成員
- IMapSurroundFrame:獲取或更新存儲在幀中的環繞對象(指北針、比例尺條或圖例)
- IEnvelope:地物的外接矩形,用來放置元素。
- IElement:通過這一屬性設置該元素的外接矩形在地圖上的位置。所有圖形元素和框架元素都實現的接口,可以確定元素的Geometry屬性。
類:
- UID用來設置元素類型的編碼
- MapFrame: 用於顯示地圖的圖形元素。
- MapSurroundFrame:用於顯示地圖包圍的圖形元素。
- Envelope:包絡線,是每個幾何形體的最小外接矩形。每個Geometry都擁有一個Envelope
- 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. 屬性查詢
步驟:
- 獲取數據源
FeatureClass
- 循環給每一列寫字段名
- 獲取查詢返回的遊標,
null
代表沒有查詢條件,返回整個表 - 用
IFeature
接收指針指向的數據 - 將指針指向第一個要素屬性行
- 如果
pFeature
不爲空則循環7,8,9步 - 獲取表中的新行,並將引用賦值給
DataRow
- 爲每一個屬性單元格賦值
- 遊標指向下一行要素並重新賦值給
pFeature
- 將
DataTable
賦值給dataGridView
的數據源
類:
- QueryFilter:過濾數據通過屬性值或者屬性之間的關係
- QueryDef:代表了數據庫中基於一個或多個表、要素類的進行的屬性查詢,通過這個對象,用戶可以在多個表間建立連接,並且保證在這個連接基礎上的查詢可以實現。
- FeatureCursor:普通類,通過
pFeatureClass.Search(filter, false);
實例化
接口:
- IFeatureClass:數據源
- IQueryFilter:用於屬性查詢
- IFeatureCursor:查詢返回的遊標
- IFeature:要素,返回遊標中要素集單位
5. 空間查詢
步驟:
- 獲取
pFeatureLayer
- 實例化過濾器
pSpatialFilter
- 創建
geometry
,用來裝載框選範圍 - 將框選幾何
geometry
賦給pSpatialFilter
- 設置空間範圍的查詢條件(從空間查詢窗體獲得)
- 實例化查詢接口
pfeatureSelection
- 調用查詢方法
SelectFeatures(過濾器, esriSelectionResultEnum.esriSelectionResultNew, false);
實現高亮 - 刷新圖層
接口:
- IFeatureLayer:當前的要素圖層,用於接口轉換
- ISpatialFilter:過濾器,用來設置空間範圍的查詢條件
- IGeometry:幾何類型,獲取框選範圍
- IFeatureSelection:查詢接口,用於查詢,沒有返回值,實現高亮
類:
- FeatureLayer:組件類,要素圖層
- SpatialFilter:組件類,過濾器
- 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*15
- 選擇:2*10
- 簡答:基本概念、總結及功能流程 4*5
- 程序閱讀:改錯、對象模型圖 5*3
- 程序設計:2*15