欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap FreeTalk
   您现在位于: 首页技术专栏SuperMap应用与开发超图其它 → 正文
eSuperMap地图的编辑
07-10-16 09:26:55 作者:未知 出处:超图

一、功能描述

undefined undefined undefined undefined    本工程主要演示地图几何对象的编辑,即添加、编辑、删除、移动几何对象,添加、删除、编辑节点等。 undefined undefined undefined undefined
 

二、类及方法:

undefined undefined undefined undefined
用到的类
方法
CSeWorkSpace Close、GetDataSourceAt、GetDataSourceCount、GetMaps、IsOpen、Open
CSeMapWnd AddLayer、Close、GetAction、GetLayer、GetLayerAt、GetLayerCount、InitialEditTextStyle、MoveBottom、MoveDown、MoveTop、MoveUp、OnDraw、OnInitialUpdate、OnLButtonDblClk、OnLButtonDown、OnLButtonUp、OpenMap、Refresh、RemoveLayerAt、SaveToMap、SetAction、SetEditableLayer、ViewEntire
CSeDataSource GetAlias、GetDatasetCount、GetDataset、GetDatasetAt
CSeDataset GetName、GetType
CSeMaps AddMap、GetMapCount、GetMap、GetMapAt 、GetMapCount、GetMapNameAt、SetMap
CSeLayer GetDataset
CSeLayerDef IsEditable、IsSelectable、IsSnapable、IsVisible、SetSelectable、SetSnapable、SetVisible
undefined undefined undefined undefined
 

三、说明及约定

 

undefined undefined undefined undefined

    1、工程说明 本工程为单文档类型的工程,提供菜单和工具条两种操作方式 菜单中提供“文件、地图和编辑”三组菜单,其中: “文件”中提供“打开地图、添加图层、关闭和退出”四个菜单项; “地图”中除了放大、缩小、平移、点选、框选、整幅显示和刷新外,还提供“图层管理”功能; “编辑”中有“选择编辑层、添加点、添加线、添加面、添加文本、文本编辑、移动对象、删除对象、增加节点、编辑节点和删除节点”十一个菜单项。 工具条除地图基本操作功能外,增加了对象编辑工具条,提供的功能分别与菜单中 “编辑”中的功能和资源相对应。

    2、打开地图文件的约定 判断是否已经有地图文件打开,有则关闭; 打开地图文件后,就判断有没有地图,如果有地图,弹出打开地图对话框,选择打开地图,然后刷新地图窗口,显示地图;如果没有地图,新建一个地图Untitled,等待添加地图(文件 — 添加图层); 对图层的操作,可通过“地图—图层管理”菜单进行。

    3、编译程序的约定eSuperMap类库支持VC++、EVC++ 3.0 和 EVC++ 4.0三种开发环境,同时支持PDA的各种设备类型、各种CPU类型的动态连接库和静态连接库,在编译的时候,需要指定eSuperMap类库的头文件和库文件的搜索路径。 在EVC集成开发环境中,设置搜索路径方法,选择Tools?? Options ?? Directories 选中指定的运行平台、CPU类型,然后开始设置包含头文件和库文件的路径: 1、设置头文件的搜索路径,选择Include Files , 添加一个路径搜索项,把eSuperMap类库的头文件目录 SeRSFC选进来即可; 2、设置库文件的搜索路径,选择Library Files , 添加一个路径搜索项,把eSuperMap类库的相应的库文件目录选进来即可,比如: 具体设置请参见 联机帮助 中的开发环境设置。

undefined undefined undefined undefined
 

四、实现过程

undefined undefined undefined undefined

   

    注:本工程是在地图基本操作工程MapOperation基础上进行的对象编辑,它的一些实现步骤和MapOperation相同,这里只介绍重要的实现步骤和方法,详细的对象编辑参见editor工程和MapOperation工程(有详细的注释)。

    1、新建一个单文档界面的工程,命名为editor;

    2、改造原有的菜单,按 “三、说明及约定”中第一条所说的设置;

    3、改造原有的工具条,按 “三、说明及约定”中第一条所说的设置;

    4、添加三个对话框类:CDlgSelect、CDlgLayerManager、CDlgSelectLayer,其中:
        CDlgSelect是在选择要打开的地图或选择要添加的数据集时使用,添加的成员变量和函数如下:
        定义变量:
        CComboBox m_cmbDataSource; //数据源列表
 
       CListCtrl m_lstDataset; //数据集列表
        CImageList m_ImageList; //数据集类型图像列表
        bool m_bMap; //列表框中是否显示地图名【输入】
        CString m_strMapName; //地图名【输出】
        CString m_strDatasourceAlias; //数据源别名【输出】
        CString m_strDatasetName; //数据集名【输出】
        成员函数:
        void AddMap(); //将地图名加入列表框中
 
       void BuildColumns(int nCols, int *nWidth, CString *csCol); //创建列表框的列
        void BuildRows( int nRows, CString *pcValue, int nImage ); //创建列表框的行
        void AddDataset(); //将数据集信息加入列表框中 virtual BOOL OnInitDialog(); //初始化对话框
        virtual void OnOK(); //响应确定按钮操作
        afx_msg void OnCancel(); //响应取消按钮操作
        afx_msg void OnSelchangeComboDatasource(); //更新数据集列表
        使用说明:
        当点击“文件—打开地图”时,如果文件存在地图,则打开该对话框,该对话框中显示的是地图名称列表,选择相应的地图名,就可以打开了,如果没有地图,则新建一个地图,再点击“文件—添加图层”,弹出该对话框,这时对话框显示的是当前工作空间的所有数据源及其相应的数据集列表,选择要添加的数据集即可。

