当前位置:文档之家› 优-ArcEngine基础开发教程C#二次开发ArcGis

优-ArcEngine基础开发教程C#二次开发ArcGis

优-ArcEngine基础开发教程C#二次开发ArcGis
优-ArcEngine基础开发教程C#二次开发ArcGis

ArcGIS Engine基础开发教程(1)——创建第一个ArcGIS Engine桌面应用程序

1创建第一个ArcGIS Engine桌面应用程序

ArcGIS Engine9.3提供了丰富的GIS组件方便用户快速的定制开发一个GIS应用程序,无需写代码即可实现GIS 数据加载,地图操作等功能甚至可以实现高级编辑以及空间分析功能。接下来使用ArcGIS Engine9.3提供了MapControl Application模块来创建第一个ArcGIS Engine桌面应用程序,并为桌面应用应用程序提供编辑功能。

1.1目标

1.创建第一个ArcGIS Engine桌面应用程序

2.为应用程序添加编辑功能。

1.2准备工作

1 .IDE:Visual Studio 2005/2008 2. ArcGIS Engine Developer kit 9.3 3. 制作ArcGIS实验数据地图文档MXD 1.3设计流程图

1.4制作地图文档

在ArcMap中加载数据后,点击保存生成一个*.mxd地图文档,如图1所示:

1.5创建第一个ArcGIS Engine桌面应用程序

在Visual Studio2008中新创建项à选择àArcGISàEngineàMapControl Application,点击确定,如图2所示:

可以看到在Visual Studio中看到在新创建的项目中自动加载了ToolBarControl、TocControl、LicenseControl、MapControl四个ArcGIS Engine控件以及一个.NET ToolStripMenuItem菜单控件,如图3所示:

1.6加载MXD地图文档数据

单击F5键运行程序,然后单击打开MXD地图文档按钮打开MXD地图文档,如图4所示:

可以看到应用程序把MXD地图文档加载到MapControl地图上,可以使用ToolbarControl提供的常用GIS 功能如:放大,缩小,信息查询等功能。如图5所示:

1.7为应用程序添加编辑功能

在应用程序设计模式下右键单击ToolbarControl,单击属性选项弹出ToolbarControl属性对话框,单击Items选项卡,单击Add…按钮弹出Controls Commands对话框,单击Toolset选项卡,选择Feature Editors选项,拖动到属性对话框工具栏的指定位置。如图6所示

1.8体验使用编辑功能

运行应用程序,可见工具条多了一个和ArcMap中功能类似的编辑工具集,开始对面图层进行编辑创建一个新的面图元,如图7所示。

综上GIS应用开发人员通过使用ArcGIS Engine可以快速创建自定义GIS应用程序。

ArcGIS Engine基础开发教程(2)——学习几何对象与空间参考

2.1目标

1.熟悉ArcGIS Engine Geometry模型,通过程序构建常用几何对象2.熟悉空间参考

3.通过野外测量点构建一个polygon shapefile功能开发

2.2准备工作

1.IDE:Visual Studio 2005/2008 2.ArcGIS Engine Developer kit 9.3

3.自造一份包含X,Y坐标的*.txt文本文档数据(即野外测量点)

2.3Geometry主要几何对象模型图

Geometry是ArcGIS Engine中使用最为广泛的对象集之一,用户在创建、删除、编辑和进行地理分析的时候,就是处理一个包含几何形体的矢量对象;除了显示要素意外,控件对象选择,要素符号化,标注要素,编辑要素都需要Geometry参与。图1是Geometry的主要几何对象模型图,接下来将一一介绍这些几何对象。

2.4几何对象

2.4.1Point和MultiPoint几何对象

2.4.1.1Point几何对象

Point:是一个0维的几何图形,具有X,Y坐标值,以及一些可选的属性:如高程值(Z值),度量值(M值) 和ID 号,点对象用于描述精确定位的对象,例如一个电话亭在一个城市的精确位置以下代码演示如何创建一个Point 对象:

IPoint pPoint = new PointClass();

pPoint.X = 100;

pPoint.Y = 100;

2.4.1.2MultiPoint几何对象

MultiPoint:点集对象是一系列无序的点的群集,这些点具有相同的属性信息。例如可以用一个点集来表示整个城市天然气调压站。如下图所示:一个Multipoint对象由6个Point对象组成。

以下代码片段演示如何构建Multipoint对象:

//定义第一个点

IPoint pPoint1 = new PointClass();

pPoint1.X = 100;

pPoint1.Y = 100;

//定义第二个点

IPoint pPoint2 = new PointClass();

pPoint2.X = 200;

pPoint2.Y = 200;

……//构建其他点

IPointCollection pMultipoint = new MultipointClass();

object o=Type.Missing;

//添加第一个点,不需要设置点的顺序,参数设置为Type.Missing

pMultipoint.AddPoint(pPoint1, ref o, ref o);

//添加第二个点,不需要设置点的顺序,参数设置为Type.Missing

pMultipoint.AddPoint(pPoint2, ref o, ref o);

……//添加其他点

2.4.2Segment几何对象

2.4.3Path和Ring几何对象

2.4.

3.1Path几何对象

Path是连续的Segment的集合,除了路径的第一个Segment和最后一个Segment外其余的Segment的起始点都是前一个Segment的终止点,即Path对象的中的Segment不能出现分离,Path可以是任意数的Line,CircularArc,EllipticArc和BezierCurve的组合。

一个或多个Path组成一个Polyline对象。

2.4.

3.2Ring几何对象

Ring是一个封闭的Path即起始和终止点有相同的坐标值。它有内部和外部属性。

一个或多个Ring对象组成一个Polygon对象。

2.4.4Polyline和Polygon几何对象

2.4.4.1Polyline几何对象

Polyline对象是由一个或多个相连或者不相连的path对象的有序集合,它可以是单个Path对象组成,也可以是多个相连的Path对象组成,或者是多个分离的Path组成,如下图所示。Polyline通常用来代表线状地物如道路,河流,管线等等。

一个Polyline对象必须满足以下准则:

1.组成Polyline对象的所有Path对象必须是有效的。

2.组成Polyline对象的所有Path对象不能重合,相交或自相交。

3.组成Polyline对象的多个Path对象可以连接与某一点,也可以分离。

4.Path对象的长度不能为0.

IPolyline是Polyline类的主要接口,IPolyline的Reshape方法可以使用一个Path对象为一个Polyline对象整形,IPolyline的SimplifyNetwork方法用于简化网络。

Polyline对象可以使用IGeometryCollection接口添加Path对象的方法来创建,使用该接口需注意以下情况:

1.每一个Path对象必须是有效的,或使用IPath::Simplify方法后有效。

2.由于Polyline是Path对象的有序集合,所以添加Path对象时必须注意顺序和方向。

3.为了保证Polyline是有效的,可以创建完Polyline对象后使用ITopologicalOperator接口的Simplify方法。

以下代码片段为使用IGeometryCollection接口创建一个Polyline对象:

//定义第一个点

IPoint pPoint1 = new PointClass();

pPoint1.X = 100;

pPoint1.Y = 100;

//定义第二个点

IPoint pPoint2 = new PointClass();

pPoint2.X = 200;

pPoint2.Y = 200;

//创建一个Line对象

ILine pLine= new LineClass();

//设置Line对象的起始终止点

pLine.PutCoords(pPoint1,pPoint2);

//QI到ISegment

ISegment pSegment= pLine as ISegment;

//创建一个Path对象

SegmentCollection pPath= new PathClass();

