当前位置:文档之家› GIS软件开发技术

GIS软件开发技术

第一章MapObjects基础Gis常用开发平台MapObjects简介➢MapObjects功能➢MapObjects优点➢MapObjects基础编程规范01、Gis软件开发常用开发平台常用开发平台的比较:VB:较易入门VBA:对于扩充原有功能较好。

如AutoCAD、ArcMap中的VBA。

开发效率最高的一种开发方式(常常是一个语名即可实现其它开发工具要几十甚至上百行的代码才能实现的功能)。

缺点是所开发出的应用程序不能脱离相应的运行环境。

(如在ArcMap中开发的应用程序,必须先要安装ArcMap)VC++:较为灵活,开发资料众多。

可实现对系统的全面操作。

缺点是学习起来较难,所开发出的应用程序常常会产生难以预计的错误。

(如内存泄露等)Delphi:可扩充性最好,现已有上万个带源码的控件可供使用,几乎涉及到各各方面。

如数据库控件InfoPower3000、OpenGL控件GLScene,工业控制控件等。

GIS组件简介:MapObjects:ESRI1、可实现功能:2、可使用的数据ArcView Gis Shapefiles:创建新层、读写数据,添加删除记录与几何要素ArcSDE:不能创建新层Arcinfo Coverages:只读CAD格式及VPF数据库:只读(Vector Product Format是一种标准的基于空间关系数据模型的大型空间数据库的格式、结构与组织。

是美国国防部的标准)外部数据库:只读ArcObjects:ESRIMapX:MapinfoSupermap:中科院地理所一般用户(大多数用户)关心的问题:应用程序的运行速度与稳定性。

不关心所采用的开发工具及内部实现方式。

只有特殊用户(少量用户)考虑与原有系统的兼容性才关心开发平台。

软件开发中应注意的问题:代码的规范性:1、命名约定2、代码缩进3、逻辑关系的排列次序对于较为普通的问题尽量使用较常见的解决方式。

尽量不使用较为古怪的技巧(如:两数的交换),这样会降低代码的可读性。

Delphi开发环境简介:1、数据库应用2、OpenGL应用3、报表制作02、通用GIS功能的界面框架设计1、菜单的设计2、工具条的设计3、状态栏提示信息的显示(标准控件及1stClass控件的使用)4、fcLookoutBar控件的使用5、TActionList控件的使用6、图标及标题的设置03、MapObjects的模块间关系简介属性、事件、方法:属性:对象的性质,方法:对象的动作,事件:对象的响应。

(只有Map Control有事件)可创建对象与不可创建对象为有效地使用MapObjects中的OLE Automation对象,必须注意一些对象可以创建,一些对象不可创建。

如果某个对象可以创建,在对象图中对象名称下有一个Creatable标注。

如一个对象可以创建可用如下代码创建:(假设创建点对象)Dim NewObject as New MapObjects2.Point或Dim NewObject as MapObjects2.PointSet NewObject = New MapObjects2.Point在将对象的引用赋给变量、数据类型的元素或可写对象的属性时,须使用关键字Set;在创建对象的实例时,须使用关键字NewVarNewObject: ImoPoint;BeginNewObject := coPoint.Create;End;在Delphi中如一个对象可创建,可用coXXX.Create方法进行创建。

XXX为可创建对象名值传递与引用传递:值传递:新的变量得到原始数据或对象的一个拷贝,其值的改变不影响原值。

Name属性;引用传递:新的变量得到原始数据或对象的内存地址,其值的改变影响原值。

Symbol属性值传递Dim LayerName As StringLayerName= yers.Item(0).NameLayerName = "MyLayerName"MsgBox LayerNameMsgBox yers.Item(0).NamevarLayerName: string;beginLayerName := ImoMapLayer(yers.Item(0)).Name;LayerName := 'MyLayerName';ShowMessage(LayerName);ShowMessage(ImoMapLayer(yers.Item(0)).Name);End;引用传递Dim MySymbol As New MapObjects2.SymbolSet MySymbol = yers.Item(0).SymbolMySymbol.Color = moRedMap1.RefreshvarMySymbol: imoSymbol;beginMySymbol := coSymbol.Create ;MySymbol := ImoMapLayer(yers.Item(0)).Symbol;MySymbol.Color := moRed;Map1.Refresh ; end;MapObjects中的常量:常量均以mo开头。

在编写代码时,可使用常量名也可使用常量左边的整数。

但最好使用常量名称以增强代码的可读性。

MainMap.MousePointer = moArrow; 或MainMap.MousePointer = 1;第二章地图与图层M ap ControlL ayers Collection➢MapLayers➢ImageLayersR ectangle、pointD ataConnectionG eoDatasets CollectionG eoDatasetT rackingLayer查看地图地图的放大、缩小、平移等操作交互式方法:Pan、TrackRegtangle、TrackPolygon、TrackCircle。

