




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MAPGIS二次开发基础知识一、手动注册组件与注销组件COM以及客户应用程序所需的、用来定位组件及对组件进行实例化的信息存储在Windows的注册表(Registry)里。因此,在使用组件之前要对组件进行注册,只有成功注册才能引用该组件,其具体步骤为:将包容组件的DLL文件放入MAPGISPROGRAM目录下,假设物理路径为:D:\mapgis65\program\MapGisBasCom1.dll运行注册表程序注册组件Windows开始菜单-运行:regsvr32D:\mapgis65\program\MapGisBasCom1.dll注册成功与否将有对话框弹出。注销该组件方法为:regsvr32/uD:\mapgis65\program\MapGisBasCom1.dll二、 VisualBasic中嵌入对象类型库为了使VisualBasic能够访问MAPGIS对象定义,应该在VisuaiBasic项目或模块中嵌入MAPGIS对象类型库。如果想把一个VisualBasic对象声明为MAPGIS对象类型,要求嵌入MAPGIS对象类型库,如果想把一个VisualBasic对象声明为一般Object类型,就不必嵌入MAPGIS对象。为了在项目中嵌入MAPGIS对象类型库,通常执行这些步骤:从Project(工程)菜单,选择References,References对话框出现,选中复选框嵌入MapGisBasComlTypeLibrary文件。这要求VisualBasic环境或代码模块编辑器是活动的,正在运行。三、 使用MAPGIS对象可以使用VisualBasic编写使用MAPGIS对象的程序。在VisualBasic程序中使用MAPGIS对象所要求的步骤是:嵌入MAPGIS对象类型库。建立一个MAPGIS对象。使用MAPGIS对象和包含的其他对象。释放MAPGIS对象。使用一个句点(.)把对象变量与该对象的属性、方法和集合分开。四、 使用C++和COM函数可以使用C++和COM函数编写使用MAPGIS对象的程序。在C++程序中使用MAPGIS对象所要求的步骤是:嵌入MAPGIS对象和COM头文件,并链接到COM库。初始化C0M库。建立一个MAPGIS对象。4•使用MAPGIS对象和包含的其他对象。释放MAPGIS对象。6•解除C0M库的初始化。使用成员选择运算符(->)把“对象指针”变量与属性、方法和集合函数分开。嵌入MAPGIS对象对MAPGIS对象编程的第一步是在项目中嵌入合适的类型库或头文件。完整的MAPGIS对象类型库包含在MapGisBasComl.h文件中,这个文件的默认路径:D:\mapgis65\include\MapGisBasCom1.h类型库含有关于所有MAPGIS对象、属性和方法的信息。五、 COM的调用MAPGIS对象包括ANSI和Unicode这两个定制接口。使用ANSI接口时,所有MAPGIS对象字符串都是每个字符一个字节的ANSI字符串。使用Unicode接口时,所有MAPGIS对象字符串都是每个字符两个字节的Unicode字符串。所有MAPGIS对象字符串都使用====BSTR字符串数据类型。默认情况下使用ANSI定制接口和ANSI====BSTR字符串。如果想使用Unicode定制接口和Unicode=====BSTR字符串,在嵌入所有头文件之前必须定义UNICODE和—UNICODE。例如:#defineUNICODE#define_UNICODE在字符串值两端使用TEXT(“str”)宏。默认情况下,这些是ANSI'Str”字符串。在定义了UNICODE和_UNICODE时,这些是UnicodeL“Str”字符串。在32位0LE中,所有BSTR字符串是Unicode字符串。为了使C++程序能够访问MAPGIS对象定义,除了嵌入Windows和0LE头文件之外,还必须嵌人MAPGIS==.H和MAPGIS==.H头文件。默认情况下,MAPGIS头文件位于======\INCLUDE目录中。VisualC++项目的Include设置或INCLUDE环境变量应指向含有这些文件的目录。必须嵌入以下头文件:MapGisBasCom1_i.cMapGisBasCom1.h例如:#include"MapGisBasCom1_i.c"#include"MapGisBasCom1.h"VisualC++项目的Library设置或LIB环境变量应指向含有这些文件的目录。在程序能使用MAPGIS对象之前,必须初始化COM库。VisualBasicMAPGIS程序不必初始化COM,VisualBasic自动初始化COM库。C++所有MAPGISCOM函数都返回一个HRESULT值,这个值含有关于MAPGISCOM函数的成功或失败的信息。可以声明单个HRESULT变量并重复利用它。例如:HRESULThr;在调用任何MAPGIS或COM函数之前,MAPGIS程序必须使用COMCoInitialize函数初始化COM库。例如:hr=CoInitialize(Null);必须把NULL传递给CoInitialize。七、建立MAPGIS对象MAPGIS组件的核心是MAPGIS对象。VisualBasic在VisualBasic中有2个方法用于建立MAPGIS对象,这2个方法都涉及使用Dim语句声明特定类型的对象变量。特定的MAPGIS对象类型常用的方法(如果使用的VisualBasic版本支持它)是使用Dim语句声明特定MAPGIS对象对象类型的对象变量,这个方法要求MAPGIS类型库包括在VisualBasic项目中。为了实际建立一个MAPGIS对象的新实例.可以在Dim语句中使用New关键字(如果使用VisualBasic版本支持它的话)或者使用CreateObject函数。例如,使用New关键字创建新的MAPGIS对象的语句是:DimldotAsNewL_DOT例如,使用CreateObject函数声明和创建一个新的MapGis对象:DimldotAsL_DOTSetldot=CreateObject("MapGisBasCom1.L_DOT")有些版本的VisualBasic使用虚函数表绑定(vtable-binding),或早期绑定。直接使用MAPGIS定制接口(不通过COMIDispatch接口),产生最好的性能。有些版本的VisualBasic使用推迟绑定的形式,叫做分派ID绑定(dispID,binding),它使用COMIDispatchoIDispatch::Invoke函数与在MAPGIS类型库中包括的dispID一起使用。这种方法使应用的性能没有使用New关键字那样快•但比使用Object类型快。八、 在C++中建立MAPGIS对象在C++中只有一种方法建立MAPGIS对象,声明合适的MAPGIS“对象指针"类型的对象变量,然后使用COMCoCreateInstance函数建立MAPGIS对象的新实例。把以下参数传递给CoCreateInstance:MAPGIS对象的类IDNULLCLSCTX_INPROC_SERVERMAPGIS对象的接口IDMAPGIS“对象指针”变量的地址(使用&运算符的地址)例如,要建立一个新的ID_DotMAPGIS对象:IPntArea*ptPAi;hr=CoCreateInstance(CLSID_PntArea,NULL,CLSCTX_INPROC_SERVER,IID_IPntArea,(void**)&ptPAi);注意:一个多线程程序,必须串行化对MAPGIS对象的所有访问,以避免重入.九、 函数库名称函数库名称 c,c++说明文件工作区基础函数 Win_area.h矩形图框函数frmdll32.h投影类库projdll.h控制点操作 w32_cpnt.h状态栏显示点转换以及工作区投影函数cordcvt.h图形显示输出 Map_out.hwin_out.h工程对象操作函数以及拼版文件操作函数Map_prj.h编辑工程文件 Prj_Disp.h图例和工程文件操作函数Project.h图像显示函数 Mapdisp.h图像编辑函数 Mapedit.h输入编辑子系统类库 CGisEdit.hCPrjEdit.h拓扑操作函数 Gistopo.h图元以及剪贴板操作函数 clippaste.hUNDO处理数据及成员函数gistool.h窗口操作函数 CGisView.hGisView对象函数Win_oper.h空间分析函数 Spc_anly.h各种头文件 MapGis.h十、怎样用vb对mapgis进行二次开发,不知道怎样将二者联系起来Vb开发三种方式:MAPGISAPI开发库通过调用应用程序接口直接编程MAPGIS可视控件(ocx)MAPGIS组件开发(com)通过控件和组件编程如何创建MAPGIS对象DimworkaiAsNEWPntAreaDimworkaiAsPntAreaSetworkai=CreateObject(“MapGisBasCom1.pntarea”)三种方式可以互为补充。前MAPGIS二次开发库主要以API函数、MFC类库、ActiveX控件三种方式提供。开发库被封装于若干动态链接库(DLL)中。API函数在使用方法上与Windows的API函数完全一样,因此是独立于开发工具的。无论您使用VC++、VB还是Dephi...,您在这些工具中如何调用Windows的API函数,您就怎么调用这些二次开发函数。MAPGIS类库是为基于MFC(MicrosoftFoundationClass)的开发者提供的多个可重用基类,将应用程序所需的常见基本功能作了封装,使用便利,改动灵活。开发者只需从类库派生即可使自己的程序获得从窗口显示控制到图形查询编辑的各项功能。MAPGIS二次开发常见问题及解答(转载)MAPGIS二次开发常见问题及解答(转载)1、 问:如何用Delphi生成MAPGIS明码文件?答:先利用手册看懂明码格式文件的格式,知道数据的组织方式,利用delphi的文件函数创建一个文本型文件,吧数据库中的数据按照格式输出就是了。2、 问:ATT_STRU和CATT_STRU的区别和联系?答:ATT_STRU是以前老版本的东东,换成CATT_STRU试试.CATT_STRU中包含了属性结构的详细信息,具体用法可参见二次开发帮助文档中第三章数据结构中关于属性字段描述结构,属性字段描述头和属性信息头的介绍,里面有该结构的详细内容。3、 问:请教关于''不能打开子图库…”的问题,急!答:系统库路径不对,将mapfont.gis、mconfig.gis、netcfg.gis三个文件拷贝到执行目录即可。这几个语言件放在MAPGIS\PROGRAM\目录中。或是运行MapEnv.exe可设置,该运行文件也同样在MAPGIS\PROGRAM\目录中。4、 问:如果只知道工作区ai能不能依次得到工作区中的图元号,该如何得到啊!答:longi,pntn;shortlen;pnt_infoinf;d_dotxy;char*dat;_GetPntNum(ai,&i,&pntn);〃取点数for(i=1;i《pntn;i++){if(_getpnt(ai,i,&xy,&dat,&len,&inf)<=O)〃取点,返回值1/0/-1成功/失败/删除continue;…对该图元进行操作}}i就是图元号5、 问:MapGis6.5的SDK函数NearPnt,到底应该如何用啊!跟以前的不同了,给个例子吧!答:longWINAPI_NearPnt(shortai,D_DOT*xy,unsignedchar*layerOnOffPad,shortpadLen,double*dis);ai点工作区号*xy点位置号---比如鼠标的位置layeronoffpad图层开关标志,如不为空就只在打开状态的图层中查找padLen是layerOnOffPad的长度出口dis返回距离返回值成功返回点号,失败为06、 问:如何屏蔽掉CPrjEditView中的右键功能editview有一个PopMenuControl属性,同理CPrjEditView也可以直接使用这个属性。editview.PopMenuControl=-17〃不显示菜单=07〃全部显示=17〃显示窗口菜单=27〃显示窗口+编辑菜单=37//1+2+工具箱7、问:如何将一个圆添加到一个工作区Ai中?先用—AppendLin函数在工作区画园(或画弧)的时候需要自己生成坐标点,比如说D_DOT*dat,这里dat的空间需自己申请,其长度为longlen,线的参数是LIN_INFOinf,需要赋值,shortai为区工作区号,longi为弧段号。然后调用:i=_AppendLin(ai,dat,len,&inf);输入弧段。然后添加区域入口:ai-区工作区号longrdat[2]-区域数据块rdat[0]=1(弧段个数),rdat[1]=i(i为弧段号)rinf-区域图形信息,需要赋值然后调用:_AppendReg(ai,rdat,2,&rinf);&问:急关于_ShortFlash(ENTITY_MSG*pt,longnum)函数!答:sypedefstruct{shortai工作区号shorttype图元类型longelmi图元号}ENTITY_MSG定义一个ENTITY_MSG数组你把所要闪烁的图元一个一个加进去就行了。9、 问:实现查询多边形中图元的,并时期闪烁显示,应如何实现呢?答:用_RectAskToList系列函数,然后可通过CGisView的闪烁机制完成。10、 问:CloseToolBox();〃关闭工具箱OpenToolBox();〃打开工具箱我的程序只要进行了上面关闭和打开工具箱的操作后,在最后关闭时总是报错不管是用上面的函数还是用右键提供的工具箱控制,到最后都会出现一个DebugAssertionFailed!的错误,谁能解释一下呢?答:1、 升级你的VC++(比如SP2、SP4)2、 出现这种问题不用管,在编绎成Releas版后,这个问题不会再出现。11、 问:我在本机器开发环境上运行开发的软件没什么问题。但在其他机器上,运行时出现找不到mfc42d.dll动态链接库文件。请帮忙!答:你编的东西编译成DEBUG版,运行时需要mfc42.dll(这可不是MAPGIS的动态库,是VC的),如果你在编译时生成RELEASE版,到别的机子上运行,就不用找mfc42d.dll了。12、 问:有没有获得工程文件名的函数,有没有通过工程文件,来获得工程中的个文件的路径的函数答:这个容易,兄弟用VC吧。打开有关PRJ的头文件(*.h,具体是哪个我记不清了,自已找找),看里面的函数声明,这比看帮助或是开发指南要好用得多,而且看到的东西比什么指南都强。里面的函数英文名称确切,当然,如果你的英文不行,先去补习一下吧。13、 问:颜色不准,急!急!急我公司新买的HPDJ800PS的喷墨打印机,mapgis的颜色库用的是地矿部的标准色库,可每次执行光栅化输出以后,出图颜色与色标差太多,光栅化参数按推荐100、75、61、100设的。答:又是该死的地矿部标准,那玩意是用6色印刷的,普通喷墨仪如果只有四色,怎么着都打不出一模一样的。真要打出跟那标准一模一样,也简单,输出到EPS,花几千块,去印刷厂印一张回来。14、 问:请教各位大侠,logcount和count的区别?含义分别是什么?答:逻辑数:工作区中没有被删除的实体或者记录的个数。物理数:工作区中所有的实体或者记录的个数,包括那些从被删除了的实体或者记录。有如下等式:物理数=逻辑数+被删除的个数+115、 问:请问有没有这样的函数?可以求出两个区之间的公共弧段呢。有的话,请告诉我关于这个函数的详细情况。谢谢!答:先取出第一个区的所有弧段,对每一条弧段取拓扑,看看拓扑的左区或者右区中有没有一个等于第二个区的区号。如果有,那么这条弧段就是这两个区的公共弧段。16、问:如何对表文件(.wb)进行读某条记录的某个字段请问各位大虾:如何取得表文件的记录数,如何判断该记录是被删除,如何取某记录的某个字段值。谢谢!!答:下载区二次开发示例第5章有详细说明。17、 问:请问在delphi里怎么调用mapgis的api函数答:和调windows的api一样调用。如:function_FindNearColor(r,g,b:Integer):Integer;stdcall;External'mapdsp60.dll'procedureTForm1.Button1Click(Sender:TObject);varaa:Integer;S:string[11];beginaa:=_FindNearColor(255,255,255);Str(aa,S);ShowMessage(S);end;18、 问:在对话框中实现区填充颜色、图案预览和选择答:自己重绘ListCtrl。在DrawItem函数中绘制每一个Item的图形(用MyDC)。19、 问:请教各位大虾,如何用vb编程实现mapgis中属性文件转换为dbf、mdb等文件?答:目前VB中还没有提供导出属性数据的二次开发的方法。你可以用ADO或者其他的工具将mapgis的属性数据读出来再形成各自的记录集,最后专程dbf、mdb20、 问:请教有关cmyk和mapgis颜色阶的问题答:目前组件中还没有相应的方法。API中提供_FindNearCMYKColor、_FindNearColor等函数完成颜色的转换。21、 问:那位朋友有MAPGIS明码文件格式说明能不能给我发一份,急需,我实在是找不到。。谢谢。答:详见mapgis地理信息系统使用手册数字制图篇22、 问:如何能得到一条线的起始结点和终止结点(图元号)?知道一个node的x,y坐标,如何能得到这个node的图元号?答:取该线的拓扑信息。LIN_TOP该拓扑信息中第一个和第二个元素就是其实结点和中止结点的图元号查找最近结点long_NearNod(shortai,D_DOT*xy,double*rtnDis)参数入口ai -结点工作区号*xy-结点位置,xy为图形实际坐标出口*rtndis-返回距离返回值成功返回结点号(>0),失败返回023、 问:在VC++中,如何从一装入工程文件中,读出工程文件中每个文件的名称和类型?谢谢,大虾。答:7、取工程中某个文件的类型short_PRJGetItemType(MAPPROJECTprj,intindex)参数:入口prj—工程句柄index—文件位置出口无返回值:index指定文件的文件类型(LIN/PNT/REG/MSIIMG)9、 取项目的文件名(带全路径)LPCTSTR_PRJGetItemName(MAPPROJECTprj,intindex)参数:入口prj—工程句柄index—文件位置出口无返回值:index指定文件的名称的字符串10、 取项目的文件名(不带全路径)short_PRJGetItemName1(MAPPROJECTprj,intindex,char*name)参数:入口prj—工程句柄index—文件位置出口*name—返回文件的名称返回值:成功返回1,失败返回024、 问:如果调用CGisEditView的编辑与修改什么的函数,那么视图窗口总是处于交互状态,请问如何取消?答:先调用SetExtTool(NULL);再调用SetOperateState(0);25、 问:我用VB来调试一些帮助中列举的例子,在加载工程的时候用bPRJLoadProject(),系统给出错误:baddllcallingconvention.我不知道什么原因?答:你在mapgis目录下的basic中找到map_prj.bas,对bPRJLoadProject的声明如下。DeclareFunctionbPRJLoadProjectLib"mapprj60.dll"Alias"#1"(OptionalByVaialnstAsInteger=0)AsLong你自己改为:DeclareFunctionbPRJLoadProjectLib"mapprj60.dll"Alias"#1"(OptionalByValalnstAsInteger=0,OptionalByValfastOpenAsInteger=0)AsLong26、 问:请问用delphi调用mapgis的dll一定要用vc的dll对吗答:不用重装VC。只需要到别的地方去找一个MFC42D。DLL文件复制到SYSTEM目录即可。27、 问:我想取消EditView的右键功能,而自己用Commandl(在vb中)来实现,该怎么样做?(比如实现放大、缩小、平移、更新、复位等)答:EditView空间提供zoomin()放大,zoomout()缩小等对窗口操作的方法。具体可参考对象浏览器中对各方法的注释。28、 问:我在求距离和面积的时候想先画出线然后得到距离或面积,就跟在MAGPGIS图库管理子系统中距离测量和面积测量功能一样,又该怎么样来实现?答:画线可以采用异或线的方法,鼠标点击的每个点都转换成逻辑坐标,放入D_DotSet,再用CalculateLength,CalculateOneArea求长度和面积。29、 问:急!!关于_InputFileName()函数我的代码是这样的:char*strOutPath;char*fileter;strOutPath=NULL;fileter="wt";_InputFileName(strOutPath,NULL,NULL,"PNT",T,fileter,NULL);我调试的时候,一到最后一行就报错。错误信息如下:UnhandledexceptioninChangePoint.exe(BAS60.DLL):0xC0000005:AccessViolation请指教,谢谢!答:charszName[128];chardsn[32];charowner[32];charftype;charopenflag=0;〃O打开文件;1保存文件charfilter[]=_T(”线文件(*.wl)\0*.wl\0点文件(*.wt)\0*.wt\0\0");charttlStr[]=_T("打开文件");charlog[32];charpsw[32];memset(szName,0,sizeof(szName));memset(dsn,0,sizeof(dsn));memset(log,0,sizeof(log));memset(psw,0,sizeof(psw));memset(owner,0,sizeof(owner));_InputFileName(szName,dsn,owner,&ftype,openflag,filter,ttlStr);if(dsn[O]!='\O'){db_GetLogPsw(dsn,log,psw);〃m_hlnst工作区示例句柄m_ai工作区号m_ai=_OpenFileArea(m_hInst,szName,dsn,log,psw);}elsem_ai=_OpenFileArea(m_hInst,szName);szNamedsnownerftype都是出口参数。strOutPath你给的是NULL当然是错误的。有可能是网络数据,dsnowner也为NULL,是相当危险的。30、 问:用delphi怎么新建一个工程?并且能不让新建的工程弹出那两个对话框吗?答:直接CreateComObject()asIMap,然后把这个Imap接口赋给editview即可。31、 问:关于maplayer,在delphi中maptree不能正确使用,请问我如何能知道工程里所有文件的名称和状态?答:对map的layer进行遍历,每个layer的workarea的name属性就是工程里该文件的名称。该layer的visible表示是否可见的状态。用map的activelayer取、设激活的layer。32、 问:这样求两点距离和图型面积?(vb)用鼠标虚义一根线,求出线两端的距离?用鼠标画一个任意闭合区,求闭合区的面积?答:不管你输入的是线,还是闭合区域,在Mapgis里都是用''点集”D_DotSet表示的。将你鼠标输入的点转换成逻辑坐标存入D_DotSet。调用CalculateLength(xyAsD_DotSet)AsDouble求线长度调用CalculateOneArea(xyAsD_DotSet)AsDouble求该点集围成的区的面积33、 问:请问用delphi开发,如何将某一maplayer和工作区绑定?我打开了一个工程文件,现在想对其中某一层进行操作,如何把这一层和工作区进行绑定?那个attach怎么用?我的意思是已经用map.load把文件打开了,然后怎么绑定?我用的是varregarea:iregarea;regarea:=createcomobject(class_regarea)asiregarea;maplayer.attach(regarea);把regarea保存一下,发现还是空白一片答:对工程中的某一层进行操作,只需要对该layer的workarea接口操作即可。而你的代码是把该layer又和一个新的regarea(你只是实例化了,没有装载文件)绑定,此时已经丢掉了原来的workarea。所以出现你描述的情况。34、 问:那个函數能够实现计算一条曲线与其它多条曲线的交点?在winarea.h文件中有计算单个线段交点的函数shortWINAPI_CalCrossDot(D_DOT*laO,D_DOT*la1,D_DOT*lbO,D_DOT*lb1,D_DOT*xy);你可以先用当前线的rect通过RectAskLin找到相交的线,再逐个求交点。35、问:我使用actxedit gisedit控件进行的二次开发。可是打包后安装,这个控件总也不能被注册。具体怎么解决?答:建议你将该控件所用到的dll也一起打包(用DEPENDS察看)在你的打包程序中用regsvr32来注册。36、 问:我用ModEnvFile但是报错说不支持对象的属性或方法请问为什么?我用GetEnv得到了路径的文本,怎么修改呀?str=Mapgis.GetEnv.cur之后怎么办呢?答:Mapgis.GetEnv.cur="新的路径"37、 问:如何在VB中实现对目录环境修改的功能答:你指的是mapgis的环境目录吗?如果是,你可以用mapgis对象下面的getenv、writeenvfile、setenv方法来取得、修改、设置mapgis的环境目录。38、 问:老话重提:如何获得工程的地图参数答:MAPGIS工程中也同样记载了一个''地图参数”的内容!如果是按照标准方式建立的工程数据,那么工程中的地图参数和包含文件中的地图参数应该是一样的!所以建议直接取工程文件本身记载的地图参数,那么就不用考虑是否存在文件的区别了!具体函数是:在project.h中调用Prj_Head.PrjMapParam即可!39、 问:如何在map对象中实现只对激活的maplayer进行编辑和操作?答:selectpoint方法可以选中所有的打开的点文件中的点。而不仅仅是你激活的那个layer。在最新的mapgis中对maplayer增力口了一个selected的标志。如果该标志设为1则selectpoint会在这个layer上做操作。相反,则不会影响这个layer。40、 问:在mapgis输入编辑里有个功能叫''根据属性赋参数”,请问二次开发里提供这个功能吗?如果有怎么用,在哪里可以找到;如果没有怎么根据属性筛选符合条件的点。答:、''根据属性赋参数"实际上就是找出那些满足你给定的属性条件的图元,然后给他们参数的某一项,或者某几项。用AttAsktoList即可,具体可参考vb开发示例。(MPGIS.COM.CN下载区)41、 问:用Giseditl.SelectGraphics选中图元后,如何取得其属性值,请用VB示范一下,谢谢!答:可以自己写一个交互操作,用鼠标双击、或者拉框来查询图元。对于鼠标双击可以直接调用nearlin…,对于拉框可用rectasktolist来查询。前者得到图元实体好,后者得到实体号列表。然后用这些实体号即可取属性即可得到相应的属性。42、 问:有关IMS的浏览查询的问题我想在IMS中实现浏览查询功能,能不能按照如下的思路做:1选定某一个工作区;2找出该工作区的所有图元3显示该图元的信息问题是:怎么样找出一个工作区的所有图员dimPrjltemsetPrjItem=Server.CreateObject("MpMapCom.MpPRJITEM.1")Session("MapViewObject").ViewPrj.GetItemi,PrjItem这样能得到i对应的工作区,下面该怎么得到此工作区的所有图元呢?谢谢答:要得到图元,是用户进行查询的,而查询有多种查询方法,可以模糊、点击等等,如果用添加查询,就用函数gisSearchByStr,点击就用gisSearchByHitting等等,lib库中有这样的函数,web开发实例中也有这样的例子,您可以看看那里的例子,希望对您有所帮助43、 问:请问大侠,bEOOout函数,能不能自定义导出的eOO文件的路径?答:直接在文件名前面加路径即可。如:DimhInstAsIntegerDimaiAsIntegerhInst=bInitWorkArea(&H0)ai=bOpenArea(hInst,LIN)CallbLoadFile(ai)CallbEOOout(ai,"d:\aa.e00")CallbFreeWorkArea(hInst)44、 问:请教在WEBGIS中,能否对*.WP,*.WL,*.WT文件进行操作,属性检索的功能和非WEGGIS开发模式下的有什么区别,我想闪烁某个/些被检索到的图元能做到吗?答:在webgis中能够对点线面文件进行操作,可以根据用途的不同,可以进行不同的操作。属性检索和非webgis开发模式下没有什么不同。在webgis中可以进行闪烁某个点或一些点,但是我们一般不建议这样作,因为这样速度可以跟不上,一般是通过改变颜色的方式来标志检索到的图元。45、 问:怎么写点的属性,我想用pntatt.write答:先得到你要写属性的那条记录。pntarea.get(i,red)然后对red属性记录进行操作,rcd.item.val(l) 再pntarea.write即可。46、 问:如何在vb中使用“GisConv.h”中所声明的api函数?比如eonvertapi_e答:DeelareFunctionbGisAscInLib"w60_eonv"Alias"#6"(ByValAHInstAsInteger,ByValmPathAsString,outAiAsInteger)AsInteger'明码文件转换二进制文件,返回成功和失败DeelareFunetionbGisAseOutLib"w60_eonv"Alias"#7"(ByValaiAsInteger,ByValFileNameAsString)AsInteger'二进制文件转换明码文件,返回成功和失败DeelareFunetionbEOOInLib"w60_eonv"Alias"#8"(ByValAHInstAsInteger,ByValmPathAsString,ByRefOutApAsInteger,ByRefOutAlAsInteger,ByRefOutArAsInteger,ByRefOutLabAsInteger,OptionalByRefOutNaiAsInteger=0,OptionalByValOrderColorFlagAsInteger=0,OptionalByValPntColorFldAsLong=0,OptionalByValLinColorFldAsLong=0,OptionalByValRegColorFldAsLong=0)AsIntegerDeelareFunetionbE00outLib"w60_eonv"Alias"#9"(ByValaiAsInteger,ByValFileNameAsString)AsIntegerDeelareFunetionbDxfOutLib"w60_eonv"Alias"#10"(ByValapAsInteger,ByValalAsInteger,ByValFileNameAsString)AsIntegerDeelareFunetionbAreInfInLib"w60_eonv"Alias"#11"(ByValAHInstAsInteger,ByValmPathAsString,ByRefOutApAsInteger,ByRefOutAlAsInteger,ByRefOutArAsInteger)AsIntegerDeelareFunetionbAreInfOutLib"w60_eonv"Alias"#12"(ByValaiAsInteger,ByValFileNameAsString)AsIntegerDeelareFunetionbAreInLib"w60_eonv"Alias"#13"(ByValAHInstAsInteger,ByValmPathAsString,ByRefOutApAsInteger,ByRefOutAlAsInteger)AsIntegerDeelareFunetionbAreOutLib"w60_eonv"Alias"#14"(ByValaiAsInteger,ByValFileNameAsString)AsInteger'示例:'DimahlnstAsInteger'DimbinAiAsInteger'DimaiAsInteger'DimmpathAsString'DimfnameAsString'Dimres''ahlnst=blnitWorkArea(0)'mpath="d:\mapgis61\sample\china.wal"'res=bGisAscIn(ahInst,mpath,binAi)'MsgBoxres'fname="d:\mapgis61\sample\china.wal"'ai=bOpenLinArea(ahlnst)'bLoadFileai'res=bGisAscOut(ai,fname)'MsgBoxres'bFreeWorkAreaahInst47、 问:对于区有一个生成label文件的操作,它是生成的一个新的点文件并提示保存,现在我就是想把生成的点文件保存在现在点文件的一层里,有什么办法吗?答:修改生成的点文件中的每个点的图形参数,将图层改为一致,再拷贝打一个点工作区中即可。48、 问:求一个点到一个区的最近和最远距离要怎么做答:double_MinDistofPntToReg(D_DOT*pnt,shortai,long,ri)double_MaxDistofPntToReg(D_DOT*pnt,shortai,longri)*pnt点坐标地址ai区所在工作区ri区号若点位于区内,则最小距离为0================2003年12月10新增==============49、 问:请教关于定位的问题。在一个工作区里面,我使用SelectRegion方法获得一个selectset,想把它放大显示在屏幕中央,该如何操作,使用那一个对象或是方法??最好给几句代码(vb)。3Q首先,取出集合中实体图形信息(Info)使用EditView.SetMapRange(MapRectAsD_Rect)方法更改图形信息中的区域范围(D_Rect)。50、问:动画功能如何实现?如何在有向的道路中心线上实现车行的模拟?即在道路上定两个点,以一定的速度,模拟汽车(符合)在两个点间的动态的行走,能否给个简单的demo。答:MAPGIS属性数据支持动画类型的数据,不需要什么示例,你只要把相应的动画剪辑(世面上有专门制作这种闪图的软件)建立到属性库中就可以了,在相应的地方调用程序执行就行了。51、 问:请教大师:如何用vb实现mapgis投影变换中的''用户的文件投影转换”的功能;答:使用以下方法,用对话框设置投影变换。FunctionSetInPara([moveAsInteger],[EnableEditAsInteger=1])AsBoolean在PRJTRANSCOMLib.PrjTrans对象中52、 问:mapgis的帮助中讲的图元号和实体号是一个意思吗?答:GIS里的一些专业术语是有些比较难懂,图元号与实体号是一个意思。53、 问:_EditAtt这个函数包含联动的功能吗?我使用_EditAtt不能实现图形的联动,请问还需要使用别的函数吗?答:EditAtt函数会弹出一个窗体,返回值是这个窗口的句柄。程序实现联动就是这个窗口和图形所在的视图窗口之间互相通信的结果。当在属性编辑窗口中编辑某个记录的字段时会像视图窗口发送消息MGM_FLASH_GRAPH,该消息的wParam参数为属性窗口状态,它可以是下列宏定义之一:BEGIN_EDATT:表示开始编辑属性。EDITING_ATT:表示正在编辑属性。END_EDATT:表示结束编辑属性。属性窗口发送此状态时,属性窗口没有撤消。一般情况,属性窗口发送的所有MGM_FLASH_GRAPH消息中,开始时为BEGIN_EDATT状态,最后为END_EDATT状态,中间为若干EDITING_ATT状态。IParam参数为指向MGMSG结构的指针,该指针所指结构空间属于属性编辑窗口,MGMSG结构如下:〃图元实体信息结构typedefstruct{shortai;〃工作区号。shorttype;〃图元类型,为LIN,PNT,REG,NOD,NET,TBL之一。longelmi;〃图元号。}ENTITY_MSG;〃图元重新显示信息结构typedefENTITY_MSGMGMSG;通过lParam参数,通知hWnd窗口当前记录对应的图元是什么。当联动状态为断开时,属性窗口不给hWnd窗口发送当前图元消息。当鼠标在视图窗口双击选中一个实体时应该像属性窗口发送GoToAtt的消息,让属性跳转到和空间实体对应的属性处。具体的程序可参考VC开发第五章示例54、问:gisattedit控件问题请问大虾,《mapgis组件开发手册》中说gisattedit的GotoAtt方法,当参数rcdNo=0时,弹出跳转条件对话框。但是我试过,却无法实现。我把gisattedit与工作区绑定后,仍然不能用,不知有何奥妙?答:DimareaAsPntAreaSetarea=NewPntAreaIfarea.Load()ThenEditView.PntArea=areaEditView.LinkAttSwitch=TrueEditView.AttachAttWorkAreaarea,area.TypeGisAttEdit.AttachAreaarea,area.TypeEndIfPrivateSubEditView_CurAttElement(ByVallNoAsLong)GisAttEdit.GotoAttlNoEndSubPrivateSubGisAttEdit_CurRcdFldNo(ByValrcdNoAsLong,ByVaifldNoAsInteger)EditView.GotoElementarea,rcdNo,area.TypeEndSub55、 问:怎么在裁剪的时候不用装入裁剪框文件,而是直接在工作区内用鼠标画一个框子.答:不是在工作区中画一个框子,而是在View上拉一个框子,记录下框子的各个点添加到一个新的工作区中,将这个工作区作为裁减框工作区。裁减完成后可以设置这个工作区的改变标志为false,在关闭它。56、 问:用_OverlayPntReg函数,叠加在某一区上的点时,如何不让区文件的属性追加到点属性上!谢答:你可以将点中和区属性有关的一些属性字段删除。57、 问:在MAPGIS里如何获得一个区的最长的边,并且怎么知道它的方位答:对每一个区调用_GetReg(…,rdat,len....);doublemaxLength=O;doubletempLength;doublemaxLi=0;for(i=1;i{if(rdat[i]!=0){_GetLin(...abs(rdat[i]),dotset,linlen...)tempLength=_CalculateLength(dotset,linlen);if(tempLength>maxLeghth){maxLeghth=tempLeghth;maxLi=abs(rdat[i]);}}}58、 问:(MSVC++)如何使用API在SQLSERVER2000的库中建立MAPGIS管理过程?答:出于安全方面的考虑,我们没有将建mapgis管理过程的函数引出,故一定要在平台上进行操作才能建立Mapgis管理过程。59、问:如何建立shapefile与mapgis的颜色对照表?答:shapefile本身并不带有颜色信息,是需要在arcview中重新赋予的,比如根据属性赋参数,所以也就没有和mapgis间的对照表,包括线型、颜色、子图等。60、问:关于数据源的问题!我是WEB—MAPGIS的用户,我想知道对于数据源,是不是必须用SQLSERVER作为数据源,能不能用其他的数据库软件?如ACCESS、FOXPRO等?另外我想问问QLSERVER2000是不是和WINDOWSXP这个操作系统不兼容?我迫切想知道答案,能快点回复我吗?对于数据源,可以用SqlServer和Oracle,对于Access和FroPro不支持,原因很简短,因为后两种数据库软件对大型数据库支持不好,所以我们没有作SDE,SqlServer2000不会与WindowsXp冲突,因为他们都是微软的,你可以打Sql的Sp4布丁和XP的布丁,不会有问题61、问:我有两个线工作区,一个装了一条直线,另一个装了一系列等值线,我希望得到直线与等值线相交的一系列点,求教实现方法!谢谢!答:可以用函数:short_CalCrossDot(D_DOT*la0,D_DOT*la1,D_DOT*lb0,D_DOT*lb1,D_DOT*xy)参数:入口*la0-线段的起点坐标*la1-线段的终点坐标*lb0-另一线段的起点坐标*lb1-另一线段的终点坐标出口*xy-两直线的交点坐标返回值1/0-成功/失败用一个双循环,对每一条等值线调用_GetLin得到线的空间数据,其中会返回一个点集,点集中每两个相邻的点形成一条直线,对这每一条直线和直线工作区中的直线调用上述的函数_CalCrossDot即可得到交点坐标。62、问:能够通过区域的边界点的地理坐标求得区域得实际面积吗?答:在projDll中有函数doubleWINAPI_CountPolygonArea(D_DOT*xyLst,intlen,MAP_PARA*map);可以根据形成多边形的点集以及相应的地图参数计算出实际面积。63、问:用EDITVIEW显示多个点(或线)文件后,怎样激活某一层点(线)文件,并对其修改?答:根据你要修改的那一层的工作区类型,将工作区对象赋给EditView相应的工作区接口。如:要修改某区工作区regAi,则EditView.RegArea=regAi64、问:我有一个*.GRD文件,利用什么MAPGIS库的什么函数把它显示为等值线?要是离散的数据,显示之前又是调用什么函数把他规格化呢?答:MAPGIS提供了TINSDk开发包,可到网站下载.在Tin_Area.h文件中,GRD数据可通过_tnTinGridDemTraceContour()函数追踪为等值线.具体步骤:使用_tnGetTinAI()创建TIN工作区;使用_tnLoadFile()装入GRD文件;使用_tnTinGridDemTraceContour()进行追踪过程(此函数提供参数设置界面).离散数据,有两种网格化方法(依数据而定):直接使用_tnDistInsGriding()或_tnKringGriding()进行网格化;先建立三角网(可使用_tnCreateTinNetlnTinAreaO),再使用_tnTinDatGriding()内插网格化.65、 问:我想将计算得到的一系列离散的数据,画成函数曲线通过对话框显示出来,请问用什么比较好?答:方法:得到了离散点,调用mapgis的光滑函数(TinBas60.dll,w60LnCps.h),生成线文件,直接放到mapgis提供的显示对象或控件显示即可。66、 问:请问QUERY对象查询时,输入条件查询时,''输入日期大于2002-2-1”的条件,应该何格式?我用''日期>2002-2-1"格式后,查询的结果超出查询的范围。答:对于日期的查询需要将日期用"[]"括起来,如:日期>[2002-2-1]67、 问:请教等值线问题有我一批点的X坐标、Y坐标和观测值,想在自已的程序中画等值线,mapgis里的数字地面模型中有这样的功能,但是我不知道二次开发函数是那些(特别是那三种数据网格化方法的函数)?而且对TIN文件也一点不懂,能不能给介绍下这方面的知识和mapgis的等值线绘制方法,并给发个例子程序?答:首先,要下载TINSDK的开发库;在其中Tin_Area.h头文件中,有相关函数的说明可供参考.由于这一部分的二次开发库还未正式推出,所以目前尚无开发手册,只能针对具体开发函数回答.对于等值线追踪,对于离散点数据,应按照下列步骤进行:首先按照系统要求的DET数据格式,编辑你的数据(可以参考DTM系统);使用_tnGetTinAI()创建TIN工作区,最后应用_tnDeleteTinAI()删除;使用_tnLoadFile()装入数据文件;使用_tnCreateTinNetlnTinArea()生成三角网;使用_tnTinTriNetTraceContour()追踪等值线;================2003年12月17日新增===========68、 问:关于输入区的问题有什么办法,让边输入弧段边生成区,当弧段封闭时,就自动生成一个区。而且输入弧段最好用键盘输入。能实现吗?给段代码吧答:键盘输入点,记录下每一个点的坐标。添加到一个D_Dot数组中,记录下点数。用下面的函数即可将这些点组成弧段并生成区。(当然第一个点和最后一个点应该是同一个点。)longMakeRegFromLin(shortai,D_DOT*pddDot,longnum){ASSERT(ai>0);//添加弧段LIN_INFOLinlnfo={0};longLinNo=_AppendLin(ai,pddDot,num,&LinInfo);//造区longrdat[3]={0};rdat[0]=num+1;rdat[1]=LinNo;REG_INFORegInfo={0};longRegNo=_AppendReg(ai,rdat,2,&RegInfo);returnRegNo;}69、 问:如何在EDITVIEW中加入多个点线区文件?答:DimpntArealAsPntAreaDimpntArea2AsPntAreaDimlinArealAsLinAreaDimlinArea2AsLinAreaDimregArealAsRegAreaDimregArea2AsRegAreaPrivateSubCommandButton1_Click()SetpntArea1=NewPntAreaSetpntArea2=NewPntAreaSetlinArea1=NewLinAreaSetlinArea2=NewLinAreaSetregArea1=NewRegAreaSetregArea2=NewRegAreapntArea1丄oadpntArea2丄oadlinAreaLLoadlinArea2丄oadregAreaLLoadregArea2丄oadEndSubPrivateSubEditView1_MyDraw(ByValMpDCAsObject)MpDC.DispAreapntArea1MpDC.DispAreapntArea2MpDC.DispArealinArea1MpDC.DispArealinArea2MpDC.DispArearegArea1MpDC.DispArearegArea2EndSub70、 问:如何在继承PRJ建立切分视后,向文件添加项目,给个示例吧?答:intflag;charszName[256];chardsn[32];charowner[32];charftype;charopenflag;charfilter[]="MapGis线文件(*.wl)\0*.wl\0\0";charttlStr[]="添加线文件";openflag=0;memset(szName,0,sizeof(szName));memset(dsn,0,sizeof(dsn));memset(owner,0,sizeof(owner));flag=_InputFileName(szName,dsn,owner,&ftype,openflag,filter,ttlStr);if(flag=1){〃给工程添加文件,只需要知道该文件的文件名,并不需要打开该文件(装入工作区)_PRJAppend(GetProject(),szName,NULL,-1);//PrjListView中显示刚添加进的文件((CMyPrjListView*)(((CChildFrame*)(((CFrameWnd*)(AfxGetMainWnd()))->GetActiveFrame()))->m_wndSplitter.GetPane(0,0)))->ReloadPrjItems();//PrjEditView复位显示OnRestoreWindow();}71、 问:请问如何用VB实现多个图元在EDITVIEW上同时闪烁?答:DimselsetAsSelectSetSetselset=NewSelectSetFori=1ToIst.Count-1〃\\闪烁多个实体,对每一个实体都要New—个SelectitemSetsel=NewSelectitemsel.Type=gisLIN_ENTITYsel.ItemNo=lst.Item(i)sel.WorkArea=areaObjselset.AddselSetsel=NothingNextSetEditView.SelectSet=selsetEditView.FlashElementEditView.SelectSetSetselset=Nothing72、 问:有什办法在GAPGIS内核启动之前修改环境目录?我试过许多种方法,包括在CMyApp::InitInstance()甚至在构造函数CMyApp::CMyApp()中加入相关检查程序行也失败。看着连续蹦出来的几个标着惊叹号的对话框和接下来的死翘翘。真是让人伤心。答:在程序外面包一层不调用mapgis显示相关动态库的程序即可。外层程序仅仅调用win_area.h中的函数来修改目录环境。修改完成后,调用进程函数装入要执行的mapgis程序。73、 问:如何根据点的属性(坐标值)调整点的位置?答:如果是单个调整的话,可以利用''定位点”的方式;如果是批量调整,那就把坐标属性导出来然后再根据坐标来生成点。74、问:在用VC++得类库开发时,调用API函数时EDITWND参数如何获取?我是一位刚学MAPgis开发的新手。在用VC++得类库开发时,调用API函数时EDITWND参数如何获取?谢谢,那位能帮助我。答:现在Mapgis推荐使用类库来进行二次开发,你说的EDITWND已经被封装到CGisView类当中,你直接继承CGisView类即可完成Mapgis图形显示的功能。具体的做法如下:第一步:建一个VisualC++的项目。打开VisualC++工作环境,选择File菜单New命令,在弹出的对话框中选择Projects页的MFCAppWizard(EXE)项并在Projectname编辑框中敲入工程名(例如:engineer),然后单击OK。这样便进入了AppWizard(向导)的第一步
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年福建厦门翔业集团有限公司招聘笔试真题
- 2024年北京首都经济贸易大学招聘笔试真题
- 花店创业基础模板
- 男式凉鞋企业数字化转型与智慧升级战略研究报告
- 智能烤箱远程控制系统企业制定与实施新质生产力战略研究报告
- 苏打水企业数字化转型与智慧升级战略研究报告
- 发酵型果蔬汁饮料企业ESG实践与创新战略研究报告
- 大麻属植物汁和酊剂企业ESG实践与创新战略研究报告
- 幼师口语沟通技巧
- 二零二五年度商业地产房租逐年递增管理合同
- 孤独症儿童早期干预操作手册
- (完整文本版)河南2016定额计算规则
- 《小猫的九个命》
- 大班健康《爱是什么》课件
- 特种作业(锅炉工)安全培训
- 钢梁现场安装检验批质量检验记录
- 学历(学位)更改呈报审批表
- (完整word版)中医病证诊断疗效标准
- 生产建设项目土壤流失量测算导则计算程序
- GB/T 28621-2023安装于现有建筑物中的新电梯制造与安装安全规范
- 煤矸石填沟造地项目实施方案
评论
0/150
提交评论