object o=Type.Missing;

//通过ISegmentCollection接口为Path对象添加Segment对象

pPath.AddSegment(pSegment,ref o,ref o);

//创建一个Polyline对象

IGeometryCollection pPolyline = new PolylineClass();

//通过IGeometryCollection为Polyline对象添加Path对象

pPolyline.AddGeometry(pPath as IGeometry, ref o, ref o);

2.4.4.2Polylgon几何对象

2Polylgon对象是由一个或多个Ring对象的有序集合,它可以是由单个Ring 对象构成,也可以使用多个Ring 组成如下图所示。其中Ring可以分为Outer Ring(外环)和Inner Ring(内环)之分。外环和内环都是有方向的,它们的区别是外环的方向是顺时针的,内环的方向是逆时针。Polygon通常用来代表有面积的多边形矢量对象,如行政区,建筑物等。

以下代码片段演示如何构建一个Polygon:

//创建一个Ring对象,通过ISegmentCollection接口向其中添加Segment对象

ISegmentCollection pSegCollection = new RingClass();

object o = Type.Missing;

pSegCollection.AddSegment(pSegment1, ref o, ref o);

pSegCollection.AddSegment(pSegment2, ref o, ref o);

//QI到IRing接口封闭Ring对象,使其有效

IRing pRing = pSegCollection as IRing;

pRing.Close();

//使用Ring对象构建Polygon对象

IGeometryCollection pGeometryColl = new PolygonClass();

pGeometryColl.AddGeometry(pRing, ref o, ref o);

2.4.5Envelope几何对象

Envelope是所有几何对象的外接矩形,用于表示几何对象的最小边框,所有的几何对象都有一个Envelope 对象,IEnvelope是Envelope对象的主要接口,通过它可以获取几何对象的XMax,XMin,YMax,YMin,Height,Width 属性。通过IEnvelope的Expand方法还可以按比例缩放Envelope对象的范围,如下图所示:

2.4.6Curve对象几何对象

除去Point,MultiPoint和Envelope外,其他所有的几何体都可以看做是Curve(曲线)。Line,Polyline,Polygon,CircularArc,BezierCurve,EllipticArc和CircularArc都是曲线的一种,它们都实现了ICurve 接口。

ICurve接口的Length属性用于返回一个Curve对象的长度。

ICurve接口的FromPoint和ToPoint属性可以获得Curve对象的起止点。

ICurve接口的Reverseorientation方法可以改变一个Curve对象的节点次序即调动Curve对象的起始点和终止点互相调换。

ICurve接口的IsClosed属性则可以判断一个Curve对象起始点和终止点是否在一个位置上。

ICurve接口的GetSubcurve方法可以复制一条Curve对象的特定部分,例如一条10千米公路的Curve对象,获取2-5千米处的公路的曲线代码片段如下所示:

//QI到ICurve接口

ICurve pCurve = pPolyline as ICurve;

//创建一个Polyline对象

ICurve pNewCurve = new PolylineClass();

bool btrue= true;

//获取-5千米间的曲线对象

pCurve.GetSubcurve(2, 5, btrue, out pNewCurve);

此外ICurve的QueryTangent和QueryNormal方法分别用于获取Curve对象上某一点的曲线的切线和法线。2.4.7 Triangle Strip和Trangle Fan, Trangle,Ring几何对象

Triangle Strip和Trangle Fan, Trangle,Ring是构成MultiPatch几何对象的构建对象。

2.4.7.1Triangle Strip几何对象

TriangelStrip对象是由一系列点定义的曲面片组成,而曲面片是有若干个三角形所组成,所以这个曲面可以定义为:(0,1,2) ,(2, 1, 3), (2, 3, 4), (4, 3, 5)。

2.4.7.2Trangle Fan几何对象

一个Trangle Fan对象由一系列点定义的曲面片组成,所不同的是所有的三角形共享一个顶点。如下图所示,所以这个曲面可以定义为:(0,1,2) ,(0,2, 3), (0, 3, 4), (0, 4, 5)。

2.4.7.3Triangle几何对象

Triangle由三个点所确定如下图,一个Triangle可定义为(0,1,2)等。

2.4.7.4Ring几何对象

Ring和前边介绍的组成Polygon的Ring一样,例如下边一个房屋组成它的墙是个OutRing对象,而窗户和门是InnerRing对象。

2.4.8Multipatch几何对象

Multipatch几何对象用于描述3D图形,可以由TriangleStrip, TriangleFan, Triangle和ring对象组合构成组成。Multipatch可以通过多种方式创建,一种是通过导入外部3D格式数据文件(3D Studio Max .3ds files, OpenFlight .flt files, COLLADA .dae files, Sketchup .skp files, VRML .wrl files),另外ArcGIS Engine提供了多种创建Multipatch几何对象的方法:

如果创建没有贴图纹理,没有法向,没有组成部分信息的Multipatch时,只需创建好组成的Multipatch的各个部分即可,然后通过MultiPatch的IGeometryCollection接口添加各个组成部分即可。

如果要为Multipatch每个组成部分添加纹理信息,法向信息,属性信息就必须使用GeneralMultiPatchCreator对象来创建,通过其IGeneralMultiPatchInfo接口来为MultiPatch各个组成部分定义法向,材质,属性信息。通过IGeneralMultiPatchInfo接口可以获取这些MultiPatch的各个组成部分的信息。

通过IConstructMultiPatch接口和IExtrude接口操作GeometryEnvironment对象可以通过拉伸Polyline对象(拉伸为墙)和Polygon对象(拉伸为多面体)来创建MultiPatch.

通过访问3D符号库,获取3DSymbol来渲染点,把三维符号放置在点的位置从而生成Multipatch.

下图为MultiPatch对象的贴图原理:

接下来给大家介绍通过GeneralMultiPatchCreator创建一个有纹理MultiPatch的方法:需要使用以下三个对象:GeometryMaterial:用于构建材质,通过IGeometryMaterial创建的材质可以作为TextureLineSymbol或者TextureFillSymbol属性用来创建这些符号,也可以把它添加到GeometryMaterialList对象中,用于GeneralMultipatchCreator对象构建Multipatch对象。

GeometryMaterialList:材质对象的容器用于GeneralMultiPatchCreator对象调用Init方法时使用。GeneralMultiPatchCreator:用于创建有纹理的贴图的Multipatch.。

以下代码片段演示如何创建一个MultiPatch对象

///

///构建Multipatch几何对象

///

///返回Multipatch几何对象

public IMultiPatch CreateMultipatch()

