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