***********************************************************************

       CDlgLayerManager是图层管理对话框类,可以实现图层的移动、属性的设置等功能,添加的成员变量和函数如下:
       成员变量:
       CSeMapWnd *m_pMapWnd; //用以显示地图【输入】
       Int m_nCurRow; //当前选中的行
       BOOL m_bLstClicked; //当显示比例Edit聚焦后判断,失去焦点后,是否点击了listLayer
       成员函数:
       BOOL FillList(); //将图层名添加到列表中
       void SetMoveButtonState(int nRow); //设置移动按钮的状态
       void CSeDlgLayerManager::OnButtonDelete() //删除图层
       void CSeDlgLayerManager::OnButtonMoveBottom() //移动图层到最底层
       void CSeDlgLayerManager::OnButtonMoveDown() //图层下移
       void CSeDlgLayerManager::OnButtonMoveTop() //移动图层到最顶层
       void CSeDlgLayerManager::OnButtonMoveUp() //图层上移
       void CSeDlgLayerManager::OnCheckSelectable() //设置图层是否可选择
       void CSeDlgLayerManager::OnCheckSnapable() //设置图层是否可捕捉
       void CSeDlgLayerManager::OnCheckVisible() //设置图层是否可见 //点击图层列表,显示图层的属性信息(如可编辑等)
       void CSeDlgLayerManager::OnClickListLayer(NMHDR* pNMHDR, LRESULT* pResult)
       BOOL CSeDlgLayerManager::OnInitDialog() //初始化
       void CSeDlgLayerManager::OnKillfocusEditMaxscale() //设置最大比例
       void CSeDlgLayerManager::OnKillfocusEditMinscale() //设置最小比例
       void CSeDlgLayerManager::OnOK() //关闭对话框,保存地图
       void CSeDlgLayerManager::OnSetfocusEditMaxscale() //判断显示最大比例文本框是否聚焦
       void CSeDlgLayerManager::OnSetfocusEditMinscale() //判断显示最小比例文本框是否聚焦
       使用说明:
       点击“地图—图层管理”菜单时,显示该对话框,对话框中将列出当前地图中图层的名字,提供图层移
动的按钮和图层属性的设置选择按钮等功能。

 *************************************************************************** 

       CDlgSelectLayer是选择可编辑图层对话框类,添加的成员变量和函数如下:
       成员变量:
       CSeMapWnd *m_pMapWnd; //用以显示地图【输入】
       CString m_strLayerName; //可编辑图层名【输出】
成员函数:
       void SetLayerName(); //设置图层名
       CString GetLayerName(); //得到图层名
       BOOL CDlgSelectLayer::OnInitDialog(); //初始化
       void CDlgSelectLayer::OnOK(); //关闭对话框,并将选择的图层名赋给m_strLayerName变量
       void CDlgSelectLayer::OnSelchangeComboLayername(); //更新图层列表
