MAPGIS二次开发常见问题及解答.doc
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.可设置,该运行文件也同样在MAPGIS\PROGRAM\目录中。 4、问如果只知道工作区 ai 能不能依次得到工作区中的图元号,该如何得到啊 答 long i,pntn; short len; pnt_info inf; d_dot xy; char *dat; {_GetPntNumai,//取点数 fori1;ipntn;i { if_getpntai,i, char * fileter; strOutPathNULL; fileter“wt“; _FileNamestrOutPath,NULL,NULL,“PNT“,1,fileter,NULL; 我调试的时候,一到最后一行就报错。 错误信息如下 Unhandled exception in ChangePoint.BAS60.DLL0 xC0000005Access Violation 请指教,谢谢 答 char szName[128]; char dsn[32]; char owner[32]; char ftype; char openflag0; //0 打开文件;1 保存文件 char filter[]_T“线文件*.wl\0*.wl\0点文件*.wt\0*.wt\0\0“; char ttlStr[]_T“打开文件“; char log[32]; char psw[32]; memsetszName,0,sizeofszName; memsetdsn,0,sizeofdsn; memsetlog,0,sizeoflog; memsetpsw,0,sizeofpsw; memsetowner,0,sizeofowner; _FileNameszName, dsn, owner, ifdsn[0]\0 { db_GetLogPswdsn, log, psw; //m_hInst 工作区示例句柄 m_ai 工作区号 m_ai_OpenFileAream_hInst,szName,dsn,log,psw; } else m_ai_OpenFileAream_hInst,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属性就是工程里该文件的名称。该layer的visible表示是否可见的状态。用map的activelayer取、设激活的layer。 32、问这样求两点距离和图型面积(vb 用鼠标虚义一根线,求出线两端的距离用鼠标画一个任意闭合区,求闭合区的面积 答 不管你输入的是线,还是闭合区域,在Mapgis里都是用“点集”D_DotSet表示的。 将你鼠标输入的点转换成逻辑坐标存入D_DotSet。 调用 CalculateLengthxy As D_DotSet As Double 求线长度 调用 CalculateOneAreaxy As D_DotSet As Double 求该点集围成的区的面积 33、问请问用delphi开发,如何将某一maplayer和工作区绑定 我打开了一个工程文件,现在想对其中某一层进行操作,如何把这一层和工作区进行绑定那个attach怎么用我的意思是已经用map.load把文件打开了,然后怎么绑定我用的是 var regareairegarea; regareacreatecomobjectclass_regarea as iregarea; maplayer.attachregarea; 把regarea保存一下,发现还是空白一片 答对工程中的某一层进行操作,只需要对该layer的workarea接口操作即可。 而你的代码是把该layer又和一个新的regarea(你只是实例化了,没有装载文件)绑定,此时已经丢掉了原来的workarea。所以出现你描述的情况。 34、问那个函數能够实现计算一条曲线与其它多条曲线的交点 答 在winarea.h文件中有计算单个线段交点的函数 short WINAPI _CalCrossDotD_DOT *la0,D_DOT *la1,D_DOT *lb0,D_DOT *lb1,D_DOT *xy; 你可以先用当前线的rect通过RectAskLin找到相交的线,再逐个求交点。 35、问我使用actxedit------gisedit控件进行的二次开发。 可是打包后安装,这个控件总也不能被注册。 具体怎么解决 答 建议你将该控件所用到的dll也一起打包(用DEPENDS察看) 在你的打包程序中用regsvr32来注册。 36、问 我用ModEnvFile但是报错说不支持对象的属性或方法 请问为什么 我用GetEnv得到了路径的文本,怎么修改呀 strMapgis.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、问 用Gisedit1.SelectGraphics选中图元后,如何取得其属性值,请用VB示范一下,谢谢 答可以自己写一个交互操作,用鼠标双击、或者拉框来查询图元。 对于鼠标双击可以直接调用nearlin...,对于拉框可用rectasktolist来查询。前者得到图元实体好,后者得到实体号列表。然后用这些实体号即可取属性即可得到相应的属性。 42、问有关IMS 的浏览查询的问题 我想在IMS中实现浏览查询功能,能不能按照如下的思路做 1 选定某一个工作区; 2 找出该工作区的所有图元 3 显示该图元的信息 问题是 怎么样找出一个工作区的所有图员 dim PrjItem set PrjItem Server.CreateObject“MpMapCom.MpPRJITEM.1“ Session“MapViewObject“.ViewPrj.GetItem i,PrjItem 这样能得到i对应的工作区,下面该怎么得到此工作区的所有图元呢 谢谢 答 要得到图元,是用户进行查询的,而查询有多种查询方法,可以模糊、点击等等,如果用添加查询,就用函数gisSearchByStr,点击就用gisSearchByHitting等等,lib库中有这样的函数,web开发实例中也有这样的例子,您可以看看那里的例子,希望对您有所帮助 43、问请问大侠,bE00out函数,能不能自定义导出的e00文件的路径 答直接在文件名前面加路径即可。 如 Dim hInst As Integer Dim ai As Integer hInst bInitWorkArea //工作区号。 short type; //图元类型,为LIN,PNT,REG,NOD,NET,TBL之一。 long elmi; //图元号。 }ENTITY_MSG; //图元重新显示信息结构 typedef ENTITY_MSG MGMSG; 通过lParam参数,通知hWnd窗口当前记录对应的图元是什么。 当联动状态为断开时,属性窗口不给hWnd窗口发送当前图元消息。 当鼠标在视图窗口双击选中一个实体时应该像属性窗口发送GoToAtt的消息,让属性跳转到和空间实体对应的属性处。 具体的程序可参考VC开发第五章示例 54、问gisattedit控件问题 请问大虾,mapgis组件开发手册中说gisattedit的GotoAtt方法,当参数rcdNo0时,弹出跳转条件对话框。但是我试过,却无法实现。我把gisattedit与工作区绑定后,仍然不能用,不知有何奥妙 答 Dim area As PntArea Set area New PntArea If area.Load Then EditView.PntArea area EditView.LinkAttSwitch True EditView.AttachAttWorkArea area, area.Type GisAttEdit.AttachArea area, area.Type End If Private Sub EditView_CurAttElementByVal lNo As Long GisAttEdit.GotoAtt lNo End Sub Private Sub GisAttEdit_CurRcdFldNoByVal rcdNo As Long, ByVal fldNo As Integer EditView.GotoElement area, rcdNo, area.Type End Sub 55、问 怎么在裁剪的时候不用装入裁剪框文件,而是直接在工作区内用鼠标画一个框子. 答不是在工作区中画一个框子,而是在View上拉一个框子,记录下框子的各个点添加到一个新的工作区中,将这个工作区作为裁减框工作区。裁减完成后可以设置这个工作区的改变标志为false,在关闭它。 56、问用_OverlayPntReg函数,叠加在某一区上的点时,如何不让区文件的属性追加到点属性上谢 答你可以将点中和区属性有关的一些属性字段删除。 57、问在MAPGIS里如何获得一个区的最长的边,并且怎么知道它的方位 答 对每一个区调用_GetReg...,rdat,len....; double maxLength0; double tempLength; double maxLi0; fori1;i { ifrdat[i]0 { _GetLin...absrdat[i],dotset,linlen... tempLength_CalculateLengthdotset,linlen; iftempLengthmaxLeghth { maxLeghth