30楼#
发布于:2004-10-26 21:04
VC部分
******************************************************************* 问题: 求救点操作 用_AppendPnt();向已有的文件中添加一个点,并显示出来(单文档) 谢谢! <P>回复: 打开点工作区 装载文件 重载视图的_OwnerDraw()显示该点文件 添加点_AppendPnt() long _AppendPnt(short ai,D_DOT *xy,char *dat,short len,PNT_INFO *inf ,short dim=2) 参数:入口 ai - 工作区号 xy - 点坐标位置 *dat - 点内容 len - dat数据长度(字节为单位) *inf - 点图形信息 dim - 点的维数 出口 无 返回值 成功返回点号(>0),失败返回0 UpdateWindow() ******************************************************************* 问题: 查询点区叠加后,区的外部的点的函数是什么啊?</P><P>回复: _RegAskToArea(short ai0,short ai1,short type,short ai2,short outFlg=0) 函数中将outFlg传1即可。 ******************************************************************* 问题: 求某区中的点图元,是什么函数???????</P><P>回复: _RegAskPntToArea(short ai0,short ai1,short ai2,short outFlg=0) ******************************************************************* 问题: mapgis:如何计算某个点(X,Y)到某条线的最短距离? </P><P>回复: 计算点到线之间的距离 double _DistofPntToLin(D_DOT *pnt,D_DOT *lxy,long len)</P><P> 参数:入口 *pnt - 点坐标</P><P> *lxy - 线上点坐标数组地址</P><P> len - 线上点坐标数组长度</P><P> 出口 无</P><P> 返回值 成功返回距离,<= 0失败 ******************************************************************* 问题: 用_AppendPnt();向已有的文件中添加一个点,并显示出来(单文档)</P><P>回复: 打开点工作区 装载文件 重载视图的_OwnerDraw()显示该点文件 添加点_AppendPnt() long _AppendPnt(short ai,D_DOT *xy,char *dat,short len,PNT_INFO *inf ,short dim=2) 参数:入口 ai - 工作区号 xy - 点坐标位置 *dat - 点内容 len - dat数据长度(字节为单位) *inf - 点图形信息 dim - 点的维数 出口 无 返回值 成功返回点号(>0),失败返回0 UpdateWindow() ******************************************************************* 问题: 我在VC中使用CGisEditView派生CMyView类, 在CMyView中我使用从CGisEditView中继承的方法, LoadLine();是只打开一个线文件但是不能编辑, 而 AppendLine();打开的一个线工作区文件是可以编辑的, 我在调用了AppendLine();是不是CGisEditView类自动初始化工作区和 自动处理工作区有改变后,关闭时有提示呢? 我如果想自己创建一个新的工作区是不是要使用API函数呢? CGisEditView提不提供创建一个新的工作区的操作?</P><P>回复: 创建新的工作区需要先申请工作区实例句柄 然后用这个实例句柄开一个工作区,得到一个工作区号 再装载文件 AREA_HINST _InitWorkArea(HINSTANCE hInst); short _OpenArea(AREA_HINST hInst,short type); short _LoadAFile(char *datName,short ai,char *szDSN=NULL,char *szLOG=NULL,char *szPSW=NULL);</P><P>CGisEditView提供三个缺省的点、线、面工作区,因此可以直接打开文件,并显示(CGisEditView::LoadLine)。 如果要让CGisEditView能够显示和编辑由_OpenArea打开的工作区,需要调用CGisEditView的成员函数 CGisEditView:: SetEditArea()将由_OpenArea打开的工作区设置成编辑工作区。 ******************************************************************* 问题: 我用VC进行二次开发,请问图幅接边的函数在哪个头文件里,有哪位知道请帮忙,谢谢!</P><P>回复: 图库管理的应用都包含在头文件Dbs_View.h中。 ******************************************************************* 问题: CGisEditview中如何打开工程文件啊!</P><P>回复: 在Map_prj.h中可使用以下函数: MAPPROJECT WINAPI _PRJLoadProject(AREA_HINST aInst=0,short fastOpen=0); MAPPROJECT WINAPI _PRJLoadAProject(char *name,AREA_HINST aInst=0,short fastOpen=0); ******************************************************************* 问题: 已知圆点(X,Y)和半径R,想把它添加到一个工作区中?如何做? _AppendLin()好象不可以吧?F_DOT怎么设定?</P><P>回复: 先用_AppendLin函数在工作区画园(或画弧)的时候需要自己生成坐标点,比如说 D_DOT *dat, 这里dat的空间需自己申请,其长度为 long len,线的参数是 LIN_INFO inf,需要赋值,short ai为区工作 区号,long i 为弧段号。然后调用: i = _AppendLin(ai,dat,len,;inf); 输入弧段。然后添加区域 入口: ai - 区工作区号 long rdat[2] - 区域数据块 rdat[0] = 1(弧段个数),rdat[1]= i (i 为弧段号) rinf - 区域图形信息,需要赋值 然后调用: _AppendReg(ai,rdat,2,;rinf); ******************************************************************* 问题: 空间分析——等值线(急) 在DTM分析中。进行离散网格化后(坐标范围已定),做平面等值线绘制,结果x范围没变。y范围变大。也就是说压扁了。求救,急啊! </P><P>回复: 你应该确定数据范围的变化是在哪个阶段发生的!</P><P>1.你首先确定网格化过程结束后数据范围是否发生变化?</P><P>2.等值线绘制时,"制图幅面"选择"原始数据范围",再试试. ******************************************************************* 问题: 请教各位大侠,logcount和count的区别?含义分别是什么?</P><P>回复: 逻辑数:工作区中没有被删除的实体或者记录的个数。 物理数:工作区中所有的实体或者记录的个数,包括那些从被删除了的实体或者记录。 有如下等式: 物理数=逻辑数+被删除的个数+1 ******************************************************************* 问题: 我在GIS开发中遇到要利用程序在地图管理系统操作下自动添加两点连线问题,如图幅1和图幅6之间任意两点连 线请问如何解决? 是本地库管理,1和6只是举例,实际情况不一定是1和6,故有可能两图幅相邻也可能不相邻。 图库为每层16图幅,要完成的功能是根据给出的点位置信息自动再各点间连线以显示点移动路径(即两点连线) ,我再普通情况下(非库管理)根据起始结束点位置直接添加线便可以了,但在图库管理中因为原来的整图被 切成几块有时连线启终点不在同一图幅中那如何添加线呢?</P><P>回复: 其实你完全可以开辟一个工作区来保存路径,然后在地图库显示后显示该工作区。不用把它放入地图库中。 ******************************************************************* 问题: 请问向网络文件(.wn)中添加一个节点和一条线用什么函数?谢谢!</P><P>回复: 添加结点: long _AppendNod1(short ai,D_DOT *xy,long *dat,short len,char *infdat, short inflen,PNT_INFO *inf,short dim=2) 添加线: long _AppendLin(short ai,D_DOT *dat,long len,LIN_INFO *inf,short dim=2) ******************************************************************* 问题: 如何判断两条线是否相交?又如何遍历网络文件(.wn)中的各个节点呢?</P><P>回复: 先调用short _GetNodNum(short ai,long *logN,long *n)得到结点物理数n for(i=1;i<n;i++) { int _GetNod1(short ai,long ni,D_DOT *xy,long **dat,short *len, char **infdat,short *inflen,PNT_INFO *inf,short dim=2) } ******************************************************************* 问题: 如何在对话框的ListCtrl的单元中绘制MAPGIS的区填充颜色、图案,用于在视图中区元填充之 前进行预览和选择。</P><P>回复: 自己重绘ListCtrl。在DrawItem函数中绘制每一个Item的图形(用MyDC)。 ******************************************************************* 问题: 如何用函数_GetLin(short ai,long li,D_DOT **dat,long *len,LIN_INFO *inf,short*dim=NULL) 得到这条线的两个端点?参数len指的是什么?多谢!!</P><P>回复: dat是组成该线的点的数组,len就是该数组的个数,即该线的点数 ******************************************************************* 问题: 如何实现rgb颜色与cmyk颜色的相互转换??</P><P>回复: 在Map_Out.h中 //RGB->MAPGIS颜色号 OUTEXPORT short WINAPI_FindNearColor(int r,int g,int b);//返回颜色号0表示失败</P><P>//MAPGIS颜色号->RGB OUTEXPORT short WINAPI_GetAColorRGB<I>value</I>(int cno,int *g,int *b);//返回0/1 失败/成功</P><P>//MAPGIS颜色号->CMYK OUTEXPORT short WINAPI_GetAColorCMYK<I>value</I>(int cno,int *k,int *c,int *y);</P><P>//CMYK->MAPGIS颜色号 OUTEXPORT short WINAPI _FindNearCMYKColor(int k,int c,int m,int y);//返回颜色号0表示失败 ******************************************************************* 问题: 我创建了一个从CPejEditView派生的视图的单文档程序,希望完成以下操作:先显示一个工程文件a.mpj, 然后换一个工程文件b.mpj,最后又重新显示a.mpj;但在第二次调用_loadaproject函数装入a.mpj时,提示 文件已经打开,但还是能正确显示,这是什么原因?有没有办法加快打开mpj的速度?</P><P>回复: 在装入一个新的工程时,应该把已经打开的工程文件删除掉(用_PRJDeleteProject),否则工程对象占驻 内存没有释放,再次打开时会提示“XX文件已经装入”,而且会造成内存泄漏。 如果想要提高打开工程的速度,可以在关闭工程文件时把相应的文件状态改为“关闭状态”或者“打开状态” 即可。因为打开工程的时候,如果文件上次存盘是“编辑状态”或者“当前编辑状态”,那么会打开工作区, 如果这样的文件过多或者过大,都可能导致打开工程文件过慢。 ******************************************************************* 问题: 请问在程序中用函数_PRJDelete删除工程文件后,如何从PrjListView视中删除相应的Item项?</P><P>回复: PrjListView中有一个函数ReloadPrjItems可以更新显示PrjListView。 ******************************************************************* 问题: 小弟是二次开发的新手,有一个很简单的问题想请教各位前辈。小弟使用win2000+vc6和sdk62为开发环境。 新建一mdi程序,打开了一个面文件,想在一个新的子窗体中显示当前鼠标所选中的哪个图斑,请问怎么解决。 谢谢</P><P>回复: void CTeachDemoView::OnLButtonDblClk(UINT nFlags, CPoint point) { //...... _WpToLp(;point, ;Dot); regNo = _SeekReg(ai, ;Dot, NULL, 32); //双击鼠标选中的区 if(regNo>0) { //...... } } 新的子窗口中的View重载CGisView的_OwnerDraw函数 在里面调用 _DispReg(MyDC mdc,short ai,long gno,long col=0); 绘制你在原窗体中得到的图斑。 ******************************************************************* 问题: 点xy所在的区域位于另一个区域上,我要查找点xy位于哪个区域里,可是总是显示位于那个大区域,而不是小区域,请问这是怎么回事? dim rai as regarea Dim xy As D_Dot Set xy = New D_Dot dim lno as long .......... lno=rai.seek(xy)</P><P>回复: 这种情况我们需要以下函数 short _IsDotInReg0(long regNum,D_DOT *xy,long *ne,D_DOT *dot,short flg,double esp)</P><P>short _IsDotInReg(long regNum,D_DOT *xy,long *ne,D_DOT *dot,short flg)</P><P>short _IsDotInReg1(D_DOT *dot,short ai,long ri,short flg)</P><P>参数:入口 *xy - 区域边界坐标数据串;</P><P> ai - 工作区号</P><P> ri - 区域号</P><P> *ne - 区域边界每一圈点数</P><P> *dot - 判断点坐标</P><P> Flg - 是否判断内圈标志,1/0:判断/不判断。即flg=1时,要严格判断点是</P><P>否落在区域内,若落在区域的空洞内,也认为是落在区域外边</P><P> Esp - 允许在区域上的限度</P><P> 出口 无</P><P> 返回值 dot点在区域内返回2,在边线上返回1,在区域外返回0 ******************************************************************* 问题: 请问:GisAttEdit与EditGisAtt有什么区别?还有EdtAttStruc与AttStruEdit的区别</P><P>回复: GisAttEdit和控件主要用来浏览和编辑MAPGIS属性数据 AttStruEdit控件主要用来浏览和编辑MAPGIS属性结构 现在用的都是以Edit结尾的控件。记住是“××××编辑控件”,就知道该用GisAttEdit 和AttStruEdit,就不会弄混了 ******************************************************************* 问题: ATT_STRU AttStru; 我试图通过函数_GetPntAttStru(pai,;AttStru) 来取得点的信息,可是编译时,体是找不到该 结构体,后来我填加头文件#include "Att_Sta.h",提示找不到该文件,我的SDK的版本号为6。5, 请高手告诉我这种方法是否可行,为什么出现此情况,如果行不通的话,有没有其他的办法, 谢谢,急!</P><P>回复: 方法一 char *att; long pn; ATT_STRU *stru = NULL;//要定义成指针 _GetPntAtt(pai,pn,;stru,;att);//获得结构</P><P>方法二 char *att; long pn; CATT_STRU *stru = NULL;//要定义成指针 _GetPntAtt(pai,pn,;stru,;att);//获得结构</P><P>问题: 编译时总是提示找不到ATT_STRU或CATT_STRU?</P><P>回复: 直接包win_area.h就可以了。 ******************************************************************* 问题: 我试着设置了editview1.setwinmaprange 可是没什么用啊,怎么才能一打开工程文件就可以全景显示?就是1:1显示,用restorewindow也没有用 还有一个小小问题,editview点右间就出来的放大缩小功能我想把它加在工具栏里可是没找到函数,函 数在哪里?如果用setdispparm怎么能保证放大缩小比例和右建的比例是一样的?</P><P>回复: 复位都不行,说明你的工程中包含有没有图元的工作区,你看看。 要么把这些文件去掉,要么重新算一下有图元工作区的外包络矩形,在调用setwinmaprange。应该就可以了。</P><P>放大 zoomin 缩小 zoomout ******************************************************************* 问题: 就是类似于子图输出、字符串的函数如mapgisdc.dispsubgr</P><P>回复: 填充图案是用来填充区域的。要输出,也只能输出区</P><P>问题: 可是偶是想把它画到别的地方做预览,难道还要先生成区文件再把里面的地块画出来?</P><P>回复: 直接在你要画的地方用_PolyGon绘制多边形(区)。 绘制之前用_SetBrush设置一个你需要的图案的刷子即可。 绘制完成以后再用_CleanBrush函数清除画刷子 void _PolyGon(MyDC mdc,D_DOT *lxy,long *ne,int na); 参数:入口 hdc - 显示对象句柄 *lxy - 区域边界坐标数组,坐标值为设备坐标 *ne - 边界坐标点数数组 na - ne数组项数 出口 无 返回值: 无</P><P>设置绘图填充刷子 void _SetBrush(MyDC mdc,long bcol, short pno=0, double phei=1,long pcol=0); 参数:入口 mdc - 显示对象句柄 bcol - 显示底色 pno - 图案编号(为0则不填充图案) phei - 图案高度 pcol - 图案颜色 出口 无 返回值: 无 说明:这个函数影响所有与填充有关的使用Brush的函数,如画填充圆,画填充多边形等。 使用结束后,要用_CleanBrush函数清除画刷</P><P>清除刷子 void _CleanBrush(MyDC mdc); 参数:入口 mdc - 显示对象句柄 出口 无 返回值: 无 *******************************************************************</P> |
|
|
31楼#
发布于:2004-10-26 21:02
前MAPGIS二次开发库主要以API函数、MFC类库、ActiveX 控件三种方式提供。开发库被封装于若干动态链接库(DLL)中。
API函数在使用方法上与Windows的API函数完全一样,因此是独立于开发工具的。无论您使用VC++、VB还是Dephi…,您在这些工具中如何调用Windows的API函数,您就怎么调用这些二次开发函数。 MAPGIS类库是为基于MFC(Microsoft Foundation Class)的开发者提供的多个可重用基类,将应用程序所需的常见基本功能作了封装,使用便利,改动灵活。开发者只需从类库派生即可使自己的程序获得从窗口显示控制到图形查询编辑的各项功能。 |
|
|
上一页
下一页