欢迎您来到GIS动力

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

一、功能描述

undefined undefined本工程主要演示基本查询方法的使用、如何显示对象的属性信息以及长度、面积量算功能的实现。 undefined undefined
 

二、类及方法:

undefined undefined
用到的类
方 法
CSeWorkSpace
Close、GetDataSourceAt、GetMaps、IsOpen 、Open
CSeDataSource
GetAlias 、GetCoordRatio 、GetCoordUnits 、GetDatasetCount、GetDatasetAt、GetDistUnits、GetPJSysInfo
CSeDatasetVector
GetDataSource、GetFieldCount 、GetFieldInfo 、GetName、GetType、QueryByBound 、QueryByCompound 、QueryByDistance 、QueryByGeneral、ReleaseRecordset
CSeRecordset
Edit 、GetCount 、GetDataset 、GetFieldCount 、GetFieldInfo 、GetFieldValue 、GetGeometry 、GetID 、IsBOF 、IsEOF 、MoveFirst、MoveLast 、MoveNext 、MovePrev 、SetFieldValue、Update
CSeFieldInfo
CSeFieldInfo
CSeMapWnd
AddLayer、Close、GetAction、GetDrawParam 、GetLayer 、GetLayerAt 、GetLayerCount 、GetSelection 、OnDraw、OnInitialUpdate、OnLButtonDblClk、OnLButtonDown、OnLButtonUp、OnMouseMove 、OpenMap、Refresh、SetAction、SetCenter 、ViewEntire
CSeMaps
GetMapCount、GetMapAt
CSeLayer
GetDataset、SetSelectable
CSeDrawParameters
ClientToMap
CSeRandomSelection
Add 、ToRecordset、ReleaseAll
CSeGeometry
GetCentroid
CSeGeoLine
GetLength 、Make
CSeGeoRegion
GetArea 、Make
CSeOperator
RotatePoint、RoundLong
全局函数
gGetCoordUnitsChineseName
undefined undefined
 

三、说明及约定

undefined undefined

1、工程说明
本工程为单文档类型的工程,提供菜单和工具条两种操作方式。
菜单中提供“文件、地图、查询”三组菜单,其中:前两个菜单参考工程MapOperation
“查询”这个组中有“SQL查询、范围查询、对象缓冲查询、范围复合查询、缓冲复合查询、距离量算、面积量算和对象属性”八个菜单项;
工具条有两个:
通用工具条:除了与MapOperation工程相同的功能外,还增加了“距离量算、面积量算、对象属性”三项,与菜单提供的相应功能的资源对应。
查询记录查看工具条:提供记录查询的显示操作“第一个、前一个、后一个、最后一个、结束记录显示”五项; 2、打开地图文

2、打开地图文件的约定
本工程主要是演示如何建立最简单的工程,并对地图进行基本操作,故约定:
打开工作空间后,判断有没有地图,如果有地图,则打开第一个地图,然后刷新地图窗口,显示地图;如果没有地图,则接着判断第一个数据源中有没有数据集,如果有,则把第一个数据集添加到地图窗口中,然后刷新地图窗口,显示地图。
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
注:本工程是在地图基本操作工程MapOperation基础上进行的查询,它的一些实现步骤和MapOperation相同,故这里只简要介绍实现步骤和对应的实现方法,详细内容参见工程源码,源码中都有详细的注释。
1、新建一个单文档界面的工程,命名为Query
2、改造原有的菜单,按 “三、说明及约定”中第一条所说的设置;
3、改造原有的工具条,按 “三、说明及约定”中第一条所说的设置;
4、添加两个类,CDlgQueryCDlgObjectProperty,其中: CDlgQuery是一个查询对话框类,如下图所示: 定义变量:

