zoukankan      html  css  js  c++  java
  • 毕业设计——第三章 开发方法及系统实现(2)

     国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html

    内部邀请码:C8E245J (不写邀请码,没有现金送)
    国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------
    3.3 地图操作类CMapControl详述
    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文件。详细设计代码如下:
    作 用
    连接到地图数据库
     
    (1) DbFolderName 数据库所在文件夹
    (2) LayerName 需加载层名
    返回值
    true 加载图层成功,false 加载失败
    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类中,详细代码见附录代码。
    作 
    图层的基本操作选择函数
     
    (1) point 鼠标点击的点对象
    (2) gloModel 全局变量global对象的EditModel状态
    返回值
    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 数据操作类CDbProcess详述
    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
     
     
    显示该类的错误信息
  • 相关阅读:
    冒泡排序算法
    delphi 处理图片(剪切,压缩)
    delphi 创建DLL文件 及其调用和注意事项
    对属性的认识
    timer实现Grid自动换行(连续相同的id跳到下一行)
    Form1调用Unit2类中函数
    微信二次分享不显示摘要和图片
    location.search为空导致微信拿不到code的问题
    考虑一下微信跳转的登录流程如何修改-无感知
    微信7.0(2019年1月份之后,没法使用抓包了,也许是为了安全,所以联调出问题记得看后台日志)
  • 原文地址:https://www.cnblogs.com/AloneSword/p/2237596.html
Copyright © 2011-2022 走看看