当使用上述方法时,运行时线程将暂停,等待用户使用鼠标与Map控件交互。

实现对地图的基本操作。

(地图的放大、缩小、平移)Private Sub MainMap_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)Dim r As new MapObjects2.RectangleIf barDisplay.Buttons("Zoom in").Value = 1 ThenMainMap.Extent = MainMap.TrackRectangleElseIf barDisplay.Buttons("Zoom out").Value = 1 Thenr = MainMap.Extentr.ScaleRectangle(1.25)MainMap.Extent = rElseIf barDisplay.Buttons("Pan").Value = 1 ThenMainMap.PanElseIf barDisplay.Buttons("Identify").Value = 1 ThenCall frmIdentify.Identify(x, y)EndifMainMap.RefreshEnd sub procedure TMainFRM.MainMapMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);varr: imoRectangle;beginif tbZoomIn.Down thenMainMap.Extent := MainMap.TrackRectangleelseif tbZoomOut.Down thenbeginr := coRectangle.Create;r := MainMap.Extent; //(Extent:为地图的空间区域可理解为当前的显示范围)r.ScaleRectangle(1.25); //MainMap.Extent := r;endelseif tbPan.Down thenMainMap.Panelseif (tbIdentify.Down) and (Button = mbLeft) then// GetIdentify(X, Y) ;MainMap.Refresh;End;获取鼠标坐标在创建面向图形的应用程序时,必须解决两种坐标系统的转换问题:定义窗体中控件的尺寸与位置的控制坐标,以及定义在打印机或显示器上图形的大小与位置的设备坐标。

MapObjects开发人员还须使用第三种坐标系统:地图坐标系统。

此坐标定义了地图上几何要素或影像的笛卡尔位置。

为保证有效,此坐标系统必须与某种投影或非投影坐标相匹配,以定义物体在地表的位置。

在MapObjects中,ToMapPoint方法以参数形式接收MouseDown、MouseUp、MouseMove事件传递的鼠标位置的x,y参数。

这些x,y值是以控制坐标来表达的。

ToMapPoint 方法将窗体上点的位置转换成相应的地图上的点位置。

FromMapPoint方法实现相反的转换。

类式的方法有:ToMapDistance与FromMapDistancePrivate Sub Map1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)Dim MyPoint As New PointSet MyPoint = Map1.ToMapPoint(X, Y)Text1.Text = Str(MyPoint.X) + " " + Str(MyPoint.Y) End Sub procedure TForm1.Map1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);varMyPoint: ImoPoint;beginMyPoint := coPoint.Create ;MyPoint := Map1.ToMapPoint(x,y);Edit1.Text := FloatToStr(MyPoint.X) + ' ‘+FloatToStr(MyPoint.Y );end;图层集合(Layers)➢每个地图控件有且只有一个Layers集合➢Layers集合可包含MapLayer与ImageLayer两类地图文件➢每个图层可有自已的显示方式Dim i As IntegerFor i = 0 To yers.Count - 1 MsgBox yers.Item(i).Name Next i vari: integer;MyLayers: imoLayers;beginMyLayers := yers ;for i := 0 to MyLayers.Count - 1 doShowMessage(ImoMapLayer(MyLayers.Item(i)).Name); end;或:vari: integer;beginfor i := 0 to yers.Count - 1 doShowMessage(ImoMapLayer(yers.Item(i)).Name); end;04、MapObjects图层操作1、ArcView格式地图2、AutoCAD图形3、位图注意观察如下图形中的红线部份:加入ArcView格式地图步骤:1、生成数据连接对象(ImoDataConnection)2、设定数据连接对象的DataBase属性4、取得空间数据集5、生成新的图层6、将新生成的图层加入地图控件Private Sub Command1_Click()Dim dc As New MapObjects2.DataConnectionDim lyr As New MapObjects2.MapLayerdc.Database = "C:\USA"If dc.Connect ThenSet lyr.GeoDataset = dc.FindGeoDataset("Counties") If lyr.Valid Thenyers.Add lyrElseMsgBox "无法加入图层"End IfElseMsgBox "出错,请确定数据是否存在?"End IfEnd Sub vardc: imoDataConnection;lyr: imoMapLayer;begindc := coDataConnection.Create;lyr := coMapLayer.Create;dc.Database := 'C:\USA';if dc.Connect thenbeginlyr.GeoDataset := dc.FindGeoDataset('Counties');if lyr.Valid thenyers.Add(lyr)elseShowMessage('无法加入图层')end elseShowMessage('出错,请确定数据是否存在?'); end;注意要点:DataBase:对于shapefile,数据库属性仅为一包含有shapefile的文件夹或目录字符串。

相关主题