//与对话框中的控件相对应的变量
CListCtrl m_lstLayers; //图层名列表框
CComboBox m_cmbOperators; //操作符组合框
CComboBox m_cmbFields; //字段组合框
double m_dDistance; //缓冲半径
double m_dMaxX; //bound最大X
double m_dMaxY; //bound最大Y
double m_dMinX; //bound最小X
double m_dMinY; //bound最小Y
CString m_strSQL; //SQL查询语句
//自定义的变量
CSeRecordset *m_pQueryRecord; //记录查询结果
CSeMapWnd *m_pMapWnd; //地图显示指针【传入】
CImageList m_ImageList; //图像列表
int m_nQueryMode; /*查询方式 0 SQL 查询
1 对象缓冲 查询
2 范围 查询
3 范围复合 查询
4 缓冲复合 查询 */
CString m_strLayerName; //记录要查询的图层名
成员函数:
//与对话框和对话框中的控件相对应的函数
virtual BOOL OnInitDialog(); //初始化对话框
afx_msg void OnClickListLayers(NMHDR* pNMHDR, LRESULT* pResult); //点击图层列表框事件
afx_msg void OnSelchangeComboFields(); //当选择字段名时,SQL查询语句+字段名
virtual void OnOK(); //根据查询模式开始查询
virtual void OnCancel(); //取消查询
afx_msg void OnSelchangeComboOperator(); //当选择操作符时,SQL语句+操作符
//自定义函数
void SetDialogStatus(); //根据查询模式设置查询对话框内控件的状态
void AddLayerName(); //在列表框中填入图层名
使用说明:
1) 当点击“查询—SQL查询”菜单,就弹出该对话框,这时可以选择要查询的图层、选择要查询的字段和操作符等,在SQL文本框中完成最后的SQL语句的输入,点击“查询”按钮就可以进行查询。
2) 点击“查询—范围查询”菜单,在地图中用鼠标画出要查询的矩形,之后弹出该对话框,这时,对话框中的bound的四个值就是鼠标所选择的bound值,选择图层后点击“查询”按钮就可以查询。
3) 在地图中选择一个几何对象,点击“查询—对象缓冲查询”,再按下鼠标左键即弹出该对话框,填入缓冲半径就可以进行查询。
4) 点击“查询—范围复合查询”菜单,在地图中用鼠标画出要查询的矩形,之后弹出该对话框,这时,对话框中的bound的四个值就是鼠标所选择的bound值,选择图层和确定SQL语句后点击“查询”按钮就可以查询。
5) 在地图中选择一个几何对象,点击“查询—缓冲复合查询”,再按下鼠标左键即弹出该对话框,填入缓冲半径和确定SQL语句就可以进行查询。 重要方法:具体的查询功能都是在OnOk()中实现的


CDlgObjectProperty是对象属性对话框类,如下图所示: 成员变量:

CEdit m_Edit; //控制字段修改值文本框
CListCtrl m_lstProperty; //对象属性列表
BOOL m_bModify; //是否修改字段值
CString m_strLayerName; //几何对象所在的图层名
long m_nID;
//几何对象的ID
CString m_strFieldName; //要修改的字段名字
CString m_strValue; //字段修改值
//记录要显示属性的对象
CSeRecordset *m_pRecordset;
成员函数:
//创建列表框的行
void BuildRows(int nRows, CString *pcValue);
//创建列表框的列
void BuildColumns(int nCols, int *nWidth, CString *csCol);
//在列表框中添加对象属性
void AddObjectProperty();
//初始化对话框
virtual BOOL OnInitDialog();
//响应点击列表框操作

afx_msg void OnClickListProperty(NMHDR* pNMHDR, LRESULT* pResult);
//当修改字段值检查框是否选中时,字段名和字段值文本框的状态
afx_msg void OnCheckModify();
//当文本框编辑失去焦点,即编辑完成时
afx_msg void OnKillfocusEditProperty();
//关闭该对话框
afx_msg void OnDestroy();
使用说明:点击菜单“查询—对象属性”和“工具条—对象属性”,选择要显示属性的对象,就弹出该对话框,除了可以查看对象的属性外,选中修改字段值还可以进行对象属性值的修改,
重要方法:修改对象的属性是在OnKillfocusEditProperty()方法中。

