3.3.1地图操作类CMapControl 类的成员属性和方法
表 3-2 CMapControl类中实现的成员属性
[5]
名称
|
数据类型
|
说明
|
ErrorCode
|
int
|
该类中形成的错误信息
|
LintPtCount
|
int
|
管线点的总数
|
mapZoomFull
|
MapObjects2.Rectange
|
图层缩放处理
|
Message
|
string
|
消息(包括错误信息)
|
Model
|
global.Model
|
当前模式
|
objMap
|
AxMapObjects2.AxMap
|
地图控件对象
|
PointCount
|
int
|
高程点总数
|
CMapControl类的方法如下表所示:
表 3-3 CMapControl类的成员方法
名称
|
参数
|
返回值
|
说明
|
CMapControl
|
|
|
构造函数
|
CMapControl
|
AxMapObjects2.AxMap
|
|
重载构造函数
|
AddLayerFromFolder
|
string,string
|
bool
|
加载数据库文件
|
AddLine
|
MapObjects2.Point
|
|
添加线对象
|
AddPoint
|
MapObjects2.Point
|
|
添加点对象
|
BasePoint
|
MapObjects2.Point,global.Model
|
|
地图基本处理
|
getZ
|
ptZD2,MapObjects2.Point
|
MapObjects2.Point
|
计算点的高程
|
GetCross
|
|
MapObjects2.Point
|
两直线的交点
|
LocationRect
|
MapObjects2.Point
|
MapObjects2.Point
|
计算最短距离
|
ptProcess
|
MapObjects2.Point
|
|
对点进行处理
|
ZoomChange
|
int
|
|
放大、缩小处理
|
3.3.2地图操作类CMapControl方法的具体实现
3.3.2.1 数据处理模型
本系统中的数据分为与地理信息有关的数据和与地理信息无关的数据。前者指的是与网点、管线位置相关的数据,如网点的坐标值、网点的名称、唯一标志号;管线的坐标值、名称唯一标志号等;后者指的是管件的属性信息,如口径、长度、地理位置、埋设年月、供排水流量等。在功能明确基础上,建立完备的数据字典。
对于与地理信息有关的数据,可用Shape 格式的图层表示存储,这样便于地理信息和地图对象紧密地结合起来。对于与地理信息无关的数据,可采用SQL 关系数据库来存储,这样便于数据的维护和共享使用。
3.3.2.2 地图投影模型
空间数据库的全部图层必须使用一致的投影方法才能精确匹配,只有确定了各类投影数据,才能将各种空间数据转换到统一的地理坐标系中。MapObjects 中的地图坐标系统分为地理坐标系统和笛卡儿平面坐标系统,地理坐标系统中对象的坐标用经纬度来表示,平面坐标中对象的坐标通常是相对坐标,是相对于图中的某个基准点来设置的。如果图层的坐标不一致的话,必须先转换坐标才能进行匹配。
MapObjects 包含有预定义的坐标系统和坐标转换。空间数据shape 文件作为地理图层MapLayer 被添加到MapObjects 中的时候,投影的详细信息也会被保存在磁盘上的一个投影文件(.prj)里,Shapefiles 使用的投影文件是可被MapObjects 进行写操作的投影元数据的格式。用户可以将任何投影数据放在一个共同的投影里进行浏览和分析,也可以将地图图层都输出到一个新的投影里。
3.3.2.3 地图图层的加载与显示
MapObjects 可以在程序设计期间载入图层,也可在程序运行中添加、删除图层或改变图层的属性,这些都可操纵MapObjects 对象的编程语句实现。在本例中采用窗体生成的时候自动加载图层并在控件中显示。
当加载用户自定义图层时,可使用MapObjects对象的图层管理对象来加载用户自定义的图层。代码实现如下:
在实现过程中,我们调用了MapObjects的Connect方法连接Shape文件。详细设计代码如下:
public bool AddLayerFormFolder(string DbFolderName,string LayerName)
{
bool DbConn=false;
MapObjects2.DataConnection mapDataConnection;
mapDataConnection =new MapObjects2.DataConnectionClass();
MapObjects2.MapLayer mapLayer=new MapObjects2.MapLayerClass();
MapObjects2.Symbol mapSymbol=new MapObjects2.SymbolClass();
try
{
mapDataConnection.Database=DbFolderName;
DbConn=mapDataConnection.Connect();
if(!DbConn)
{
this._msg+="/n连接到地图数据库 "+DbFolderName+" 时,发生错误!";
return false;
}else{
mapLayer.GeoDataset=mapDataConnection.FindGeoDataset(LayerName);
mapSymbol.CharacterIndex=1;
mapSymbol.Color=(uint) MapObjects2.ColorConstants.moGreen;
mapLayer.Symbol=mapSymbol;
this._map.Layers.Add(mapLayer);
this._map.Refresh();
return true;
}
}
catch
{
this._msg+="/n未发现 "+ LayerName +" 的层!";
return false;
}
finally
{
mapDataConnection.Disconnect();
}
}
|
3.3.2.4 地理信息增、删、改功能的实现
本系统中的使用MapObjects对象可以对MapObjects 中的地理对象通常使用点(如管线节点、井口等)、线(河流、街道、管线等)、面(运动场、城市和土地区域等)来表示。
MapObjects 提供标准的地理对象类型定义,在MapObjects 所提供的点、线、面类型中,用户可以方便地设计地理对象的类型,包括所使用的符号的形状、颜色、大小等属性。结合编程语言还可以给用户设计出完善的画图工具,可以调用它们为用户设计出多种多样的地理对象生成工具。还可以设计出多种地理信息对象的选择工具,如矩形选择工具、圆形选择工具等。 可以把这些选择工具与MapObjects 所提供的删除地理对象功能相结合以完成地理信息系统中地理对象的删除功能;在实现地理信息的修改功能时,可以使用面向对象语言所提供的对于数据库和MapObjects 控件图层表的访问功能来访问地理信息。同时,对于地理数据和非地理数据处理方式是不同的。
在本例子中,使用MapObjects 提供的各种图形工具来实现地理信息的增、删、改。根据工具栏barGraphics 上按钮选择,在图层上添加注记、节点和供排水管线等对象的操作,各种操作对象的函数实现定义在CMapControl类中,详细代码见附录代码。
public void BaseProcess(MapObjects2.Point point,global.Model gloModel)
{
this._model=gloModel;
switch(gloModel)
{
case (global.Model.ZoomIn): //图像放大
MapObjects2.Rectangle inRect=_map.TrackRectangle();
if(inRect==null || inRect.Width<0.00005 || inRect.Height<0.00005)
{
inRect=this._map.Extent;
inRect.ScaleRectangle(0.6667);
inRect.Offset(-(inRect.Center.X-point.X),-(inRect.Center.Y-point.Y));
}
_map.Extent=inRect;
break;
case(global.Model.ZoomOut): //缩小图像
MapObjects2.Rectangle rect=_map.TrackRectangle();
if(rect==null || rect.Width<0.0005 || rect.Height<0.0005)
{
rect=_map.Extent;
rect.ScaleRectangle(1.5);
rect.Offset(-(rect.Center.X-point.X),-(rect.Center.Y-point.Y));
}
else
{
double _times=_map.Extent.Width/rect.Width;
rect.ScaleRectangle(_times);
}
_map.Extent=rect;
break;
case(global.Model.Pan): //移动图像
this._map.MousePointer=MapObjects2.MousePointerConstants.moPanning;
this._map.Pan();
this._map.MousePointer=MapObjects2.MousePointerConstants.moPan;
break;
case(global.Model.AddPoint):
CDbProcess DbProc=new CDbProcess(); //新的类操作对象
DbProc.m_Dg=this.m_Dg;
DbProc.AddPointToDg(point); this.AddPoint(point,0,global.Model.AddPoint);
break;
case(global.Model.AddLine):
this.AddLine(point);
break;
default:
break;
}
}
|
3.3.2.5 地理信息查询和分析功能的实现
对于地理信息系统中有关地理信息查询功能和分析统计功能,由MapObjects 提供强大的查询和分析手段:
(1)按照地理目标之间相对距离的关系搜索(SearchByDistance);如查询距离道路以15m 内的建筑物的位置、名称、面积和使用情况。
(2) 按逻辑查询,即按SQL语句的条件从句查询图形特征(SearchByExpression),如搜索距离某管线最近的节点的位置。
(3)根据与已知图形的关系来查询其它的图形特征,如选择被已知图形包含的其它图形特征(SearchByShape)。
对于非地理信息数据,使用C# 中ADO.NET 数据库中的数据的方法进行显示、查询和处理。
3.4.1数据操作类CDbProcess的成员属性和方法
CDbProcess类的成员属性见下表:
表 3-4 CDbProcess类的成员属性
名称
|
数据类型
|
说明
|
m_ClickID
|
int
|
当前点击的ID
|
m_Dg
|
Datagrid
|
存储数据的DataGrid对象
|
m_Model
|
global.Model
|
当前模式
|
Message
|
string
|
消息(包括错误信息)
|
CDbProcess类的成员方法如下表:
表 3-5 CDbProcess类的成员方法
名称
|
参数
|
返回值
|
说明
|
CDbProcess
|
|
|
构造函数
|
AddPointToDg
|
MapObjects2.Point
|
|
添加点数据至控件
|
AddPointToDg
|
MapObjects2.Point,int
|
bool
|
添加点数据至控件
|
FillPointData
|
DataGrid
|
|
初始化数据控件
|
Initialization
|
|
|
初始化变量
|
LocationRect
|
MapObjects2.Point
|
MapObjects2.Point
|
计算最短距离
|
ShowErrorMessage
|
|
|
显示该类的错误信息
|