




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AO开发笔记(实战篇)用VC+AO开发独立的应用程序(1)AO开发笔记(实战篇)用VC+AO开发独立的应用程序(1) 作者:Snoopy 转贴自:本站原创 点击数:679 文章录入:snoopy 一、AO简介 ArcObject(以下简称AO)是ESRI公司构建ArcGIS系列软件的基础技术框架,是一个庞大的COM组件集。AO不是为最终用户提供的,它是为开发人员提供的二次开发组件,通过AO用户可以实现功能强大的应用软件,据说如果水平足够高,用它可以开发出一套ArcMap来。只要用户购买来ESRI的产品,都会拥有AO组件,从ArcGIS9.0开始,ESRI推出了ArcEngine,使得用AO开发的程序不再需要ArcGIS Desktop,只需要购买安装ArcEngine运行时即可。 由于AO是基于COM技术开发出的组件式GIS开发产品,因此可以选择自己熟悉的支持COM标准的开发平台来进行GIS应用开发,如:Visual C+、Visual Basic、Delphi、.NET等,另外也可以在ArcGIS上使用VBA环境进行二次开发。 在真正用AO来进行GIS应用开发之前,至少需要熟悉一种开发平台、COM开发的一些基本知识。在以后的文章中将以Visual C+6.0为开发工具进行介绍,并且假定你对Visual C+6.0有一定的了解,对COM应用也有一定的认识。 在我们开始编写第一个程序之前,你的系统中除了要安装Visual C+6.0之外,还应该安装有ArcGIS Desktop 和ArcGIS DeveloperKit,或者装有ArcEngine开发包和运行包。在ArcGIS DeveloperKit和ArcEngine开发包里都有AO的开发文档以及几种开发语言的实例,一般安装在:ArcGIS安装路径ArcGISDeveloperKit下面。在开发文档中除了各种接口和类的介绍外,还有DeveloperKitsamples下面的实例的介绍,里面有许多实用的例子是我们学习AO编程好资料。二、实现一个简单的AO程序 接下来我们就从最简单的一个可以打开地图的例子开始。 首先新建一个MFC的项目,如下图:1点击OK按钮进入下一步:2选择Single document点击Next在后面的几步中选择默认设置,在最后一步时,选择View类的基类为CFormView,如下图:3点击Finish,新的项目就建好了。接下来右键点击From对话框,在出现的菜单里选择Insert ActiveX Controls。4在出现的对话框里选择ESRI MapControl,确定。5接下来查看修改ESRI MapControl的属性(如下图),选择Control页,在Map Document:处选择一个mxd/mxt/pmf文件,即要加载的地图文档。6或者选择Map页(如下图:),在右边的list中添加图层也可。7保存修改,编译程序。运行就可以看到一个简单显示地图的程序了(如下图)。8三、本章小结 上面只是一个简单实例,里面有许多功能都没有,当你把程序窗口最大化时你会发现,地图窗口没有随窗口放大。在下一节我们将完善这个功能,并添加地图漫游的一些功能。 作者:Snoopy转自3S技术AO开发笔记(实战篇)用VC+AO开发独立的应用程序(2)作者:Snoopy文章来源:中国3S网站()点击数:4297更新时间:2006-12-11摘要:在上一节中我们实现了一个简单的显示地图的程序。下面我们在它的基础上完善和添加以下新的功能:1当框架窗口大小更改时改变地图控件窗口使之随框架窗口增大。2增加地图漫游功能:移动、放大、缩小、显示全图一、更改项目配置、添加引入库代码在本节中我们将使用AO提供的一些接口,所以需要更改项目配置,以及添加引用AO库的代码。首先打开上一节所建项目。选择菜单Tools-Options-Directories页在Include files里添加两个路径(如果你的ArcGIS的安装目录在其它盘,需做相应改动):C:PROGRAM FILESARCGISCOMC:PROGRAM FILESARCGISBIN在项目的StdAfx.h中添加如下代码:/ AO引入库#pragmawarning(push)#pragmawarning(disable: 4192)#pragmawarning(disable: 4146)#importesriSystem.olbraw_interfaces_only raw_native_types no_namespace named_guids exclude(OLE_COLOR,OLE_HANDLE,VARTYPE,IStatusBar)#importesriSystemUI.olbraw_interfaces_only, raw_native_types, no_namespace, named_guids exclude(IProgressDialog)#importesriGeometry.olbraw_interfaces_only raw_native_types no_namespace named_guids#importesriDisplay.olbraw_interfaces_only raw_native_types no_namespace named_guids#importesriGeoDatabase.olbraw_interfaces_only raw_native_types no_namespace named_guids#importesriCarto.olbraw_interfaces_only, raw_native_types, no_namespace, named_guids#importesriDataSourcesFile.olbraw_interfaces_only raw_native_types no_namespace named_guids exclude(OLE_COLOR,OLE_HANDLE)#importesriDataSourcesGDB.olbraw_interfaces_only raw_native_types no_namespace named_guids exclude(OLE_COLOR,OLE_HANDLE)#importToolbarControl.ocxraw_interfaces_only raw_native_types no_namespace named_guids#importTOCControl.ocxraw_interfaces_only raw_native_types no_namespace named_guids#importMapControl.ocxraw_interfaces_only raw_native_types no_namespace named_guids#importPageLayoutControl.ocxraw_interfaces_only raw_native_types no_namespace named_guids#importArcReaderControl.ocxraw_interfaces_only raw_native_types no_namespace named_guids#pragmawarning(pop)二、添加地图浏览功能,完善地图窗口缩放1、使MapControl随窗口放大首先为CAOExStep1View添加一个保护类型的成员变量:IMapControl3Ptrm_ipMapControl;/地图控件该变量保存指向MapContrl的接口指针。然后在类CAOExStep1View的成员函数OnInitialUpdate添加如下代码初始化它(红色部分):void CAOExStep1View:OnInitialUpdate()/此处省略其它代码/获取MapControl指针m_ipMapControl = GetDlgItem(IDC_MAPCONTROL1)-GetControlUnknown();为类CAOExStep1View添加窗口改变大小事件函数,并在里面添加如下代码(红色部分):void CAOExStep1View:OnSize(UINT nType, int cx, int cy)CFormView:OnSize(nType, cx, cy);/ View窗口改变大小时改变MapControl大小if(m_ipMapControl!=NULL)CRect rc;GetClientRect(rc);GetDlgItem(IDC_MAPCONTROL1)-MoveWindow(rc);经过上面的修改,现在重新编译程序,把窗口最大化,你会看到地图窗口随之放大。2、接下来我们来添加地图漫游功能首先把项目默认的工具栏按钮全部删除只留下关于按钮。然后添加5个按钮,按钮ID和提示文本如下,按钮的图标可以使用ArcGIS的相应功能的图标(ArcGIS的一些图标保存在按照目录的BinIcons下面,是一系列bmp文件)。ID_MAP_ARROW选择状态n选择状态ID_MAP_PAN地图平移n地图平移ID_MAP_ZOOMIN地图放大n地图放大ID_MAP_ZOOMOUT地图缩小n地图缩小ID_MAP_FULLEXTENT显示全图n显示全图为了处理鼠标事件我们需要为MapControl添加一个onMouseDown事件函数,在类CAOExStep1View里添加上面添加的工具栏按钮的响应函数,另外我们还需要在类CAOExStep1View头文件里添加一个标志当前鼠标操作状态的成员变量:esriARToolm_ARTool;/鼠标当前状态在工具栏响应函数中添加如下代码(红色部分):/选择状态void CAOExStep1View:OnMapArrow()m_ARTool = esriARToolNoneSelected;m_ipMapControl-put_MousePointer(esriPointerDefault);/地图平移void CAOExStep1View:OnMapPan()m_ARTool = esriARToolMapPan;m_ipMapControl-put_MousePointer(esriPointerPan);/地图放大void CAOExStep1View:OnMapZoomin()m_ARTool = esriARToolMapZoomIn;m_ipMapControl-put_MousePointer(esriPointerZoomIn);/地图缩小void CAOExStep1View:OnMapZoomout()m_ARTool = esriARToolMapZoomOut;m_ipMapControl-put_MousePointer(esriPointerZoomOut);/显示全图void CAOExStep1View:OnMapFullextent()IActiveViewPtr ipActiveView;HRESULT hr=m_ipMapControl-get_ActiveView(&ipActiveView);if (FAILED(hr) return;IEnvelopePtr ipEnvelope;hr = ipActiveView-get_FullExtent(&ipEnvelope);if (FAILED(hr) return;ipActiveView-put_Extent(ipEnvelope);ipActiveView-Refresh();未完,见AO开发笔记(实战篇)用VC+AO开发独立的应用程序(2)续。AO开发笔记(实战篇)用VC+AO开发独立的应用程序(2)续作者:Snoopy文章来源:中国3S网站()点击数:2619更新时间:2006-12-11摘要:在鼠标事件函数中添加如下代码(红色部分):void CAOExStep1View:OnonMouseDownMapcontrol1(long button, long shift, long x, long y, double mapX, double mapY)if(1 = button) /鼠标左键按下IActiveViewPtr ipActiveView;HRESULT hr=m_ipMapControl-get_ActiveView(&ipActiveView);if (ipActiveView = NULL) return ;switch(m_ARTool)case esriARToolNoneSelected:break;case esriARToolMapZoomIn: /地图放大IEnvelopePtr ipEnvelope;hr = ipActiveView-get_Extent(&ipEnvelope);if (FAILED(hr) return ;hr = m_ipMapControl-TrackRectangle(&ipEnvelope);if (FAILED(hr) return ;if(ipEnvelope = NULL) return ;double XMin,YMin,XMax,YMax;XMin=YMin=XMax=YMax=0.0;if(S_OK !=ipEnvelope-get_XMin(&XMin) XMin = 0.0;if(S_OK !=ipEnvelope-get_YMin(&YMin) YMin = 0.0; if(S_OK !=ipEnvelope-get_XMax(&XMax) XMax = 0.0;if(S_OK !=ipEnvelope-get_YMax(&YMax) YMax = 0.0;if(XMin!=XMax&YMin!=YMax)/用户拉框选择区域放大ipActiveView-put_Extent(ipEnvelope);ipActiveView-Refresh();else/用户点击进行放大ipActiveView-get_Extent(&ipEnvelope);if (FAILED(hr) return ;IPointPtr ipPoint(CLSID_Point);ipPoint-put_X(mapX);ipPoint-put_Y(mapY);/设置中心点为用户点击为主ipEnvelope-CenterAt(ipPoint);ipEnvelope-Expand(0.5, 0.5, true);ipActiveView-put_Extent(ipEnvelope);ipActiveView-Refresh();break;case esriARToolMapZoomOut: /地图缩小IEnvelopePtr ipEnvelope;hr = ipActiveView-get_Extent(&ipEnvelope);if (FAILED(hr) return ;IPointPtr ipPoint(CLSID_Point);ipPoint-put_X(mapX);ipPoint-put_Y(mapY); ipEnvelope-CenterAt(ipPoint);/设置中心点为用户点击为主ipEnvelope-Expand(2, 2, true);ipActiveView-put_Extent(ipEnvelope);ipActiveView-Refresh();break;case esriARToolMapPan: /地图平移m_ipMapControl-Pan();break;default:break;为工具栏前四个按钮添加UPDATE_COMMAND_UI更新函数,代码如下:/更新工具栏void CAOExStep1View:OnUpdateMapArrow(CCmdUI* pCmdUI)pCmdUI-SetCheck(m_ARTool = esriARToolNoneSelected);void CAOExStep1View:OnUpdateMapPan(CCmdUI* pCmdUI)pCmdUI-SetCheck(m_ARTool = esriARToolMapPan);void CAOExStep1View:OnUpdateMapZoomin(CCmdUI* pCmdUI)pCmdUI-SetCheck(m_ARTool = esriARToolMapZoomIn);void CAOExStep1View:OnUpdateMapZoomout(CCmdUI* pCmdUI)pCmdUI-SetCheck(m_ARTool = esriARToolMapZoomOut);保存修改,编译程序。运行就可以对地图进行放大、缩小、平移、显示全图的操作了(如下图)。三、本章小结上面我们添加了地图漫游的功能,并使地图窗口随框架窗口一起缩放。你可能发现我们的程序加载的地图是在设置MapControl控件属性时指定的。我们在下一节中将实现从shp文件加载地图,并实现图层管理的一些功能。AO开发笔记(实战篇)用VC+AO开发独立的应用程序(3)作者:Snoopy文章来源:中国3S网站()点击数:3221更新时间:2006-12-11摘要:你可能发现我们的程序加载的地图是在设置MapControl控件属性时指定的,在本节我们将实现如下新功能:1从shp文件加载图层数据。2实现图层管理的一些功能,如:图层显示/隐藏、图层叠加顺序调整、图层的删除。一、添加从shp文件加载图层数据功能首先去掉MapContrl属性里面默认打开的地图文档或默认加载的图层,然后在工具栏添加新的按钮,按钮ID和提示文本如下:ID_ADD_LAYER_FRMSHP从shp文件加载图层n从shp文件加载图层接下来为类添加该按钮的响应函数,并在函数中添加如下代码(红色部分):/从shp文件加载数据void CAOExStep1View:OnAddLayerFrmshp()/显示选择shp文件的对话框const TCHAR * szFilters = _T(shp File (*.shp)|*.shp|);CFileDialogmDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, szFilters);if (mDlg.DoModal() = IDCANCEL) return;/获取文件路径和名称CString sztemp = mDlg.GetPathName();CString szFileName,szPath;szFileName = sztemp.Left(sztemp.ReverseFind()+1);szPath = sztemp.Mid(sztemp.ReverseFind()+1);/添加新图层m_ipMapControl-AddShapeFile(CComBSTR(szFileName),CComBSTR(szPath);保存修改编译,运行点击加载图层工具栏按钮就可以看到如下画面:二、添加图层管理功能首先在工具栏添加新的按钮,按钮ID和提示文本如下:ID_LAYER_MANAGE图层管理n图层管理然后我们添加一个图层管理的对话框,在里面添加一个Listctrl三个按钮,如下图:几个控件的ID分别为:IDC_LIST_LAYERIDC_BTN_UPIDC_BTN_DOWNIDC_BTN_DEL其中IDC_LIST_LAYER的样式为Report。设置完毕,为该对话框添加类ClayerManageDlg,并且为IDC_LIST_LAYER添加一个控件变量CListCtrlm_listLayer,再添加几个按钮的响应函数,以及对话框初始化函数(OnInitDialog())。然后再添加如下函数和成员变量:voidRefreshMap();/刷新地图BOOLGetAllLayer();/获取所有图层IMapControl3Ptrm_ipMapControl;/地图控件CImageListm_ImageList;/ LIST图形列表m_ipMapControl用来保存传递过来的MapControl指针,我们更改一下默认的构造函数,在对话框构造函数里面初始化改变量,代码如下:/ LayerManageDlg.h : header file下面为头文件中函数内容CLayerManageDlg(IMapControl3PtripMapControl,CWnd*pParent=NULL/ LayerManageDlg.cpp : implementation file下面为cpp文件中函数内容CLayerManageDlg:CLayerManageDlg(IMapControl3PtripMapControl,CWnd*pParent/*=NULL*/):CDialog(CLayerManageDlg:IDD,pParent)m_ipMapControl=ipMapControl;在对话框初始化函数里面我们需要加入如下代码以初始化ListCtrl并获取图层:/新建ImageList,然后从ICON里面加载m_ImageList.Create(16, 16,ILC_COLOR32, 0, 1);m_ImageList.Add(AfxGetApp()-LoadIcon(IDI_ICON_LAYER);/设置LIST图像列表,样式,添加Columnm_listLayer.SetImageList(&m_ImageList,LVSIL_SMALL);m_listLayer.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT);m_listLayer.InsertColumn(0,图层名称,LVCFMT_LEFT,200);GetAllLayer();/获取当前地图的图层并添加到LIST中AO开发笔记(实战篇)用VC+AO开发独立的应用程序(3)续1作者:Snoopy文章来源:中国3S网站()点击数:2872更新时间:2006-12-11摘要:另外几个函数代码如下:/获取所有图层BOOLCLayerManageDlg:GetAllLayer()if(m_ipMapControl=NULL)returnFALSE;longlLayerCount=0;m_ipMapControl-get_LayerCount(&lLayerCount);CStringszLayersName;intiIndex=0;for(longi=0;iget_Layer(i,&ipLayer);if(ipLayer)BSTRbstrLayerName;ipLayer-get_Name(&bstrLayerName);VARIANT_BOOLbVisible=FALSE;ipLayer-get_Visible(&bVisible);szLayersName=bstrLayerName;:SysFreeString(bstrLayerName);m_listLayer.InsertItem(iIndex,szLayersName,0);m_listLayer.SetCheck(iIndex,bVisible);iIndex+;returnTRUE;/刷新地图显示voidCLayerManageDlg:RefreshMap()IActiveViewPtripActiveView;HRESULThr=m_ipMapControl-get_ActiveView(&ipActiveView);if(ipActiveView!=NULL)ipActiveView-Refresh();/上移图层voidCLayerManageDlg:OnBtnUp()intiCurSel=m_listLayer.GetSelectionMark();if(iCurSelget_Map(&ipMap);if(FAILED(hr)return;ILayerPtripLayer;hr=ipMap-get_Layer(iCurSel,&ipLayer);if(FAILED(hr)return;hr=ipMap-MoveLayer(ipLayer,iCurSel-1);if(FAILED(hr)return;RefreshMap();CStringszLayerName=m_listLayer.GetItemText(iCurSel,0);BOOLbVisiable=m_listLayer.GetCheck(iCurSel);m_listLayer.DeleteItem(iCurSel);intiNewItem=m_listLayer.InsertItem(iCurSel-1,szLayerName,0);m_listLayer.SetCheck(iNewItem,bVisiable);/下移图层voidCLayerManageDlg:OnBtnDown()intiCurSel=m_listLayer.GetSelectionMark();if(iCurSel=m_listLayer.GetItemCount()-1)return;IMapPtripMap;HRESULThr=m_ipMapControl-get_Map(&ipMap);if(FAILED(hr)return;ILayerPtripLayer;hr=ipMap-get_Layer(iCurSel,&ipLayer);if(FAILED(hr)return;hr=ipMap-MoveLayer(ipLayer,iCurSel+1);if(FAILED(hr)return;RefreshMap();CStringszLayerName=m_listLayer.GetItemText(iCurSel,0);BOOLbVisiable=m_listLayer.GetCheck(iCurSel);m_listLayer.DeleteItem(iCurSel);intiNewItem=m_listLayer.InsertItem(iCurSel+1,szLayerName,0);m_listLayer.SetCheck(iNewItem,bVisiable);AO开发笔记(实战篇)用VC+AO开发独立的应用程序(3)续2作者:Snoopy文章来源:中国3S网站()点击数:3544更新时间:2006-12-11摘要:/删除图层voidCLayerManageDlg:OnBtnDel()intiCurSel=m_listLayer.GetSelectionMark();if(iCurSelget_Map(&ipMap);if(FAILED(hr)return;/获取要删除的图层ILayerPtripLayer;hr=ipMap-get_Layer(iCurSel,&ipLayer);if(FAILED(hr)return;ipMap-DeleteLayer(ipLayer);if(FAILED(hr)return;m_listLayer.DeleteItem(iCurSel);保存、编译、运行,先点击工具栏添加图层数据,然后点击图层管理按钮,出现图层管理的对话框,在ListCtrl中选择一行,点击按钮:上移、下移、删除,可以看到相应的效果(见下图):在图层列表中每行记录前面的复选框是用来控制图层是否可见的,因为在ListCtrl的事件函数里面没有专门处理复选框的点击消息的函数,所以我们从ClistCtrl派生一个新的类专门处理它。在Classview页右击项目名称在出现的菜单里面选择New Class,添加一个新类ClistCtrlEx,类型选择MFC Class基类选择ClistCtrl,如下图:在生成的新类中添加一个自定义消息,当用户点击复选框时向父窗口发送此消息:#
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黄金期货避险属性研究-洞察及研究
- 基于拓扑优化的凸镰片轻量化与抗冲击性协同提升路径
- 基于AI的蒽醌类化合物绿色合成路径动态优化与能耗平衡模型构建
- 可降解材料在一次性导尿管中的应用前景与成本控制双重挑战
- 可拆卸模块化设计对试验机重复性测试效率的增益与结构强度损耗悖论
- 反射型钠灯在文物荧光成像中的多尺度散射补偿算法
- 双叉结构动态载荷分布特性对密封件寿命的影响建模及优化策略
- 医疗器械供应链韧性视角下切面刀关键合金元素全球价格波动传导机制
- 区块链技术重构财务凭证可信度与数据主权边界
- 包装材料生物降解与成本控制的双重阈值挑战
- 公共空间设计培训课件
- 2025年公安部交管局三力测试题库及答案
- 2025年肇庆市怀集县卫生事业单位招聘考试笔试试卷【附答案】
- 2025年邮政集团招聘考试复习资料与预测题
- 2025年第十届全国中小学“学宪法、讲宪法”知识竞赛题库及答案
- 地下管网管道施工现场管理方案
- 江苏省扬州市2025年中考语文试卷(含答案)
- 2025年版《煤矿安全规程》考试题库(含答案)
- 押运员持枪证考试试题及答案
- 二次供水卫生监督课件
- 2025浙江省储备粮管理集团有限公司所属企业招聘7人(第一批)笔试参考题库附带答案详解(10套)
评论
0/150
提交评论