GIS软件开发技术.docx
《GIS软件开发技术.docx》由会员分享,可在线阅读,更多相关《GIS软件开发技术.docx(47页珍藏版)》请在冰豆网上搜索。
![GIS软件开发技术.docx](https://file1.bdocx.com/fileroot1/2022-11/20/393870c6-0ac4-497b-94bd-a45b6369d8ff/393870c6-0ac4-497b-94bd-a45b6369d8ff1.gif)
GIS软件开发技术
第一章MapObjects基础
Gis常用开发平台
MapObjects简介
ØMapObjects功能
ØMapObjects优点
ØMapObjects基础
编程规范
01、Gis软件开发常用开发平台
常用开发平台的比较:
VB:
较易入门
VBA:
对于扩充原有功能较好。
如AutoCAD、ArcMap中的VBA。
开发效率最高的一种开发方式(常常是一个语名即可实现其它开发工具要几十甚至上百行的代码才能实现的功能)。
缺点是所开发出的应用程序不能脱离相应的运行环境。
(如在ArcMap中开发的应用程序,必须先要安装ArcMap)
VC++:
较为灵活,开发资料众多。
可实现对系统的全面操作。
缺点是学习起来较难,所开发出的应用程序常常会产生难以预计的错误。
(如内存泄露等)
Delphi:
可扩充性最好,现已有上万个带源码的控件可供使用,几乎涉及到各各方面。
如数据库控件InfoPower3000、OpenGL控件GLScene,工业控制控件等。
GIS组件简介:
MapObjects:
ESRI
1、可实现功能:
2、可使用的数据
ArcViewGisShapefiles:
创建新层、读写数据,添加删除记录与几何要素
ArcSDE:
不能创建新层
ArcinfoCoverages:
只读
CAD格式及VPF数据库:
只读(VectorProductFormat是一种标准的基于空间关系数据模型的大型空间数据库的格式、结构与组织。
是美国国防部的标准)
外部数据库:
只读
ArcObjects:
ESRI
MapX:
Mapinfo
Supermap:
中科院地理所
一般用户(大多数用户)关心的问题:
应用程序的运行速度与稳定性。
不关心所采用的开发工具及内部实现方式。
只有特殊用户(少量用户)考虑与原有系统的兼容性才关心开发平台。
软件开发中应注意的问题:
代码的规范性:
1、命名约定2、代码缩进3、逻辑关系的排列次序
对于较为普通的问题尽量使用较常见的解决方式。
尽量不使用较为古怪的技巧(如:
两数的交换),这样会降低代码的可读性。
Delphi开发环境简介:
1、数据库应用2、OpenGL应用3、报表制作
02、通用GIS功能的界面框架设计
1、菜单的设计
2、工具条的设计
3、状态栏提示信息的显示(标准控件及1stClass控件的使用)
4、fcLookoutBar控件的使用
5、TActionList控件的使用
6、图标及标题的设置
03、MapObjects的模块间关系简介
属性、事件、方法:
属性:
对象的性质,方法:
对象的动作,事件:
对象的响应。
(只有MapControl有事件)
可创建对象与不可创建对象
为有效地使用MapObjects中的OLEAutomation对象,必须注意一些对象可以创建,一些对象不可创建。
如果某个对象可以创建,在对象图中对象名称下有一个Creatable标注。
如一个对象可以创建可用如下代码创建:
(假设创建点对象)
DimNewObjectasNewMapObjects2.Point
或
DimNewObjectasMapObjects2.Point
SetNewObject=NewMapObjects2.Point
在将对象的引用赋给变量、数据类型的元素或可写对象的属性时,须使用关键字Set;在创建对象的实例时,须使用关键字New
Var
NewObject:
ImoPoint;
Begin
NewObject:
=coPoint.Create;
End;
在Delphi中如一个对象可创建,可用coXXX.Create方法进行创建。
XXX为可创建对象名
值传递与引用传递:
值传递:
新的变量得到原始数据或对象的一个拷贝,其值的改变不影响原值。
Name属性;
引用传递:
新的变量得到原始数据或对象的内存地址,其值的改变影响原值。
Symbol属性
值传递
DimLayerNameAsString
LayerName=Map1.Layers.Item(0).Name
LayerName="MyLayerName"
MsgBoxLayerName
MsgBoxMap1.Layers.Item(0).Name
var
LayerName:
string;
begin
LayerName:
=ImoMapLayer(Map1.layers.Item(0)).Name;
LayerName:
='MyLayerName';
ShowMessage(LayerName);
ShowMessage(ImoMapLayer(Map1.layers.Item(0)).Name);
End;
引用传递
DimMySymbolAsNewMapObjects2.Symbol
SetMySymbol=Map1.Layers.Item(0).Symbol
MySymbol.Color=moRed
Map1.Refresh
var
MySymbol:
imoSymbol;
begin
MySymbol:
=coSymbol.Create;
MySymbol:
=ImoMapLayer(Map1.Layers.Item(0)).Symbol;
MySymbol.Color:
=moRed;
Map1.Refresh;
end;
MapObjects中的常量:
常量均以mo开头。
在编写代码时,可使用常量名也可使用常量左边的整数。
但最好使用常量名称以增强代码的可读性。
MainMap.MousePointer=moArrow;或MainMap.MousePointer=1;
第二章地图与图层
MapControl
LayersCollection
ØMapLayers
ØImageLayers
Rectangle、point
DataConnection
GeoDatasetsCollection
GeoDataset
TrackingLayer
查看地图
地图的放大、缩小、平移等操作
交互式方法:
Pan、TrackRegtangle、TrackPolygon、TrackCircle。
当使用上述方法时,运行时线程将暂停,等待用户使用鼠标与Map控件交互。
实现对地图的基本操作。
(地图的放大、缩小、平移)
PrivateSubMainMap_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
DimrAsnewMapObjects2.Rectangle
IfbarDisplay.Buttons("Zoomin").Value=1Then
MainMap.Extent=MainMap.TrackRectangle
ElseIfbarDisplay.Buttons("Zoomout").Value=1Then
r=MainMap.Extent
r.ScaleRectangle(1.25)
MainMap.Extent=r
ElseIfbarDisplay.Buttons("Pan").Value=1Then
MainMap.Pan
ElseIfbarDisplay.Buttons("Identify").Value=1Then
CallfrmIdentify.Identify(x,y)
Endif
MainMap.Refresh
Endsub
procedureTMainFRM.MainMapMouseDown(Sender:
TObject;Button:
TMouseButton;Shift:
TShiftState;X,Y:
Integer);
var
r:
imoRectangle;
begin
iftbZoomIn.Downthen
MainMap.Extent:
=MainMap.TrackRectangle
else
iftbZoomOut.Downthen
begin
r:
=coRectangle.Create;
r:
=MainMap.Extent;//(Extent:
为地图的空间区域可理解为当前的显示范围)
r.ScaleRectangle(1.25);//
MainMap.Extent:
=r;
end
else
iftbPan.Downthen
MainMap.Pan
else
if(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与FromMapDistance
PrivateSubMap1_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
DimMyPointAsNewPoint
SetMyPoint=Map1.ToMapPoint(X,Y)
Text1.Text=Str(MyPoint.X)+""+Str(MyPoint.Y)
EndSub
procedureTForm1.Map1MouseMove(Sender:
TObject;Shift:
TShiftState;X,Y:
Integer);
var
MyPoint:
ImoPoint;
begin
MyPoint:
=coPoint.Create;
MyPoint:
=Map1.ToMapPoint(x,y);
Edit1.Text:
=FloatToStr(MyPoint.X)+'‘+FloatToStr(MyPoint.Y);
end;
图层集合(Layers)
Ø每个地图控件有且只有一个Layers集合
ØLayers集合可包含MapLayer与ImageLayer两类地图文件
Ø每个图层可有自已的显示方式
DimiAsInteger
Fori=0ToMap1.Layers.Count-1
MsgBoxMap1.Layers.Item(i).Name
Nexti
var
i:
integ