1、MAPGIS二次开发常见问题及解答MAPGIS, 解答, 开发1、问:如何用Delphi生成MAPGIS明码文件?答:先利用手册看懂明码格式文件的格式,知道数据的组织方式,利用delphi的文件函数创建一个文本型文件,吧数据库中的数据按照格式输出就是了。2、问:ATT_STRU 和CATT_STRU的区别和联系?答: ATT_STRU是以前老版本的东东,换成CATT_STRU试试.CATT_STRU中包含了属性结构的详细信息,具体用法可参见二次开发帮助文档中第三章数据结构中关于属性字段描述结构,属性字段描述头和属性信息头的介绍,里面有该结构的详细内容。3、问:请教关于“不能打开子图库.”的问题
2、,急!答:系统库路径不对,将mapfont.gis、mconfig.gis、netcfg.gis三个文件拷贝到执行目录即可。这几个语言件放在MAPGISPROGRAM目录中。或是运行MapEnv.exe可设置,该运行文件也同样在MAPGISPROGRAM目录中。4、问:如果只知道工作区 ai 能不能依次得到工作区中的图元号,该如何得到啊!答:long i,pntn;short len;pnt_info inf;d_dot xy;char *dat;_GetPntNum(ai,&i,&pntn);/取点数for(i=1;ipntn;i+)if(_getpnt(ai,i,&xy,&dat,&len
3、,&inf)0),失败返回023、问:在VC+中,如何从一装入工程文件中,读出工程文件中每个文件的名称和类型?谢谢,大虾。答:7、取工程中某个文件的类型 short_PRJGetItemType(MAPPROJECT prj,int index) 参数:入口 prj 工程句柄 index 文件位置出口无返回值:index指定文件的文件类型(LIN/PNT/REG/MSIIMG)9、取项目的文件名(带全路径) LPCTSTR _PRJGetItemName(MAPPROJECT prj,int index) 参数:入口 prj 工程句柄 index 文件位置出口无返回值:index指定文件的名称
4、的字符串10、取项目的文件名(不带全路径) short _PRJGetItemName1(MAPPROJECT prj,int index,char *name) 参数:入口 prj 工程句柄 index 文件位置出口 *name 返回文件的名称返回值:成功返回1,失败返回024、问:如果调用CGisEditView的编辑与修改什么的函数,那么视图窗口总是处于交互状态,请问如何取消?答:先调用SetExtTool(NULL);再调用SetOperateState(0);25、问:我用VB来调试一些帮助中列举的例子,在加载工程的时候用bPRJLoadProject(),系统给出错误:bad dl
5、l calling convention.我不知道什么原因?答:你在mapgis目录下的basic中找到 map_prj.bas ,对bPRJLoadProject的声明如下。Declare Function bPRJLoadProject Lib mapprj60.dll Alias #1 (Optional ByVal aInst As Integer = 0) As Long你自己改为:Declare Function bPRJLoadProject Lib mapprj60.dll Alias #1 (Optional ByVal aInst As Integer = 0, Optio
6、nal ByVal fastOpen As Integer = 0) As Long26、问:请问用delphi调用mapgis的dll一定要用vc的dll对吗答:不用重装VC。只需要到别的地方去找一个MFC42D。DLL文件复制到SYSTEM目录即可。27、问:我想取消EditView的右键功能,而自己用Command1(在vb中)来实现,该怎么样做?(比如实现放大、缩小、平移、更新、复位等)答:EditView空间提供zoomin()放大,zoomout()缩小等对窗口操作的方法。具体可参考对象浏览器中对各方法的注释。28、问:我在求距离和面积的时候想先画出线然后得到距离或面积,就跟在MA
7、GPGIS图库管理子系统中距离测量和面积测量功能一样,又该怎么样来实现?答:画线可以采用异或线的方法,鼠标点击的每个点都转换成逻辑坐标,放入D_DotSet,再用CalculateLength,CalculateOneArea求长度和面积。29、问:急!关于_InputFileName()函数我的代码是这样的:char * strOutPath;char * fileter;strOutPath=NULL;fileter=wt;_InputFileName(strOutPath,NULL,NULL,PNT,1,fileter,NULL);我调试的时候,一到最后一行就报错。错误信息如下:Unha
8、ndled exception in ChangePoint.exe(BAS60.DLL):0xC0000005:Access Violation请指教,谢谢!答:char szName128;char dsn32;char owner32;char ftype;char openflag=0; /0 打开文件;1 保存文件char filter=_T(线文件(*.wl)0*.wl0点文件(*.wt)0*.wt00);char ttlStr=_T(打开文件);char log32;char psw32;memset(szName,0,sizeof(szName);memset(dsn,0,si
9、zeof(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(dsn0!=0) db_GetLogPsw(dsn, log, psw); /m_hInst 工作区示例句柄 m_ai 工作区号m_ai=_OpenFileArea(m_hInst,szName,dsn,log,psw); elsem_ai=_OpenFileArea(m_hIns
10、t,szName);szName dsn owner ftype 都是出口参数。strOutPath你给的是NULL当然是错误的。有可能是网络数据,dsn owner 也为NULL,是相当危险的。30、问:用delphi怎么新建一个工程?并且能不让新建的工程弹出那两个对话框吗?答:直接CreateComObject()as IMap,然后把这个Imap接口赋给editview即可。31、问:关于maplayer,在delphi中maptree不能正确使用,请问我如何能知道工程里所有文件的名称和状态?答:对map的layer进行遍历,每个layer的workarea的name属性就是工程里该文件
11、的名称。该layer的visible表示是否可见的状态。用map的activelayer取、设激活的layer。32、问:这样求两点距离和图型面积?(vb) 用鼠标虚义一根线,求出线两端的距离?用鼠标画一个任意闭合区,求闭合区的面积?答:不管你输入的是线,还是闭合区域,在Mapgis里都是用“点集”D_DotSet表示的。将你鼠标输入的点转换成逻辑坐标存入D_DotSet。调用 CalculateLength(xy As D_DotSet) As Double 求线长度调用 CalculateOneArea(xy As D_DotSet) As Double 求该点集围成的区的面积33、问:请
12、问用delphi开发,如何将某一maplayer和工作区绑定?我打开了一个工程文件,现在想对其中某一层进行操作,如何把这一层和工作区进行绑定?那个attach怎么用?我的意思是已经用map.load把文件打开了,然后怎么绑定?我用的是var regarea:iregarea;regarea:=createcomobject(class_regarea) as iregarea;maplayer.attach(regarea);把regarea保存一下,发现还是空白一片答:对工程中的某一层进行操作,只需要对该layer的workarea接口操作即可。而你的代码是把该layer又和一个新的rega
13、rea(你只是实例化了,没有装载文件)绑定,此时已经丢掉了原来的workarea。所以出现你描述的情况。34、问:那个函數能够实现计算一条曲线与其它多条曲线的交点?答:在winarea.h文件中有计算单个线段交点的函数shortWINAPI _CalCrossDot(D_DOT *la0,D_DOT *la1,D_DOT *lb0,D_DOT *lb1,D_DOT *xy);你可以先用当前线的rect通过RectAskLin找到相交的线,再逐个求交点。35、问:我使用actxedit-gisedit控件进行的二次开发。可是打包后安装,这个控件总也不能被注册。具体怎么解决?答:建议你将该控件所用
14、到的dll也一起打包(用DEPENDS察看)在你的打包程序中用regsvr32来注册。36、问:我用ModEnvFile但是报错说不支持对象的属性或方法请问为什么?我用GetEnv得到了路径的文本,怎么修改呀?str=Mapgis.GetEnv.cur之后怎么办呢?答:Mapgis.GetEnv.cur=新的路径37、问:如何在VB中实现对目录环境修改的功能答:你指的是mapgis的环境目录吗?如果是,你可以用mapgis对象下面的getenv、writeenvfile、setenv方法来取得、修改、设置mapgis的环境目录。38、问:老话重提:如何获得工程的地图参数答: MAPGIS工程中
15、也同样记载了一个“地图参数”的内容!如果是按照标准方式建立的工程数据,那么工程中的地图参数和包含文件中的地图参数应该是一样的!所以建议直接取工程文件本身记载的地图参数,那么就不用考虑是否存在文件的区别了!具体函数是:在project.h中调用Prj_Head.PrjMapParam即可!39、问:如何在map对象中实现只对激活的maplayer进行编辑和操作?答:selectpoint方法可以选中所有的打开的点文件中的点。而不仅仅是你激活的那个layer。在最新的mapgis中对maplayer增加了一个selected的标志。如果该标志设为1,则selectpoint会在这个layer上做操
16、作。相反,则不会影响这个layer。40、问:在mapgis输入编辑里有个功能叫“根据属性赋参数”,请问二次开发里提供这个功能吗?如果有怎么用,在哪里可以找到;如果没有怎么根据属性筛选符合条件的点。答:、“根据属性赋参数”实际上就是找出那些满足你给定的属性条件的图元,然后给他们参数的某一项,或者某几项。用AttAsktoList即可,具体可参考vb开发示例。(MPGIS.COM.CN下载区)41、问:用Gisedit1.SelectGraphics选中图元后,如何取得其属性值,请用VB示范一下,谢谢!答:可以自己写一个交互操作,用鼠标双击、或者拉框来查询图元。对于鼠标双击可以直接调用nearl
17、in.,对于拉框可用rectasktolist来查询。前者得到图元实体好,后者得到实体号列表。然后用这些实体号即可取属性即可得到相应的属性。42、问:有关IMS 的浏览查询的问题我想在IMS中实现浏览查询功能,能不能按照如下的思路做:1 选定某一个工作区;2 找出该工作区的所有图元3 显示该图元的信息问题是:怎么样找出一个工作区的所有图员dim PrjItemset PrjItem = Server.CreateObject(MpMapCom.MpPRJITEM.1)Session(MapViewObject).ViewPrj.GetItem i,PrjItem这样能得到i对应的工作区,下面该怎么得到此工作区的所有图元呢?谢谢答:要得到图元,是用户进行查询的,而查询有多种查询方法,可以模糊、点击等等,如果用添加查询,就用函数gisSearchByStr,点击就用gisSearchByHitting等等,lib库中有这样的函数,web开发实例中也有这样的例子,您可以看看那里的例子,希望对您有所帮助