{ try

{ //创建图形材质对象

IGeometryMaterial texture = new GeometryMaterialClass();

texture.TextureImage = @"C:\Temp\MyImage.jpg";

//创建材质列表对象

IGeometryMaterialList materialList = new GeometryMaterialListClass();

//向材质列表添加材质

materialList.AddMaterial(texture);

//创建GeneralMultiPatchCreator对象

IGeneralMultiPatchCreator multiPatchCreator = new GeneralMultiPatchCreatorClass(); multiPatchCreator.Init(4, 1, false, false, false, 4, materialList);

//设置Part:可以使三角扇或环

multiPatchCreator.SetPatchType(0, esriPatchType.esriPatchTypeTriangleStrip);

multiPatchCreator.SetMaterialIndex(0, 0);

multiPatchCreator.SetPatchPointIndex(0, 0);

multiPatchCreator.SetPatchTexturePointIndex(0, 0);

//创建真实points.

WKSPointZ upperLeft = new WKSPointZ();

WKSPointZ lowerLeft = new WKSPointZ();

WKSPointZ upperRight = new WKSPointZ();

WKSPointZ lowerRight = new WKSPointZ();

upperLeft.X = 0;

upperLeft.Y = 0;

upperLeft.Z = 0;

upperRight.X = 300;

upperRight.Y = 0;

upperRight.Z = 0;

lowerLeft.X = 0;

lowerLeft.Y = 0;

lowerLeft.Z = -100;

lowerRight.X = 300;

lowerRight.Y = 1;

lowerRight.Z = -100;

multiPatchCreator.SetWKSPointZ(0, ref upperRight);

multiPatchCreator.SetWKSPointZ(1, ref lowerRight);

multiPatchCreator.SetWKSPointZ(2, ref upperLeft);

multiPatchCreator.SetWKSPointZ(3, ref lowerLeft);

//设置贴图的点

WKSPoint textureUpperLeft = new WKSPoint();

WKSPoint textureLowerLeft = new WKSPoint();

WKSPoint textureUpperRight = new WKSPoint();

WKSPoint textureLowerRight = new WKSPoint();

textureUpperLeft.X = 0; textureUpperLeft.Y = 0;

textureUpperRight.X = 1; textureUpperRight.Y = 0;

textureLowerLeft.X = 0; textureLowerLeft.Y = 1;

textureLowerRight.X = 1; textureLowerRight.Y = 1;

multiPatchCreator.SetTextureWKSPoint(0, ref textureUpperRight);

multiPatchCreator.SetTextureWKSPoint(1, ref textureLowerRight);

multiPatchCreator.SetTextureWKSPoint(2, ref textureUpperLeft);

multiPatchCreator.SetTextureWKSPoint(3, ref textureLowerLeft);

//创建MultiPatch对象

IMultiPatch multiPatch = multiPatchCreator.CreateMultiPatch() as IMultiPatch;

return multiPatch;

}

catch (Exception Err)

{ MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, https://www.doczj.com/doc/3b18241830.html,rmation);

}

}

2.4.9Geometry集合接口

通过前边对于具体的Geometry对象的介绍可知,除了Point对象之外,其他几何对象都是通过其他几何对象集合构建而成。如MultiPoint对象是点的集合,Path对象是Segment对象的集合,Polyline对象是Path对象的集合,Polygon对象是Ring对象的集合,Multipatch对象是Triangle Strip和Trangle Fan, Trangle,Ring对象的集合。ArcGIS Engine提供了三个主要的几何图形集合接口用于对几何对象的操作,分别是IPointCollection,ISegmentCollection和IGeometryCollection,这些接口揭示出ArcGIS Engine的几何模型的实质

——它们是一种组合构成的模式,这种组合并不一定按照严格的层次结构组织。

在前面介绍一些几何对象的时候,也给大家演示了部分使用功能,这三个接口在程序开发中经常使用到,接下来简单阐述以下这三个接口的使用方法。

2.4.9.1IGeometryCollection接口

IGeometryCollection接口被和GeometryBag所实现。IGeometryCollection接口提供的方法可以让开发者对一个几何对象的组成元素即子对象进行添加,改变和移除。例如:

组成Polyline对象的子对象是Path对象。

组成Polygon对象的子对象是Ring对象。

组成Multipoint对象的子对象是Point对象。

组成MultiPatch对象的子对象是TrangleFan TrangleStrip,Triangle或Ring对象。

组成GeometryBag对象的是任何类型的几何体对象,实际上GeometryBag是一个可以容纳任何类型几何对象的容器。

IGeometryCollection的Geometry 属性可以通过一个索引值返回一个组成该几何对象的某个子对象,而GeometryCount返回组成该几何对象的子对象的数目。

IGeometry的AddGeometry和AddGeometries方法都用于向一个几何对象添加子对象,它们的区别是前者一次只能添加一个几何对象,而后者可以一次添加一个几何对象数组。除此之外,AddGeometry方法可以将子对象添加到几何的指定索引值的位置,而AddGeometries方法将子对象数组添加到集合的最后。

在使用AddGeometry方法添加子对象到Polygon对象的过程中,如果子对象即Ring出现覆盖现象,那么多边形就没有封闭或出现了包含关系,那么这个Polygon就不是简单Polygon,因此通过IGometryCollection来创建一个Polygon时,需要使用ITopologicalOperator 的Simplify方法保证其有效性。

通过IGeometryCollection创建一个Polygon对象的代码片段如下:

///

///构造Polygon对象

///

///Ring对象集合

///返回一个Polygon对象

private IPolygon ConstructorPolygon(List pRingList)