5、在QueryView.h文件中声明一些用于查询的变量及常量,并在构造函数中初始化:
CSeMapWnd m_MapWnd; //文件:用于地图显示
CSeRecordset *m_pRecordset; //文件:记录查询结果
BOOL m_bFileOpened; //文件:记录地图是否打开
CArray<CPoint,CPoint> m_arrPoint; //量算:保存系列点坐标!
CRect m_rcBounds; //查询:矩形查询的矩形区域
int m_nUserAction; //用户动作,如查询、量算、对象属性等
//定义用户动作
const int USER_ACTION_NONE =-1; //什么也不做
const int USER_ACTION_QUERY_BY_SQL =0; //SQL查询
const int USER_ACTION_QUERY_BY_DISTANCE =1; //对象缓冲查询
const int USER_ACTION_QUERY_BY_BOUNDS =2; //矩形区域查询
const int USER_ACTION_QUERY_BY_BOUNDS_COMPOUND =3; //矩形复合查询
const int USER_ACTION_QUERY_BY_BUFFER_COMPOUND =4; //缓冲复合查询
const int USER_ACTION_MEASURE_DISTANCE =10; //距离量算
const int USER_ACTION_MEASURE_AREA =11; //面积量算
const int USER_ACTION_OBJECT_PROPERTY =12; //显示对象属性
初始化变量:
CQueryView::CQueryView()
6、在QueryView.cpp文件中实现查询功能(按照菜单):
查询—SQL查询
void CQueryView::OnQueryBySql()
void CQueryView::OnUpdateQueryBySql(CCmdUI* pCmdUI)

查询—范围查询

void CQueryView::OnQueryByBounds()
void CQueryView::OnUpdateQueryByBounds(CCmdUI* pCmdUI)

查询—对象缓冲查询
void CQueryView::OnQueryByDistance()
void CQueryView::OnUpdateQueryByDistance(CCmdUI* pCmdUI)

查询—范围复合查询
void CQueryView::OnQueryByCompound1()
void CQueryView::OnUpdateQueryByCompound1(CCmdUI* pCmdUI)

查询—缓冲复合查询
void CQueryView::OnQueryByCompound2()
void CQueryView::OnUpdateQueryByCompound2(CCmdUI* pCmdUI)

查询—距离量算
void CQueryView::OnMeasureDistance()
void CQueryView::OnUpdateMeasureDistance(CCmdUI* pCmdUI)

查询—面积量算
void CQueryView::OnMeasureArea()
void CQueryView::OnUpdateMeasureArea(CCmdUI* pCmdUI)

查询—对象属性
void CQueryView::OnObjectProperty()

7、在QueryView.cpp文件中查询记录查看工具条功能的实现:
void CQueryView::OnRecordFirst() //显示查询出来的第一个记录
void CQueryView::OnRecordLast() //显示查询出来的最后一个记录
void CQueryView::OnRecordNext() //显示查询出来的当前记录的下一个记录
void CQueryView::OnRecordPrev() //显示查询出来的当前记录的前一个记录
void CQueryView::OnRecordStop() //释放查询记录,并隐藏查询结果查看工具条
//设置工具条是否可用
void CQueryView::OnUpdateRecordFirst(CCmdUI* pCmdUI)
void CQueryView::OnUpdateRecordLast(CCmdUI* pCmdUI)
void CQueryView::OnUpdateRecordNext(CCmdUI* pCmdUI)
void CQueryView::OnUpdateRecordPrev(CCmdUI* pCmdUI)

8、在QueryView.cpp文件中重要的重载函数
//重载,实现面积和长度的量算
void CQueryView::OnLButtonDblClk(UINT nFlags, CPoint point)

//重载,实现记录鼠标点、查询等功能
void CQueryView::OnLButtonDown(UINT nFlags, CPoint point)
//重载,实现范围查询和范围复合查询
void CQueryView::OnLButtonUp(UINT nFlags, CPoint point)
//重载,矩形区域查询时,将鼠标选中的区域显示出来,鼠标移动时,在状态栏内显示点坐标
void CQueryView::OnMouseMove(UINT nFlags, CPoint point)

9、辅助函数
//获取坐标系参数
BOOL CQueryView::GetSysCoorParam(long& nUnits, double& dRatio,long& nDisUnits);
//获取大地坐标系参数
BOOL CQueryView::GetEarthParam(double& dEarthRadius/*地球半径*/);
//显示查询结果
void CQueryView::ShowResult();
详细内容可参见Query工程。

(本文已被浏览 次)
发布人: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号