GIS软件设计武汉大学资环学院蔡忠亮如何开发GIS软件?主讲:蔡忠亮GIS软件设计武汉大学资环学院蔡忠亮一、基础二、设计三、开发内容GIS软件设计武汉大学资环学院蔡忠亮应该选择什么语言?一、开发基础任务目的兴趣语言A=语言B不要将时间浪费在选择上!GIS软件设计武汉大学资环学院蔡忠亮应该如何学习语言?一、开发基础如同自然语言掌握语言精髓(看书)实践时间要虚心求教要参与到项目中去语言不是背出来的!面向过程面向对象GIS软件设计武汉大学资环学院蔡忠亮掌握语言环境一、开发基础环境!=语言如何建立适合的工程了解工程机制充分利用环境的工具我的程序应该放在哪里?应用程序文档类主窗口视类子窗口类数据输入输出管理等数据显示,事件控制等GIS软件设计武汉大学资环学院蔡忠亮相关知识的储备一、开发基础专业数据结构图形学计算机数据库软件工程会使用一些专业相关软件语言+环境!=软件GIS软件设计武汉大学资环学院蔡忠亮从软件工程的角度去设计二、设计制定GIS开发计划GIS需求分析GIS系统设计GIS程序编码GIS产品测试GIS运行与维护GIS定义阶段GIS开发阶段GIS维护阶段写程序!=软件开发GIS软件设计武汉大学资环学院蔡忠亮设计方法二、设计结构化设计方法原型化设计方法面向对象设计方法语义数据模型主要特征面向对象分析与设计外部模型概念模型内部模型数据的用户视图实体及其关系的内涵数据的物理模型类的定义(规格说明)类之间的应用级关系类的实现面向对象设计GIS软件设计武汉大学资环学院蔡忠亮UML是你的好帮手二、设计之所以为系统建模,是因为我们不可能全面的理解任何一个复杂的系统。随着系统复杂性的增加,先进的建模技术越来越重要。一个项目的成功有许多原因,严格的建模语言标准是其中一个重要的因素。ROSEVisioPowerDesigner……GIS软件设计武汉大学资环学院蔡忠亮设计什么?二、设计结构设计功能设计(基本+需求)界面设计GIS软件设计武汉大学资环学院蔡忠亮GIS软件如何设计?二、设计用OO思维GIS问题GIS=输入+分析+输出概念设计-》逻辑设计-》物理设计充分利用OO的特性!GIS软件设计武汉大学资环学院蔡忠亮如何逻辑设计?二、设计理解OpenGIS的规范突破“图”对GIS的思维限制理清层次结构关系几何目标、地理目标、制图目标输入分析查询输出GIS软件设计武汉大学资环学院蔡忠亮如何逻辑设计?二、设计CGeoLineCGeoPolyCGeoRegionCGeoRouteCGeoPointCGeoGroupCGeoMapCGeoObjectCGeoLayerCGeoAnnoCGeoProjectCGeomObjectThis?GIS软件设计武汉大学资环学院蔡忠亮几何目标逻辑设计二、设计GIS软件设计武汉大学资环学院蔡忠亮结合语言环境设计二、设计ViewDocMap……GIS软件设计武汉大学资环学院蔡忠亮二、设计想好了你再做!GIS软件设计武汉大学资环学院蔡忠亮三、开发怎样开始?看实例设计与开发简单的独立模快建立小型系统不要从写进入系统的密码程序开始!GIS软件设计武汉大学资环学院蔡忠亮三、开发文件操作(以VC为例)文件操作FILECFilefstreamGIS软件设计武汉大学资环学院蔡忠亮三、开发文件数据到对象建立获取图幅信息获取图层信息获取目标信息文件头信息图层1信息目标1信息目标2信息……图层2信息目标1信息目标2信息……循环循环建立图幅(NewMap)建立图层(NewLayer)建立目标(NewObject)GIS软件设计武汉大学资环学院蔡忠亮三、开发与图形显示相关的MFC类绘图类CDCCPaintDCCClientDC绘图设备类CFontCPenCBrushCRgnCPaletteCBitmap用户区非用户区GIS软件设计武汉大学资环学院蔡忠亮三、开发坐标映射类设备无关性Windows的映射方式设置方式:CDC::SetMapMode(MM_ISOTROPIC);逻辑坐标与物理坐标的转换方法CDC::LPtoDP()CDC::DPtoLP()窗口与视口窗口与视口概念操作函数CDC::SetViewportOrg()CDC::SetViewportExt()CDC::SetWindowOrg()CDC::SetWindowExt()与图形显示相关的MFC类GIS软件设计武汉大学资环学院蔡忠亮三、开发其他绘图类操作函数选用绘图设备对象SelectStockObject()SelectObject()绘图属性设置函数设置或获取背景颜色–SetBkColor()–GetBkColor()设置或获取背景模式–SetBkMode()–GetBkMode()设置或获取绘制模式–SetROP2()–GetROP2()与图形显示相关的MFC类GIS软件设计武汉大学资环学院蔡忠亮三、开发文档与视结构文档文档打开文档保存文档关闭数据的输入/输出视图图形显示图形打印鼠标菜单消息的处理构造函数OnInitialUpdate()文档打开OnPrepareDC()OnPaint()OnDraw()设置映射模式和坐标映函数CView::OnDraw(){CDocument*pDoc=GetDocument();pDoc-Draw(pDC);}CDocument::Draw(CDC*pDC){pMap-Draw(pDC);}GIS软件设计武汉大学资环学院蔡忠亮三、开发交互式图形绘制定义绘制菜单定义鼠标消息OnMouseMove()OnLButtonDown()OnLButtonUp()OnRButtonDown()OnRButtonUp()OnLButtonDblClk()OnRButtonDblClk()捕捉/释放鼠标焦点SetCapture()ReleaseCapture()拖动功能(橡皮条)绘制各种目标(图形、文字)GIS软件设计武汉大学资环学院蔡忠亮三、开发交互式图形绘制图形重绘Invalidate()InvalidateRect()视图操作ZoomIn()ZoomOut()Pan()ShowAll()FullScreen()ScaleZoom()GIS软件设计武汉大学资环学院蔡忠亮三、开发视图放大实现视图管理GIS软件设计武汉大学资环学院蔡忠亮三、开发编辑功能撤销重复GIS软件设计武汉大学资环学院蔡忠亮enum{MOUSE_DEFAULT,MOUSE_LB_DOWN,MOUSE_LB_UP,MOUSE_LRBUP_MOVE,MOUSE_LRBDOWN_MOVE,MOUSE_RB_DOWN,MOUSE_RB_DOUBLEDOWN,}m_MouseAction;三、开发编辑环境设置定义鼠标动作定义编辑操作View中增加鼠标消息View中增加菜单消息绘图参数设置enum{EDIT_DEFAULT,EDIT_FIND,EDIT_ADD,EDIT_DELETE,EDIT_MOVE,EDIT_STRETCH,EDIT_ROTATION,EDIT_NODE,EDIT_SELDEL,EDIT_AXISED,EDIT_ANALYSIS,EDIT_CLIPOBJECT,EDIT_CLIPMAP,EDIT_POLYXOR,EDIT_LINEDECOM,EDIT_POLYSNAP,EDIT_CODECOPY,EDIT_FIND_LOCATION,ZOOMIN,ZOOMOUT,PAN,REDRAW,FITSIZE,}m_CurAction;GIS软件设计武汉大学资环学院蔡忠亮voidCTeleAgentView::OnUpdateEditObjectAdd(CCmdUI*pCmdUI){CTeleAgentDoc*pDoc=GetDocument();if(pDoc-m_pMap-IsLoadMap())pCmdUI-Enable(TRUE);elsepCmdUI-Enable(FALSE);if(m_CurAction==EDIT_ADD)pCmdUI-SetCheck(1);elsepCmdUI-SetCheck(0);}voidCTeleAgentView::OnEditObjectAdd(){m_CurAction=EDIT_ADD;SetDefaultDC();//准备绘图环境m_ptArray.RemoveAll();}三、开发消息处理菜单消息处理鼠标消息处理m_MouseAction=MOUSE_LRBUP_MOVE;//厖switch(m_CurAction){caseZOOMIN:{ViewZoomIn(m_MouseAction,point);break;}caseWANDER:{WanderMoveMove(nFlags,point);break;}caseEDIT_FIND:{SearchObjMouseMsg(m_MouseAction,point,nFlags);break;}caseEDIT_NODE:{SearchNodeMouseMsg(m_MouseAction,point,nFlags);break;}caseEDIT_SELDEL:{SelectDeleteObjMouseMsg(m_MouseAction,point,nFlags);break;}caseEDIT_ADD:{AddObjectMouseMsg(m_MouseAction,point,nFlags);break;}}GIS软件设计武汉大学资环学院蔡忠亮三、开发编辑功能实现GIS软件设计武汉大学资环学院蔡忠亮三、开发开发数据库应用程序的基础关系数据库(Oracle,SQLServer)SQL数据库的访问方式ODBC(OpenDatabaseConnectivity)MFCODBCDAOOLEDBADORDBMS几何空间数据存储子系统GISIDGIS软件设计武汉大学资环学院蔡忠亮三、开发DB开发实例ODBC建立数据源打开数据库操作数据库关闭数据库voidConnectToOdbc(){SQLConfigDataSource(NULL,ODBC_ADD_DSN,MicrosoftVisualFoxProDriver,DSN=AtlasDatabase\0Description=AtlasDatabase\0//FileType=MicrosoftVisualFoxProDriver\0//\0//DataDirectory=c:\\whatlas\\dbf\0//MaxScanRows=20\0);HKEYhKey;DWORDdw=0;RegCreateKeyEx(HKEY_CURRENT_USER,Software\\ODBC\\ODBC.INI\\AtlasDatabase,0,NULL,REG_OPTION_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,(unsignedlong*)&dw);charSzval[10];lstrcpy(Szval,c:\\\0);RegSetValueEx(hKey,SourceDB,NULL,REG_SZ,(CONSTBYTE*)Szval,lstrlen(Szval));}CDadabasedb;if(db.OpenEx(_T(DSN=AtlasDatabase),CDatabase::noOdbcDialog)){//操作处理}CStringstrSQL;strSQL=_T(SELECT*FROM);strSQL+=m_sDatabaseName;m_rsRecordset=newCRecordset(&db);if(m_rsRecordset-Open(CRecordset::snapshot,strSQL)==TRUE){m_siFieldNum