{ try

{ //创建一个Polygon对象

IGeometryCollection pGCollection = new PolygonClass();

object o = Type.Missing;

//遍历Ring集合

for(int i=0;i

{ //通过IGeometryCollection接口的AddGeometry方法向Polygon对象中添加Ring子对象pGCollection.AddGeometry(pRingList, ref o, ref o);

}

//QI至ITopologicalOperator

ITopologicalOperator pTopological = pGCollection as ITopologicalOperator;

//执行Simplify操作

pTopological.Simplify();

IPolygon pPolygon=pGCollection as IPolygon;

//返回Polygon对象

return pPolygon;

}

catch (Exception Err)

{ MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,,https://www.doczj.com/doc/3b18241830.html,rmation);

return null;

}

}

同样可以通过IGeometryCollection的AddGeometryCollection方法可以将一个Polygon中的所有子对象Ring添加到另外一个多边形中,这样就实现了合并两个多边形对象为一个多边形对象的功能,这非常有用。

以下代码片段演示如何合并两个Polygon对象为一个Polgyone对象:

///

///合并两个Polygon

///

///第一个Polygon

///第二个Polygon

///返回合并后的Polygon

private IPolygon MergePolygons(IPolygon firstPolygon, IPolygon SecondPolygon)

{ try

{

//创建一个Polygon对象

IGeometryCollection pGCollection1=new PolygonClass();

IGeometryCollection pGCollection2 = firstPolygon as IGeometryCollection;

IGeometryCollection pGCollection3 = SecondPolygon as IGeometryCollection;

//添加firstPolygon

pGCollection1.AddGeometryCollection(pGCollection2);

//添加SecondPolygon

pGCollection1.AddGeometryCollection(pGCollection3);

//QI至ITopologicalOperator

ITopologicalOperator pTopological = pGCollection1 as ITopologicalOperator;

//执行Simplify操作

pTopological.Simplify();

IPolygon pPolygon=pGCollection1 as IPolygon;

//返回Polygon对象

return pPolygon;

}

catch (Exception Err)

{ MessageBox.Show(Err.Message,"提示",MessageBoxButtons.OK,,https://www.doczj.com/doc/3b18241830.html,rmation);

return null;

}

}

2.4.9.2ISegmentCollection接口

ISegmentCollection接口被Path,Ring,Polyline和Polygon四个类所实现,它们被称作是Segment集合对象,使用这个接口可以处理组成Segment集合对象中的每一个子Segment对象。使用ISegmentCollection接口可以为一个Segment集合对象添加,插入,删除Segment子对象。ISegmentCollection接口SetCircle和SetRectangle方法提供了一种简单不需要添加Segment的情况下构建一个完成的Path,Ring,Polyline和Polygon的方法。

2.4.9.3IPointCollection接口

IPointCollection可以被多个几何对象类所实现,这些对象都是由多个点构成如:Mullipoint,Path,Ring,Polyline,Polygon,TriangleFan,TrangleStrip,Trangle,Multipatch等,它们都可以称作PointCollection对象,通过IPointCollection接口定义的方法可以获取,添加,插入,查询,移除几何对象中的

某个顶点。同以上两个接口一样它也定义了操作一个点集合对象的方法,例如通过AddPoint方法可以向PointCollection对象中的特定索引位添加一个点对象,如果不指定位置,则添加到最后。通过IPointCollection 的Point属性通过顶点索引可以得到某一顶点。

在本章节最后的Demo 实例将为大家演示IPointCollection提供的功能。

2.4.10几何对象总结

在Geometry模型中的几何对象分为两种类型,一类是用来直接构建要素类的称为高级几何对象,一类用来构建高级几何对象相对低一级的几何对象成为构建几何对象如下表所示:

几何对象名

所属类别构成子几何对象用于创建和编辑的接口

Polyline 高级 Path IGeometryCollection, IPointCollection

Polygon 高级 Ring IGeometryCollection, IPointCollection

MultiPoint 高级 Point IGeometryCollection, IPointCollection

MultiPatch 高级 TrangleFan,Ring

,TrangleStrip

,Trangle,

IGeometryCollection,IPointCollection

Ring 低级 Segment ISegmentCollection, IPointCollection

Path 低级 Segment ISegmentCollection, IPointCollection

Segment 低级 Point IPoint,ILine,

ICurve

TriangleFan 低级 Point IGeometryCollection, IPointCollection

TriangleStrip 低级 Point IGeometryCollection, IPointCollection

Triangle 低级 Point IGeometryCollection, IPointCollection

Point 高级/低级无 IPoint 2.5 空间参考

2.5.1空间参考简介

空间参考(Spatial Reference)是GIS数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一

点提供准确的坐标。在同一个地图上显示的地图数据的空间参考必须是一致的,如果两个图层的空间参考不

一致,往往会导致两幅地图无法正确拼合,因此开发一个GIS系统时,为数据选择正确的空间参考非常重要。ArcGIS Engine提供了一系列对象供开发者管理GIS系统的坐标系统。对大部分开发者而言了解ProjectedCoordinateSystem,GeographicCoordinateSystem,SpatialReference Environment这三个组件类是非常

有必要的,对于高级开发者而言,可能需要自定义坐标系统可以使用这些对象Projection,Datum,AngularUnit,Spheriod,PrimeMeridian和GeoTransformation等。

2.5.2修改空间参考

以下代码片段演示了如何改变一个图层的空间参考。

///

/// 改变图层的空间参考

///

/// 图层

/// 空间参考类型

private void ChangeLayerRef(IFeatureLayer pFeatureLayer, int gcsType)

{ try

{ IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

//QI到IGeoDataset

IGeoDataset pGeoDataset = pFeatureClass as IGeoDataset;

//QI到IGeoDatasetSchemaEdit

IGeoDatasetSchemaEdit pGeoDatasetSchemaEdit = pGeoDataset as IGeoDatasetSchemaEdit;

if (pGeoDatasetSchemaEdit.CanAlterSpatialReference == true)

{ //创建SpatialReferenceEnvironmentClass对象

ISpatialReferenceFactory2 pSpaRefFactory = new SpatialReferenceEnvironmentClass();

//创建地理坐标系对象

IGeographicCoordinateSystem pNewGeoSys = pSpaRefFactory.CreateGeographicCoordinateSystem(gcsType);//4214代表Beijing1954

pGeoDatasetSchemaEdit.AlterSpatialReference(pNewGeoSys);

}

}

catch (Exception Err)

{ MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, https://www.doczj.com/doc/3b18241830.html,rmation);

}

}

2.6开发野外测量点构建一个Polygon几何要素程序

2.6.1功能情景描述

现有一存储为*.txt格式文本文件存储野外测量几个建筑物的坐标信息,如图所示,我们需要通过开发一个功能能够读取这些这些坐标信息并根据坐标点建筑物属性来构建建筑物,并创建成一个ShapeFile加载到MapControl 上。

步骤一:添加一个Form,并添加4个Button,2个标签,2个文本框如下图所示:

2.6.2功能开发代码

private AxMapControl buddyMap;

///

/// 关联地图控件

///

public AxMapControl BuddyMap

{ get

{ return buddyMap;

}

set

{ buddyMap = value;

}

}

///

/// 要保存的ShapeFile全路径名称

///

string shapeFileFullName = string.Empty;

///

/// 测量数据全路径名称

///

string surveyDataFullName = string.Empty;

List pColumns = new List();

List pCPointList = new List();

struct CPoint

{ public double x;

public double y;

public string name;

}

private void OpenBtn_Click(object sender, EventArgs e)

{ OpenFileDialog pOFD = new OpenFileDialog();

pOFD.Multiselect = false;

pOFD.Title = "打开本地测量坐标文件";

pOFD.InitialDirectory = System.IO.Directory.GetCurrentDirectory();

pOFD.Filter = "测量坐标文件(*.TXT)|*.TXT";

if (pOFD.ShowDialog() == DialogResult.OK)

{ surveyDataFullName = pOFD.FileName;

this.textBox1.Text = surveyDataFullName;

}

}

private void Savebtn_Click(object sender, EventArgs e)

saveFileDialog = new SaveFileDialog();

{ SaveFileDialog

saveFileDialog.Filter = "Shape文件(*.shp) |*.shp";

DialogResult dialogResult = saveFileDialog.ShowDialog();

if (dialogResult == DialogResult.OK)

{ shapeFileFullName = saveFileDialog.FileName;

}

else

{ shapeFileFullName = null;

return;

}

this.textBox2.Text = shapeFileFullName;

}

///

/// 获取点数据

///

/// 测量数据全路径名称

///

private List GetAllPoint(string surveyDataFullName)

{ try

{ List pList = new List();

if (surveyDataFullName == null || surveyDataFullName == string.Empty)

{ MessageBox.Show("选择野外测量数据");

return null;

}

if (!System.IO.File.Exists(surveyDataFullName))

{ MessageBox.Show("野外测量数据不存在!");

return null;

}

string strLine;

char[] charArray = new char[] {','};

string[] strArray;

System.IO.FileStream aFile = new System.IO.FileStream(surveyDataFullName, FileMode.Open); StreamReader sr = new StreamReader(aFile,Encoding.Default);

strLine = sr.ReadLine();

strArray = strLine.Split(charArray);

if (strArray.Length > 0)

{ for (int x = 0; x < strArray.Length; x++)

{ pColumns.Add(strArray[x]);

}

}

else

{ return null;

}

strLine = sr.ReadLine();

while (strLine != null)

{ strArray = strLine.Split(charArray);

CPoint pCPoint= new CPoint();

pCPoint.x = Convert.ToDouble(strArray[0]);

pCPoint.y = Convert.ToDouble(strArray[1]);

https://www.doczj.com/doc/3b18241830.html, = strArray[2].Trim();

pList.Add(pCPoint);

strLine = sr.ReadLine();

}

sr.Close();

return pList;

}

catch (Exception Err)

{ MessageBox.Show(Err.Message);

return null;

}

}

private IFeatureLayer CreateShpFromPoints(string outfileNamePath)

{ int index = https://www.doczj.com/doc/3b18241830.html,stIndexOf('\\');

string folder = outfileNamePath.Substring(0, index);

shapeFileFullName = outfileNamePath.Substring(index + 1); IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace pFWS = (IFeatureWorkspace)pWSF.OpenFromFile(folder, 0); //如果shapefile存在替换它

if (File.Exists(outfileNamePath))

{ IFeatureClass featureClass = pFWS.OpenFeatureClass(shapeFileFullName); IDataset pDataset = (IDataset)featureClass;

pDataset.Delete();

}

IFields pFields = new FieldsClass();

IFieldsEdit pFieldsEdit;

pFieldsEdit = (IFieldsEdit)pFields;

IField pField = new FieldClass();

IFieldEdit pFieldEdit = (IFieldEdit)pField;

https://www.doczj.com/doc/3b18241830.html,_2 = "Shape";

pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;

IGeometryDef pGeometryDef = new GeometryDefClass(); IGeometryDefEdit pGDefEdit = (IGeometryDefEdit)pGeometryDef; pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; pFieldEdit.GeometryDef_2 = pGeometryDef;

pFieldsEdit.AddField(pField);

pField = new FieldClass();

pFieldEdit = (IFieldEdit)pField;

ArcGISEngine二次开发——提高篇

ArcGIS Engine二次开发 ——提高篇

1缩略图(鹰眼) 鹰眼功能是GIS的主要功能之一,当地图范围很大时,它可以很好的为用户指明当前地图的范围。在本小节中我们将学习如何制作这种鹰眼。 1.1添加控件 新建一个C#.Net项目,项目名称为OverView,将Form1的名字设置为MainForm,并添加ToolbarControl 、两个MapControl和LicenceControl等四个控件。布局如下图所示。左边的axMapControl1用于地图数据显示和操作,右边axMapControl2用于鹰眼显示。 图 1 界面布局 在ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示,并将ToolbarControl的伙伴控件设为axMapControl1。 图2添加按钮 1.2代码添加及解释 鹰眼用来显示主窗体当前视图范围在全景视图中的位置,在ArcMap中使用一个线框在鹰眼视图中标识。当主视图中的视图范围改变时,鹰眼中的线框随之改变,当拖动鹰眼视图中的红线框时,主视图中的视图范围也随之改变。 下面开始实现鹰眼功能,添加、、 三个引用。首先在axMapControl1中视图范围改变时鹰眼窗体要做出对应的响应,即绘制线框并显示,在OnExtentUpdated事件中添加代码如下: private void axMapControl1_OnExtentUpdated(object sender, e) { et项目,项目名称为Buffer,将Form1的名字设置为MainForm,并添加ToolbarControl 、MapControl、TOCControl、LicenceControl和Button等五个控件。并将ToolbarControl 、TOCControl的伙伴控件设为MapControl,Button控件的Name属性设定为btnBuffer,Text属性设定为“缓冲区分析”。控件布局效果如下图所示。 图3控件布局效果 在ToolbarControl 加载添加数据按钮和地图浏览的功能按钮,如下图所示。 图4添加按钮 1.2.1代码添加及解释 首先添加如下四个命名空间的引用。 在使用Geoprocessor工具实现缓冲区分析时,需要首先定义一个Geoprocessor对象,因为命名空间“也包含Geoprocessor类,为了避免混淆,我们使用命名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。然后定义一个操作类Buffer,并设置参数,生成缓冲区的参数包含原始图层,缓冲半径和输出路径,最后使用已定义的Geoprocessor对象执行即可。双击“生成缓存区”按钮,添加代码如下: private void btnBuffer_Click(object sender, EventArgs e) {

Arcgis二次开发软件安装教程

Arcgis二次开发软件安装教程 1.环境配置 Win7 32位系统,Arcgis for Desktop 10.2,jdk-8u101-windows-i586,eclipse-jee-mars-2-win32,ArcGIS_Engine_DevKit_Windows_102_134944 64位win7系统可参考文档:https://www.doczj.com/doc/3b18241830.html,/shugui/p/3795803.html 2.安装过程 1)安装Arcgis for Desktop 10.2 下载地址 https://https://www.doczj.com/doc/3b18241830.html,/share/link?shareid=4262105946&uk=1913532136#path=%252 F 安装教程:https://www.doczj.com/doc/3b18241830.html,/article/e73e26c0cb5c1324adb6a791.html 2)安装jdk 下载地址 https://www.doczj.com/doc/3b18241830.html,/technetwork/java/javase/downloads/jdk8-downloads-2133151. html

具体安装过程参考 https://www.doczj.com/doc/3b18241830.html,/article/6dad5075d1dc40a123e36ea3.html 3)安装Eclipse 下载地址:https://https://www.doczj.com/doc/3b18241830.html,/downloads/packages/release/Mars/2 解压后即可使用 安装教程参考:https://www.doczj.com/doc/3b18241830.html,/article/d7130635194f1513fcf47557.html 4) 安装windowbuilder插件 找到对应版本的windowbuilder,本教程使用4.5版本 https://www.doczj.com/doc/3b18241830.html,/windowbuilder/download.php eclipse在线更新 打开eclipse-->help-->Install New Software-->Add 在location中粘贴刚才复制的链接,OK,等待加载插件信息

ArcGIS_Engine二次开发——基础篇

ArcGIS_Engine二次开发——基础篇 ArcGIS Engine二次开发 ——基础篇

1ArcGIS Engine二次开发——基础篇 1.1第一个简单的A rcGIS Engine地图显示程序 这个例子将引导您创建第一个简单的地图显示程序,并添加基本的缩放和漫游功能。如果您之前没有接触过ArcGIS Engine的开发,那么这个例子是您迈入ArcGIS Engine二次开发大门的极好例子,将从零开始引导您一步一步完成任务。 1.1.1创建一个新的工程 首先打开Microsoft Visual Studio 2005,点击菜单栏中的“文件”—>“新建”—>“项目”,在弹出的对话框中选择新建一个Visual C#的Windows应用程序,之后更改项目名称为“地图浏览”,更改文件的路径为个人实习文件夹,点击“确定”即可。 图1新建项目对话框 选中项目“地图浏览”中的窗体“Form1”,修改其Name属性为“MainForm”,Text 属性为“地图浏览”,

图2窗体命名 1.1.2添加控件及引用 点击编译器最左侧的“工具箱”(不存在时可通过“视图”“工具箱”打开),在弹出的选择项中找到“ArcGIS Windows Forms”项,单击其中的MapControl,之后在Form1的空白处单击鼠标左键不放并拖拽鼠标,直到调整MapControl到合适的大小再松开鼠标(您也可以直接在工具箱中双击MapControl,该控件则会自动加入到Form1中)。用同样的方法,再将LicenseControl添加到Form1中。 图 3 打开工具箱

图4工具箱 如果您在工具箱中找不到MapControl,则请依次尝试以下两种解决方案。首先单击工具栏,待工具箱弹出之后,在工具箱的任意位置上单击鼠标右键,从弹出菜单中选择“重置工具箱”。如果这一步操作之后仍然无法看到MapControl,则在工具箱的任意位置上单击鼠标右键,找到“常规”选项卡,然后在“常规”选项卡上单击鼠标右键,在弹出菜单中单击“选择项(I)…”,在弹出的对话框中选择“.NET Framework组件”,找到“LicenseControl”和“MapControl”,将这两项前的复选框打上勾,最后点击确定即可(如果在“.NET Framework 组件”这个面板中找不到这两项,则选择“COM 组件”面板,在“ESRI LicenseControl”和“ESRI MapControl”前面打勾)。

VS2013中ArcGIS二次开发部分问题问题解决方法

VS2013中ArcGIS二次开发部分问题问题解决方法 1、VS2013中新建项目时没有ArcGIS模板解决办法: 安装ArcGIS10.x会自动生成C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\ArcGIS文件夹 和C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ProjectTemplates\CSharp\ArcGIS文件夹

打开vs2013安装目录: 将上面所说的两个ArcGIS文件夹复制到vs2013安装目录下对应的ItemTemplates\CSharp文件夹和ProjectTemplates\CSharp文件夹, 继续返回vs2013安装目录,找到devenv.exe文件,右击该文件选择属性----兼容性---以管理员身份运行此程序。

在开始菜单栏的所有程序中找到下图文件夹,打开Visual StudioTools, 如下图所示:以管理员身份运行VS2013开发人员命令提示,在打开的命令窗口输入devenv.exe /InstallVSTemplates后回车即可

2、vs2013中工具箱中没有ArcGIS控件解决方法: 在工具箱中右键添加选项卡,并起名为ArcGIS, 在ArcGIS下拉后的空白处右击选择项,在弹出的窗口中点击浏览 找到安装ArcObjects SDK for https://www.doczj.com/doc/3b18241830.html, Framework时的目录DeveloperKit10.2,打开该目录下的DotNet文件夹,选中ESRI.ArcGIS.AxControls.dll文件,

ArcGIS二次开发课程设计

地理信息系统GIS二次开发程序设计 实验报告 班级:10级测绘1班学号: 姓名: 指导教师:

面向接口编程 一、实验目的: 1.理解接口编程、面向对象编程的思想,两者的区别,以及各自的优缺点; 2.掌握AE接口实现图层加载的方法: IworkspaceFactory-->Workspace->IfeatureWorkSpace->IFeatrueClass->IFeature(); 3.理解并掌握使用UI进行属性查询和空间查询; 二.实验内容: 1. 利用IWorkSpace接口在Map中增加一个GeoDatabase图层; 2. 利用Imap的SelectBy*实现简单选择; 3. 利用IQueryFilter实现简单空间查询。(未实现) 三、实验过程 1.接口、面向接口编程基本知识点。 (1)接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则;是在一定粒度视图上同类事物的抽象表示。接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。接口应有两类:第一类是对一个体的抽象,它可对应为一个抽象体(abstract class);第二类是对一个体某一方面的抽象,即形成一个抽象面(interface); 一个体有可能有多个抽象面。 (2)面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法;是与“面向过程”即“我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现”相对应的。 面向对象实现了对象属性与行为的分离,对象之间通过消息进行通信;具有同一属性和行为的对象被抽象成类,每一个类是相同或相似属性和方法的封装;类与类之间具有继承和派生关系。 (3)面向接口与面向对象的区别: 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)是针对编程开发的对象而言的,不是同一感念。 interface关键字用来声明一个接口,它可以产生一个完全抽象的类,并且不提供任何具体实现。 2.GeoDatabase的数据加载: (1)理解 Workspace是一个容器,包含了空间和非空间数据集,如feature class,raster dataset,table。提供了一系列创建和操作数据集的方法。 FeatureClass 是空间事物的顶级类,类似与C#中的Object类,提供了一系列属性和方法。在同一个FeatureClass中的Feature具有相同的属性字段。 FeatureLayer是一个基于矢量数据的图层,典型的数据包括Geodatabase、coverage和shapefile等,FeatureLayer可以直接在MapControl中显示。

arcgis 二次开发

gis的开发方法有三种,即独立开发,宿主型二次开发,基于gis组件的二次开发,其中独立开发为底层开发,不依赖于任何gis工具软件,开发难度太大,后两者是基于一种软件的二次开发,这样的二次开发则相对较简单,他的好处也是显而易见的。 宿主型二次开发是指基于GIS平台软件上进行应用系统开发。大多数GIS 平台软件都提供了可供用户进行二次开发的脚本语言,如ESRI的ArcView提供 了Avenue语言,Maplnfo公司的MapInfo Professional提供了MapBasic语言 等等。用户可以利用这些脚本语言,以原GIS软件为开发平台,开发出自己的 针对不同应用对象的应用程序。这种方式省时省心,但进行二次开发的脚本语言, 作为编程语言,功能极弱,用它们来开发应用程序仍然不尽如人意,并且所开发 的系统不能脱离GIS平台软件,是解释执行的,效率不高。相比基于组件的二次开发可以根据自己的需要扩展系统的功能,并且可以脱离原gis平台软件,综合看来,单纯二次开发受gis基础平台提供的编程语言的限制,而基于组件式的二次开发不仅能提高开发效率,同时可靠性好,易于移植,便于维护。所以,结合gis基础平台软件与当今可视化开发语言的组件式二次开发成为gis开发的主流。但是二次开发也不是十全十美的,只要我们使其中的瑕疵减少,误差也就会减少。 ArcGIS Engine开发工具包是一个基于组件的软件开发产品,用于建立和部署自定义GIS和制图应用程序。ArcGIS Engine开发工具包不是一个终端用户产品,而是一个应用程序开发人员的工具包。可以用ArcGIS Engine开发工具包建立基本的地图浏览器或综合、动态的GIS编辑工具。使用ArcGIS Engine开发工具包,开发人员在建立定制的地图接口方面具有前所未有的灵活性。开发人员可以使用几个API中的任何一个来建立独一无二的应用程序,或者将ArcGIS Engine组件与其他软件组件组合起来实现地图与用户管理信息之间的协同关系。 (可选资料) 从第一个GIS系统一加拿大地理信息系统(CGIS)到目前用户可以自己定制 的GIS系统,GIS二次开发经历了巨大的变化。在这个发展过程中主要出现了两 种GIS二次方式,即宿主型二次开发和基于GIS组件的二次开发131。 GIS开发过程中常用的两种构架(c/s和B/S) 基于c/s结构的GIS是 由客户机完成GIS分析、输出工作。GIS数据和分析工具最初放在服务器上,运 行时下载到客户机,操作灵活。但是c/s应用软件模式大都是基于“胖客户机” 结构下的两层结构应用软件。客户端软件一般由应用程序及相应的数据库连接程 序组成,服务器端软件一般是某种数据库系统。客户机端软件的主要功能是处理 与用户的交互、按照某种应用逻辑实现与数据库系统的交互;服务器端软件的主 要功能是数据库系统根据客户端软件的请求进行数据库操作,然后将结果传送到 客户端软件。客户端软件与服务器端软件之问的通信主要是通过SQL语句。两层 C/S结构应用软件的开发工作主要集中在客户端,客户端端软件不但要完成用户

应用型ArcGIS开发的三种实现方式

应用型ArcGIS开发的三种实现方式 (1)独立开发 指不依赖于任何GIS工具软件,从空间数据的采集、编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计,然后选用某种程序设计语言,如Visual C++、Delphi等,在一定的操作系统平台上编程实现。这种方式的好处在于无须依赖任何商业GIS工具软件,减少了开发成本,但一方面对于大多数开发者来说,能力、时间、财力方面的限制使其开发出来的产品很难在功能上与商业化GIS工具软件相比,而且在购买GIS工具软件上省下的钱可能还抵不上开发者在开发过程中绞尽脑汁所花的代价。 (2)单纯二次开发 指完全借助于GIS工具软件提供的开发语言进行应用系统开发。GIS工具软件大多提供了可供用户进行二次开发的宏语言,如ESRI的ArcView提供了Aven ue语言,MapInfo公司研制的MapInfo Professional提供了MapBasic语言等等。用户可以利用这些宏语言,以原GIS工具软件为开发平台,开发出自己的针对不同应用对象的应用程序。这种方式省时省心,但进行二次开发的宏语言,作为编程语言只能算是二流,功能极弱,用它们来开发应用程序仍然不尽如人意。 (3)集成二次开发 集成二次开发是指利用专业的GIS工具软件,如ArcView、MapInfo等,实现GIS的基本功能,以通用软件开发工具尤其是可视化开发工具,如Delphi、V isual C++、Visual Basic、Power Builder等为开发平台,进行二者的集成开发。 集成二次开发目前主要有两种方式: 1.OLE/DDE 采用OLE Automation技术或利用DDE技术,用软件开发工具开发前台可执行应用程序,以OLE自动化方式或DDE方式启动GIS工具软件在后台执行,利用回调技术动态获取其返回信息,实现应用程序中的地理信息处理功能; 2. GIS 控件 利用GIS工具软件生产厂家提供的建立在OCX技术基础上的GIS功能控件,如ESRI的MapObjects、MapInfo公司的MapX等,在Delphi等编程工具编制的应用程序中,直接将GIS功能嵌入其中,实现地理信息系统的各种功能。

ArcGIS进行二次开发别人经验

请问怎样利用ArcGIS进行二次开发? 2012-10-05 17:42|分类:|浏览1995次 我装了arcgis10.上面有arcGlobe,arcSence,arcCatalog,arcMap.只有这些能进行开发吗?l 另外需要装arcgis object和arcEngine吗? 分享到: 2012-10-07 16:10提问者采纳 安装ArcGIS10.0后,装(如Visual Studio),如果已经有,跳过这一步直接安装ArcGIS SDK 及AE并授权,即可在中使用来做。 ArcGIS Map、Server、Catalog、Scene、Globe都是基于ArcGIS Object开发出来的产品;ArcGIS Engine也是基于ArcGIS Object的类库封装起来的一个开发产品,用来自定义开发C/S端应用GIS。 追问 我比较擅长使用C#,但是好像所提供的开发包没有支持c#语言的??我装的vs2010也是C#环境。 回答 好,C#属于.NET,装SDK For .NET就行了。 提问者评价 谢谢你耐心的指导,问题算是解决了。 想自学ArcGIS二次开发,Java语言 2012-03-28 12:11|分类:|浏览529次 想自学ArcGIS二次开发,使用Java语言,本人目前水平:C语言一点基础,做过谭浩强C程序设计上的大部分题,无实际开发经验,会一点ArcGIS简单操作。请问各位高手、大侠:我该如何入手,学习步骤、方法,再推荐一些书籍。谢谢! 分享到:

2012-03-28 15:25提问者采纳 要学开发,必须要先学Java语言,了解编程;之后要熟悉软件的架构与原理,然后你就可以进行的学习了。不过现实中用的ArcGIS Server开发比较多,学习的时候可以偏重些。 追问 能推荐些书籍吗,哪些书比较好,有没有一些相关学习资源? 回答 学习Java的话当然是《Java入门经典》 学习Server的话,比较好的书比较少,不过你可以看一下AE的书籍。当然如果你的英语比较好的话建议你上https://www.doczj.com/doc/3b18241830.html,和程序中自带的一些例子 用JAVA进行ARCGIS二次开发的源代码 2012-09-03 16:56提问者悬赏:5分||分类:|浏览19次 我有更好的答案 分享到: 1条回答 2012-09-04 20:00|三级最快回答 可用装好sdk for java,在program lifes下会有实例。。

ArcGIS二次开发测量功能

ArcGIS二次开发之实现测量功能 ArcGIS二次开发之实现测量功能,源代码如下:copyright dedecms public override void OnMouseDown(int Button, int Shift, int X, int Y) https://www.doczj.com/doc/3b18241830.html, { // TODO: Add Tool2.OnMouseDown implementation m_bInUse = true; m_pStartPoint = m_hookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); } public override void OnMouseMove(int Button, int Shift, int X, int Y) { // TODO: Add Tool2.OnMouseMove implementation bFirstTime = false; IPoint pPoint; IRgbColor pRGBColor; ILine pLine; ISymbol pSymbol = null; double dAngle; double dDeltaX; double dDeltaY; double dDistance; IPolyline pPolyline; ISegmentCollection pSegmentCollection; 内容来自dedecms if (m_pLinePolyline == null) { bFirstTime = true; }

Arcgis Engine二次开发实验报告

GIS二次开发实验报告 学号:201420310115 姓名:李梦南 班级:1423101 专业:地理信息系统 任课老师:李小龙 二零一七年六月十二日

目录 1实验一:AOI书签开发 (1) 1.1实验目的 (1) 1.2实验内容 (1) 1.3实验步骤与结果 (1) 2.1实验目的 (5) 2.2实验内容 (5) 2.3实验步骤与结果 (5) 2实验三:地图渲染 (9) 3.1实验目的 (9) 3.2实验内容 (9) 3.3实验步骤结果 (9) 3实验四:空间数据处理 (16) 4.1实验目的 (16) 4.2实验内容 (16) 4.3实验步骤与结果 (16) 4实验五:GIS分析 (25) 5.1实验目的 (25) 5.2实验内容 (25) 5.3实验步骤与结果 (25) 5实验六:栅格数据处理 (33) 6.1实验目的 (33) 6.2实验内容 (33) 6.3实验步骤与结果 (33) 6实验总结 (43)

1实验一:AOI书签开发 1.1 实验目的 ?掌握AOI书签程序开发 1.2 实验内容 ?实现AOI书签的创建 ?实现AOI书签的调用 1.3 实验步骤与结果 实验思路、关键代码(全面注释)、运行结果截图 实验思路: 空间书签是用户定义创建的标志某个特定地理位置的快捷方式,创建好书签后能够很方便的找到某个地理位置。在本实验中我们需要创建的是AOI书签,即用户所关心的一个范围,通过调用该书签,用户可以马上找到书签所指范围。 实现本实验主要包括以下几个方面: 1.添加控件和类库引用:添加创建书签控件、保存和调用书签控件,添加 Geometry类库 2.添加“创建书签”函数:创建书签,保存当前感兴趣范围,将书签名加入 组合框,以便调用 3.添加“书签名称设置”窗体:获取书签名,传递给主窗体 4.添加两个事件响应函数:“创建书签”菜单项的点击事件,作用是打开“书 签名称设置”窗体;“确认”按钮的点击事件,作用是调用创建书签函数 5.实现与调用书签:添加组合框的事件响应函数,作用是当组合框中选项 改变时,地图将刷新显示出书签所记录的范围。

GIS二次开发方法与实现

中图分类号:TP311.52文献标识码:A文章编号:1009-2552(2008)08-0065-03 GIS二次开发方法与实现 杨宏鹏,王阿川,王妍玮 (东北林业大学信息与计算机工程学院,哈尔滨150040) 摘要:介绍了地理信息系统二次开发的三种方法:独立二次开发、单纯二次开发和集成二次开发。随后比较各自的优缺点。采用ESRI公司提供的ArcObjects组件库和M apControl控件以及Scene View er C ontrol控件。用VisualC++6.0在ArcGIS8.3环境下进行了G IS的二次开发。 关键词:地理信息系统;ArcO bjects;二次开发 Method and implementation of GIS secondary development YA NG Hong2peng,WA NG A2chuan,W AN G Yan2w ei (School of Information and Computer Engineer ing,Nor theast For estr y University,Harbin150040,China) Abstract:The paper introduces three methods of GIS sec ondary development,they are independent secondary development,simple secondary development and integrated secondary development.Then it c ompares the advantages and disadvantages of each https://www.doczj.com/doc/3b18241830.html,ing A rcO bjects component library and M apControl controls and Scene View er Control controls provided by ESRI company,this paper makes secondary development of GIS under ArcGIS8.3environment based on VisualC++6.0. Key w or ds:GI S;ArcObjects;secondary development 20世纪中叶以后,伴随着计算机科学、现代数学、计算机图形学和虚拟现实技术的发展,地理信息系统(GIS)应运而生,该技术将数字地图和地理分析功能以及数据库操作集合在一起,可对地理信息进行综合分析和处理。现有的地理信息系统软件主要集中于描述二维空间信息,将实际的三维事物采用二维的方式表示,具有很大的局限性,大量的多维空间信息无法得到利用。而且在许多实际应用中,诸如:环境仿真、设施管理、森林防火的模型分析与辅助决策,用户需要三维可交互GIS的支持,以便三维可视化、动态交互地处理、分析、显示他们的多种地理相关数据。现有的GIS系统已经不能满足用户在个别领域的专项研究,因此对地理信息系统进行二次开发,尤其是进行三维可视化的开发与设计就具有非常重要的意义。 目前,在软件开发领域,一场新的革命正在悄悄兴起,这是由日趋成熟的组件技术引发的[1]。组件化技术从根本上改变了传统的软件开发思想,实现了软件的复用和健壮更新。 1GIS的开发方法 应用型GIS的二次开发通常有三种方法[2]:独立二次开发、单纯二次开发和集成二次开发。 1.1独立二次开发 独立二次开发是指不依赖任何GIS工具软件,从空间数据的采集、编辑到数据的处理分析及结果输出,所有的算法都由开发者独立设计,然后选用某种程序设计语言,如Visual C++,D elphi,C++Builder, VJ++等,在一定的操作系统平台上编辑实现。 这种方式的好处在于无需依赖任何商业GIS工具软件,减少了开发成本,同时程序员可以对程序的各个方面进行总体控制。因此,系统各个组成部分之间的联系最为紧密,综合程度和操作效率最高。但由于地理信息系统的复杂性,开发的工作量是十分庞大的,开发周期长。对于大多数开发者来说,能力、时间、财力方面的限制使其开发处理的产品很难在功能上与商业化GIS工具软件相比。 1.2单纯二次开发 单纯二次开发指完全借助于地理信息系统工具 收稿日期:2007-12-18 作者简介:杨宏鹏(1982-),男,东北林业大学信息与计算机工程学院硕士研究生,主要研究方向为人工智能与智能控制。 ) 65 )

ArcGIS二次开发

第一章z开发基础 1.1组件对象模型 在明确讨论COM之前,有必要先一般性地思考一下软件组件使用的广泛性。在软件组件背后有许多的驱使因素,但最基本的就是软件开发是个昂贵和耗时的风险行为。 在理想的世界里,假如曾经写了一段代码,然后通过不同的开发工具一次一次的反复使用它,这种情况是可能的,即便是在最初的开发者不能预见的环境下也能使用。理想情况下,对最初开发者生成的函数功能的改变能在不需要目前用户改变和重编译他们的代码情况下实现。 早期重用代码块的尝试就是创建类库的进展,这些类库通常用C++开发。早期的尝试有很多的限制,较为明显的是:共享系统组件的困难(共享二进制C++组件是非常困难的——大部分的尝试是共享源代码);不重新编译就很难保存和更新C++组件的问题;缺乏好的建模语言和工具以及属性接口和定制工具。 为了解决这样那样的一些问题,许多软件工程师开始采用基于组件的方法进行系统开发。一个软件组件就是一个可重用代码的二进制单元。 已经出现了几个不同但相互重叠的开发和共享组件标准。微软的COM已成为建立交互式桌面应用程序事实上的标准。在互联网上,JavaBean是可行的技术。对象管理组(OMG)制定了粗粒度层次上适用于应用程序互操作的公用对象请求代理架构(CORBA)。

为了理解COM(以及所有基于COM的技术),认识到其不是一种面向对象语言而是一个协议或标准是非常重要的。COM不仅仅是一种技术,还是软件开发的一种方法论。COM定义了一种连接软件组件或模型的协议。通过使用这种协议,可以建立能在分布式系统中动态交互的可重用软件组件。 COM还定义了一种称作基于接口的编程模式。对象封装了能体现定义良好的接口后每个实例化对象特征的操作方法和数据。这增强了系统开发的结构化和安全性,因为一个对象的客户并不知道某个特定方法如何实现的任何细节。COM不规定应如何构建一个应用程序。语言、结构和实现细节都由使用COM的应用程序开发人员决定。 COM的确规定了一个对象模型和使COM对象能与其他COM对象交互的编程需求。这些对象可以位于单个过程中,在不同的过程中,或者甚至在远程机器上。它们可以用其他语言编写,也可以用完全不同的方式开发。这就是COM被认为是二进制规范或标准的原因—它是一个在程序被编译为二进制机器代码后才应用的标准。 COM允许对象在二进制水平上重用,意味着第三方开发者即使从最底层扩展系统也不需要访问这些对象的源代码、头文件或对象库。 组件、对象、客户和服务器 不同的文件中组件(components)、对象(objects)、客户(clients)和服务器(servers)表示不同的意思(各种文件用这些术语指代相同的事物,使得术语使用更加混乱)。因此,定义这本书所要使用的术语是非常有必要的。

ArcGIS主要功能简介

ArcGIS 主要功能简介 通过在课堂上以及在课外的研究课题中对GIS的学习探究和应用,我对GIS 的主体功能有了较为明晰的认识,我认为ArcGIS的主要功能包括以下几个方面: 一、信息的输入和转换 信息的输入和转换是将从外部各种渠道收集所得的原始数据输入到 GIS系统内部并转换为系统便于处理的内部格式的过程。 1、信息的输入包括对空间数据和属性数据这两类数据的输入,其中输入点、线、面这类带有空间位置和几何特性的要素为空间数据输入,而文字、表格和其他非几何数据的输入为属性数据输入。 2、信息的转换包括将我们常用的其他软件文件转换到GIS中,通过多个软件之间的联动获取比单纯用GIS输入来得更丰富的外界信息,例如将DWG格式文件转换输入到GIS中;除此之外还有通过ArcToolbox这一强大的工具集进行的GIS内部的矢量数据和栅格数据之间的转换。 二、数据的编辑 数据的编辑是对已有的数据进行修改更新以及建立它们之间的联系的过程。 主要包括拓扑关系的建立、数据的投影变换、扭曲拉伸、裁剪、拼接和提取、以及坐标校正等。其中我们可以借助拓扑关系来编辑要素和检验数据质量。 三、数据的储存与管理 GIS的这项功能提供空间与属性数据的储存和灵活调用的能力。如今随着数据容量和复杂度不断增大、对数据储存速度的要求越来越高,GIS的储存功能也在不断发展,于是出现了网络GIS数据储存、基于微电子机械系统的储存器等新功能、新产品。 四、数据的查询 数据的查询包括两个方面功能:通过空间位置查属性和通过属性查空间位置,即“某个特定位置有什么”和“某个特定要素在哪里”。 五、数据的分析 空间数据的分析是GIS的核心功能,它能够通过对基础数据的分析并叠加其

相关主题
文本预览
相关文档 最新文档