ArcGIS Engine基础开发教程3学习地图和地图布局.docx
- 文档编号:5800042
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:28
- 大小:2.55MB
ArcGIS Engine基础开发教程3学习地图和地图布局.docx
《ArcGIS Engine基础开发教程3学习地图和地图布局.docx》由会员分享,可在线阅读,更多相关《ArcGIS Engine基础开发教程3学习地图和地图布局.docx(28页珍藏版)》请在冰豆网上搜索。
ArcGISEngine基础开发教程3学习地图和地图布局
ArcGISEngine基础开发教程(3)——学习地图和地图布局
本帖最后由fxlcoco于2010-3-909:
51编辑
ESRIBBSGIS大讲堂首发,转载请注明出处
本章是ArcGISEngine基础开发教程的第三章,主要给大家大致讲解了,地图和地图布局的相关对象。
这些对象非常重要,如果这些基本对象都不熟悉就开始搞ArcGISEngine开发是不科学的也走不远的。
3地图和地图布局
3.1地图
3.1.1Map对象
Map对象是ArcGISEngine的主要对象,本章将给大家介绍地图组成结构,如何创建地图,如何对组成地图的对象进行操作,在介绍这些内容时尽量结合ArcMap学习效果会更好。
在Map对象上能显示的图形有两类一类是地理数据,一类是元素。
地理数据包括矢量类型的要素数据,栅格数据,Tin等表面数据等,这些数据都保存在Geodatabase或数据文件如shapefile中,它们是用于GIS分析制图的源数据;
下载(482.69KB)
2009-5-1809:
19
图1
而元素是另一种可以显示在Map上的对象,它分为两部分一类是图形元素,一类是框架元素,图形元素可以显示出来,而框架元素充当了“容器”的角色。
在ArcMap中可以使用“Draw”工具在Map上直接绘制一个矩形,圆形,文本等对象,在布局视图上也可以给地图添加指北针,图例,比例尺等图形对象,这些都是图形元素。
下载(311.21KB)
2009-5-1809:
19
图2
在ArcMap中Map对象是由MXDocument对象的MapFrame对象管理,MapFrame是一个框架元素。
Map对象有双重身份,一方面是数据的管理容器,可以加载地理数据和图形元素,扮演了数据管理器的角色,另一方面它又可以让用户看到这些数据即扮演了数据显示器的角色,当加载数据到Map对象的时候,Map对象是数据的管理者;当改变视图范围,刷新地图的时候它是数据的显示者。
Map对象主要实现的接口由IMap, IGraphicContainer, IActiveView, IMapBookmarks等接口。
IMap接口主要用于管理Map对象中的Layer对象,要素选择集对象,MapSourround对象,空间参考等对象。
Map对象可以显示图形元素(GraphicsElement),Map对象通过IGraphicsContainer接口来管理这些元素对象,包括图形元素和框架元素。
IGraphicsContainer返回的是Map对象中处于活动状态的Graphicslayer引用指针,它可以是一个Basicgraphicslayer,也可以是CompositeGraphicsLayer中的一个图层,或者是一个FDOGraphicsLayer注记图层。
以下代码片段演示如何添加一个Element到Map上:
1.
2. ///
3.
4.///添加临时元素到地图窗口上
5.///
6.///
7.///
8.///
9.publicstaticvoidAddTempElement(AxMapControlpMapCtrl,IElementpEle,IElementCollectionpEleColl)
10.{
11.try
12.{
13.IMappMap=pMapCtrl.Map;
14.IGraphicsContainerpGCs=pMapasIGraphicsContainer;
15.if(pEle!
=null)
16.pGCs.AddElement(pEle,0);
17.
18.if(pEleColl!
=null)
19. if(pEleColl.Count>0)
20. pGCs.AddElements(pEleColl,0);
21. IActiveViewpAV=(IActiveView)pMap;
22. //需要刷新才能即时显示
23. pAV.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,pAV.Extent);
24.}
25.catch(ExceptionErr)
26.{
27.MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
28.}
29.}
复制代码
IActiveView接口定义了Map对象的数据显示功能。
使用该接口可以改变视图的范围,刷新视图。
IActiveView的PartialRefresh(esriViewGeography,pLayer,null)用于刷新指定图层:
IActiveView的PartialRefresh(esriViewGeography,null,null)用于刷新刷新所有图层:
IActiveView的PartialRefresh(esriViewGeoSelection,null,null)用于刷新所选择的对象:
IActiveView的PartialRefresh(esriViewGraphics,null,null)用于刷新图形元素:
IActiveView的PartialRefresh(esriViewGraphics,pElement,null)用于刷新指定图形元素
IActiveView的PartialRefresh(esriViewGraphics,null,null)用于刷新所有图形元素
IActiveView的PartialRefresh(esriViewGraphicSelection,null,null)用于刷新所选择的图元。
IMapBookmark接口用于管理所有的空间书签对象。
3.1.2图层对象
Map对象可以装载地理数据,这些数据是以图层的形式加载到地图对象上的,图层对象Layer作为一个数据的“中介”存在,它本身没有转载地理数据,而仅仅是获得了数据的引用,用于管理数据源的连接。
地理数据始终保存在Geodatabase或者地理数据文件中。
由于地理数据的类型多样,所以Layer类也拥有众多子类(具体查看帮助),接下来主要给大家介绍要素图层—FeatureLayer对象。
3.1.3FeatureLayer对象
FeatureLayer类实现的常用主要接口如下图所示:
IFeatureLayer,IFeatureLayerDefinition,FeatureSelection,IGeoDataset,IGeoFeatureLayer,IIdentify,ILayerEffects。
下载(227.23KB)
2009-5-1809:
19
图3
IFeatureLayer接口主要用于设置要素图层的数据源(FeatureClass),IFeatureLayer的DataSourceType获取FeatureLayer对象的数据源类型。
此外通过IFeatureLayer的Search方法可以查询要素图层上符号某一条件的要素集。
IGeoFeatureLayer接口继承了ILayer和IFeatureLayer两个接口,用于控制要素图层的符号化和标注等。
IGeoDataset接口仅有两个属性,它们用于管理地理要素集。
Extent可以返回当前数据集的范围,是一个IEnvelope类型的对象;
SpatialReference属性则可以让用户获得这个数据集的空间参考。
IFeatureSelection接口提供管理一个图层中的要素的选择集的方法和属性。
以下代码片段演示如何获取要素图层符合条件获取选择集
1.
2.//////
3. ///获取要素图层符合条件获取选择集
4. ///
5. ///
6. ///
7. ///
8. privateIFeatureSelectionSelectLayersFeatures(IFeatureLayerpFeatureLayer,stringWhereClause)
9. {
10. IFeatureSelectionpFeatureSelection=pFeatureLayerasIFeatureSelection;
11. if(pFeatureSelection==null)return null;
12. IQueryFilterpQueryFilter=newQueryFilterClass();
13. pQueryFilter.WhereClause=WhereClause;
14. pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
15. returnpFeatureSelection;
16. }
复制代码
IFeatureLayerDefinition接口定义了CreateSelectionLayer方法,可以将一个图层选择集中的要素转换为一个单独的要素图层。
3.1.4矢量图层操作实例
以下代码片段演示按行政区加载图层数据的功能,以此理解IFeatureLayerDefinition的CreateSelectionLayer方法的使用。
比方说整个国土资源部有某一类型专题数据有若干图层,每个图层数据的范围是整个中国,这时国土资源部开发一套系统可能有这个需求,每个省只能加载本省的数据。
以下函数即为按按行政区范围创建行政区范围的图层。
比方说我想获取河南省的数据只需传入行政区图层中河南省图元的Geometry即可。
另外如果如果遇到行政区层必须用esriSpatialRelEnum. esriSpatialRelContains这个参数,否则行政区这个图层就不能只获取河南这个省份,它会把河南省的周围省份,河北,湖北,安徽,陕西,山东,山西等省份的图元也添加创建到新图层。
1.
2. ///
3. ///按行政区范围创建行政区范围的图层
4. ///
5. ///
6. ///
7. ///
8. ///
9. privateIFeatureLayer GetSelectionLayer(IFeatureLayerpFeatureLayer,IGeometrypGeometry,boolbXZQ)
10. {
11. try
12. {
13. if(pFeatureLayer!
=null&&pGeometry!
=null)
14. {
15. IQueryFilterpQueryFilter;
16. ISpatialFilterpSpatialFilter=newSpatialFilterClass();
17. IFeatureSelectionpFeatureSelection=pFeatureLayerasIFeatureSelection;
18. pSpatialFilter.GeometryField=pFeatureLayer.FeatureClass.ShapeFieldName;
19. pFeatureSelection.Clear();
20. if(!
bXZQ)
21. {
22. pSpatialFilter.Geometry=pGeometry;
23. pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;
24. pQueryFilter=pSpatialFilter;
25. pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultNew,false);
26. }
27. else
28. {
29. pSpatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelContains;
30. pQueryFilter=pSpatialFilter;
31. if(pGeometryisIGeometryCollection)
32. {
33. for(inti=0;i<(pGeometryasIGeometryCollection).GeometryCount;i++)
34. {
35. pSpatialFilter.Geometry=(pGeometryasIGeometryCollection).get_Geometry(i);
36. pFeatureSelection.SelectFeatures(pQueryFilter,esriSelectionResultEnum.esriSelectionResultAdd,false);
37. }
38. }
39. }
40. IFeatureLayerDefinitionpFLDefinition=pFeatureLayerasIFeatureLayerDefinition;
41. IFeatureLayerpNewFeatureLayer=pFLDefinition.CreateSelectionLayer(pFeatureLayer.Name,true,null,null);
42. pNewFeatureLayer.MaximumScale=pFeatureLayer.MaximumScale;
43. pNewFeatureLayer.MinimumScale=pFeatureLayer.MinimumScale;
44. pNewFeatureLayer.Selectable=pFeatureLayer.Selectable;
45. pNewFeatureLayer.Visible=pFeatureLayer.Visible;
46. pNewFeatureLayer.ScaleSymbols=pFeatureLayer.ScaleSymbols;
47. returnpNewFeatureLayer;
48. }
49. else
50. {
51. returnnull;
52. }
53. }
54. catch(ExceptionErr)
55. {
56. MessageBox.Show(Err.Message,"获取SelectionLayer",MessageBoxButtons.OK,MessageBoxIcon.Information);
57. returnnull;
58. }
59. }
复制代码
IIdentify接口定义了获得要素图层单个要素的属性的
ILayerFields接口可以直接获取一个要素图层的要素类字段集合
ILayerEffects接口用来设置一个要素图层的透明度,对比度,对比度。
以下代码片段演示如何设置要素图层特效:
1.
2. ///
3. ///设置图层特效
4. ///
5. ///
6. ///
7. ///
8. ///
9. privatestaticvoidSetLayerEffects(IFeatureLayerpFeatureLayer,shortbrightness,shortcontrast,shorttransparency)
10. {
11. ILayerEffectspLayerEffect=pFeatureLayerasILayerEffects;
12. pLayerEffect.Brightness=brightness;
13. pLayerEffect.Contrast=contrast;
14. pLayerEffect.Transparency=transparency;
15. }
复制代码
3.2地图布局
3.2.1PageLayout对象
PageLayout用以显示地图数据,并通过对地图数据进行整饰以便对地图打印输出满足不同行业对GIS出图功能的需求。
PageLayout和Map这两个对象看起来非常相似,它们都是视图对象,可以显示地图;也都是图形元素的容器,可以容纳图形元素(GraphicsElement)。
但是所能够保存的图形类型却是有差别的。
PageLayout除了保存图形元素外,还可以保存诸如MapFrame的框架元素(FrameElement)。
PageLayout控件上的Map对象被PageLayout的MapFrame对象所管理的。
PageLayout类主要实现了IPageLayout接口,它定义了用于修改页面版式(layout)的方法和属性。
IPageLayout的方法ZoomToWhole方法可以让PageLayout以最大尺寸显示;
IPageLayout的ZoomToPercent方法可以按照输入的比例显示;
IPageLayout的ZoomToWidth方法可以让视图显示的范围匹配控件对象的宽度。
IPageLayout的Page属性用以获取Page对象
IPageLayout的RulerSettings属性用以获取RulerSettings对象
IPageLayout的HorizontalSnapGuides和VerticalSnapGuides属性用以获取SnapGuides对象
如下图所示:
下载(215.78KB)
2009-5-1809:
19
图4
3.2.2Page对象
Page对象主要来管理PageLayout对象中的页面,它用来加载地理数据,但不提供分析和查询功能。
Page类的主要接口是IPage,它除了用于管理Page的颜色,尺寸和方向,还可以管理边框类型和打印区域等。
例如通过IPage的FromID可以直接设置纸张大小类型(A4,A3等)。
3.2.3SnapGrid对象
Sna
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ArcGIS Engine基础开发教程3学习地图和地图布局 Engine 基础 开发 教程 学习 地图 布局