使用说明:
       在编辑几何对象前,需要选择可编辑图层,点击“编辑—选择编辑层”菜单时,显示该对话框,对话框中将列出当前地图中图层的名字。

 

    5、在editorView.h中定义成员变量,并在构造函数中初始化:
       CSeMapWnd m_MapWnd; //用以地图显示
       BOOL m_bFileOpened; //地图是否打开
       CString m_strEditableLayer; //可编辑图层名
       CEditorView::CEditorView() {//初始化一些成员变量
       m_bFileOpened = false; m_strEditableLayer=""; }

    6、在editorView.cpp中实现具体函数(按照菜单和工具条):
       文件—打开地图
       void CEditorView::OnFileOpen()
       { //默认打开第一幅地图,否则新建Untitled地图,等待添加图层
          CFileDialog dlgFile(true,_T("pmw|pmw|*.*"),NULL,OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,_T("WorkSpace Files (*.pmw)|*.pmw") );
          if( dlgFile.DoModal() == IDOK )
          { //如果已经打开工作空间文件,则关闭
              if(theApp.m_WorkSpace.IsOpen())
              {
                  theApp.m_WorkSpace.Close();
                  m_MapWnd.Close();
                  m_bFileOpened = false;
              }
            //获得图形文件的完整路径及文件名
              CString strFileName = dlgFile.GetPathName();
            //打开工作空间
              if( theApp.m_WorkSpace.Open( strFileName ) )
              {
                  CSeMaps *pMaps = theApp.m_WorkSpace.GetMaps();
                  if( pMaps )
                  {
                        CSeMapDef MapDef;
                        //有地图,则打开
                        if ( pMaps->GetMapCount() != 0 )
                        {
                              CDlgSelect dlg; dlg.m_bMap = true;
                              if ( dlg.DoModal() = = IDOK )
                              {
                                    if( pMaps->GetMap( dlg.m_strMapName, MapDef ) )
                                    {
                                          if(m_MapWnd.OpenMap(MapDef))
                                          {
                                                m_MapWnd.Refresh();
                                          }
                                    }
                              }
                        }
                        //没有默认地图,则新建地图
                        else
                        {
                              MapDef.m_strMapName = _T("Untitled");
                              pMaps->AddMap( MapDef );
                        }
                   }
                   m_bFileOpened = true;
               }
           }
       }
       文件—添加图层
       void CEditorView::OnAddLayer()
       {//在当前地图中添加图层
           CDlgSelect dlg;
           if ( dlg.DoModal() = = IDOK )//打开选择数据集对话框
           {
               CSeDataSource *pDataSource = theApp.m_WorkSpace.GetDataSourceByAlias( dlg.m_strDatasourceAlias );
                if ( pDataSource )
                {
                    CSeDataset *pDataset = pDataSource->GetDataset( dlg.m_strDatasetName );
                    if (pDataset)
                    { //将所选数据集添加到地图中作为一个图层
                        m_MapWnd.AddLayer(pDataset);
                        m_MapWnd.Refresh();
                    }
                 }
            }
        }
       地图—图层管理 (工具条—图层管理)
       void CEditorView::OnLayerManager()
       {//弹出图层管理对话框
           CDlgLayerManager dlg;
           dlg.m_pMapWnd = &m_MapWnd;
           dlg.DoModal();
       }
       编辑—选择编辑层
       void CEditorView::OnSelectEditLayer()
       {
           //弹出选择可编辑图层对话框
           CDlgSelectLayer dlg;
           dlg.m_pMapWnd = &m_MapWnd;
           if (dlg.DoModal()= = IDOK )
           {
                m_strEditableLayer = dlg.m_strLayerName; //设置可编辑图层
                if ( m_MapWnd.SetEditableLayer( m_strEditableLayer ) )
                { //打开编辑工具条
                    CMainFrame *pFrame=(CMainFrame*)AfxGetMainWnd();      
                    pFrame->m_wndEditBar.ShowWindow( SW_SHOW );
                    pFrame->RecalcLayout();
                }
                m_MapWnd.Refresh();
            }
        }
        编辑—添加点(工具条—添加点)
        void CEditorView::OnAddPoint()
        {//设置或取消用户操作为添加点对象
 
          if( m_MapWnd.GetAction() == CSeDrawParameters::uaEditCreatePoint )
   
        {
                m_MapWnd.SetAction( CSeDrawParameters::uaNull );
            }
     
      else
            {
                m_MapWnd.SetAction( CSeDrawParameters::uaEditCreatePoint );
     
      }
         }
         void CEditorView::OnUpdateAddPoint(CCmdUI* pCmdUI)
         {//点数据集,添加点对象菜单才有效
             CSeLayer *pLayer = m_MapWnd.GetLayer( m_strEditableLayer );
             if( pLayer != NULL )
             {
    
            CSeDatasetVector *pDtV = ( CSeDatasetVector * )( pLayer->GetDataset() );
                 pCmdUI->Enable( pDtV->GetType() == CSeDatasetInfo::Point );
             }
      
      else
      
      {
                 pCmdUI->Enable( false );
      
      }pCmdUI->SetCheck( m_MapWnd.GetAction() == CSeDrawParameters::uaEditCreatePoint );
          }
          对象的编辑大同小异,这里不赘述,具体的请看editor工程,其他编辑功能对应函数列表如下:
          功能(对应菜单—工具条) 对应的函数
          编辑——添加线(工具条——添加线)
    OnAddLine 、OnUpdateAddLine
          编辑——添加面(工具条——添加面)
    OnAddPolygon、OnUpdateAddPolygon
          编辑——添加文本(工具条——添加文本) OnAddText、OnUpdateAddText
          编辑——编辑文本(工具条——编辑文本) OnEditText、OnUpdateEditText
          编辑——删除对象(工具条——删除对象) OnDeleteObject、OnUpdateDeleteObject
          编辑——移动对象(工具条——移动对象) OnMoveObject、OnUpdateMoveObject
          编辑——增加节点(工具条——增加节点) OnAddVertex、OnUpdateAddVertex
          编辑——删除节点(工具条——删除节点) OnDeleteVertex、OnUpdateDeleteVertex
          编辑——编辑节点(工具条——编辑节点) OnEditVertex、OnUpdateEditVertex

 

    7、其他的鼠标响应重载函数请参考MapOperation工程。


(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
     
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.
     

                   滇ICP备05006901号