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 能不能依次得到工作区中的图元号,该如何得到啊!
答:
long i,pntn;
short len;
pnt_info inf;
d_dot xy;
char *dat;
{
_GetPntNum(ai,&i,&pntn);// 取点数
for(i=1;i 《 pntn;i++)
{
if(_getpnt(ai,i,&xy,&dat,&len,&inf)<=0)// 取点,返回值 1/0/-1 成功 / 失败 / 删除
continue;
… 对该图元进行操作
}
}
i 就是图元号
5 、问: MapGis6.5 的 SDK 函数 NearPnt ,到底应该如何用啊!跟以前的不同了,给个例子吧!
答:
long WINAPI _NearPnt(short ai,D_DOT *xy,unsigned char *layerOnOffPad,short padLen,double *dis);
ai 点工作区号
*xy 点位置号 --- 比如鼠标的位置
layeronoffpad 图层开关标志,如不为空就只在打开状态的图层中查找
padLen 是 layerOnOffPad 的长度
出口 dis 返回距离
返回值成功返回点号,失败为 0
6 、问:如何屏蔽掉 CPrjEditView 中的右键功能!!!
答:
editview 有一个 PopMenuControl 属性,同理 CPrjEditView 也可以直接使用这个属性。
editview.PopMenuControl=-1 '/// 不显示菜单
=0 '/// 全部显示
=1 '/// 显示窗口菜单
=2 '/// 显示窗口 + 编辑菜单
=3 '///1+2+ 工具箱
7 、问:如何将一个圆添加到一个工作区 Ai 中?
答:
先用 _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);
8 、问:急关于 _ShortFlash(ENTITY_MSG *pt,long num) 函数!
答:
sypedef struct
{short ai 工作区号
short type 图元类型
long elmi 图元号
}ENTITY_MSG
定义一个 ENTITY_MSG 数组你把所要闪烁的图元一个一个加进去就行了。
9 、问:实现查询多边形中图元的,并时期闪烁显示,应如何实现呢?
答:用 _RectAskToList 系列函数,然后可通过 CGisView 的闪烁机制完成。
10 、问:
CloseToolBox();// 关闭工具箱
OpenToolBox(); // 打开工具箱
我的程序只要进行了上面关闭和打开工具箱的操作后,在最后关闭时总是报错
不管是用上面的函数还是用右键提供的工具箱控制,到最后都会出现一个
Debug Assertion Failed !
的错误,谁能解释一下呢?答:
1 、升级你的 VC++ (比如 SP2 、 SP4 )
2 、出现这种问题不用管,在编绎成 Releas 版后,这个问题不会再出现。
11 、问:我在本机器开发环境上运行开发的软件没什么问题。但在其他机器上,运行时出现找不到 mfc42d.dll 动态链接库文件。请帮忙!
答:你编的东西编译成 DEBUG 版,运行时需要 mfc42.dll( 这可不是 MAPGIS 的动态库,是 VC 的 ) ,如果你在编译时生成 RELEASE 版,到
别的机子上运行,就不用找 mfc42d.dll 了。
12 、问:有没有获得工程文件名的函数,有没有通过工程文件,来获得工程中的个文件的路径的函数!!!
答:这个容易,兄弟用 VC 吧。打开有关 PRJ 的头文件( *.h ,具体是哪个我记不清了,自已找找),看里面的函数声明,这比看帮
助或是开发指南要好用得多,而且看到的东西比什么指南都强。里面的函数英文名称确切,当然,如果你的英文不行,先去补习一下吧。
13 、问:颜色不准,急 ! 急 ! 急 !!! 我公司新买的 HP DJ800PS 的喷墨打印机, mapgis 的颜色库用的是地矿部的标准色库,可每次执行光栅化输出以后,出图颜色与色标差太多,光栅化参数按推荐 100 、 75 、 61 、 100 设的。
答: 又是该死的地矿部标准,那玩意是用 6 色印刷的,普通喷墨仪如果只有四色,怎么着都打不出一模一样的。
真要打出跟那标准一模一样,也简单,输出到 EPS ,花几千块,去印刷厂印一张回来。
14 、问:请教各位大侠, logcount 和 count 的区别?含义分别是什么?
答:
逻辑数:工作区中没有被删除的实体或者记录的个数。
物理数:工作区中所有的实体或者记录的个数,包括那些从被删除了的实体或者记录。
有如下等式:
物理数=逻辑数+被删除的个数+ 1
15 、问:
请问有没有这样的函数?
可以求出两个区之间的公共弧段呢。
有的话,请告诉我关于这个函数的详细情况。谢谢!
答:
先取出第一个区的所有弧段,对每一条弧段取拓扑,看看拓扑的左区或者右区中有没有一个等于第二个区的区号。如果有,那么这条弧段就是这两个区的公共弧段。
16 、问:如何对表文件( .wb )进行读某条记录的某个字段!!!请问各位大虾:如何取得表文件的记录数,如何判断该记录是被删除,如何取某记录的某个字段值。谢谢!!
答: MAPGIS.COM.CN 下载区二次开发示例第 5 章有详细说明。
17 、问:请问在 delphi 里怎么调用 mapgis 的 api 函数
答: 和调 windows 的 api 一样调用。
如:
function _FindNearColor(r,g,b:Integer):Integer;stdcall;External'mapdsp60.dll'
procedure TForm1.Button1Click(Sender: TObject);
var
aa:Integer;
S: string[11];
begin
aa:=_FindNearColor(255,255,255);
Str(aa, S);
ShowMessage(S);
end;
18 、问:在对话框中实现区填充颜色、图案预览和选择
答:自己重绘 ListCtrl 。在 DrawItem 函数中绘制每一个 Item 的图形(用 MyDC )。
19 、问:请教各位大虾,如何用 vb 编程实现 mapgis 中属性文件转换为 dbf 、 mdb 等文件?
答: 目前 VB 中还没有提供导出属性数据的二次开发的方法。
你可以用 ADO 或者其他的工具将 mapgis 的属性数据读出来再形成各自的记录集,最后专程 dbf 、 mdb
20 、问:请教有关 cmyk 和 mapgis 颜色阶的问题
答: 目前组件中还没有相应的方法。 API 中提供 _FindNearCMYKColor 、 _FindNearColor 等函数完成颜色的转换。
21 、问:那位朋友有 MAPGIS 明码文件格式说明 能不能给我发一份,急需,我实在是找不到。。谢谢。
答:详见 mapgis 地理信息系统使用手册数字制图篇
22 、问:
1 )如何能得到一条线的起始结点和终止结点(图元号)?
2 )知道一个 node 的 x,y 坐标,如何能得到这个 node 的图元号?
答:
取该线的拓扑信息。 LIN_TOP
该拓扑信息中第一个和第二个元素就是其实结点和中止结点的图元号
查找最近结点
long _NearNod(short ai,D_DOT *xy,double *rtnDis)
参数 入口 ai - 结点工作区号
*xy - 结点位置, xy 为图形实际坐标
出口 *rtndis - 返回距离
返回值 成功返回结点号 (>0) ,失败返回 0
23 、问:在 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 指定文件的名称的字符串
10 、取项目的文件名 ( 不带全路径 )
short _PRJGetItemName1(MAPPROJECT prj,int index,char *name)
参数: 入口 prj - 工程句柄
index - 文件位置
出口 *name - 返回文件的名称
返回值:成功返回 1 ,失败返回 0
24 、问:如果调用 CGisEditView 的编辑与修改什么的函数,那么视图窗口总是处于交互状态,请问如何取消?
答:先调用 SetExtTool ( NULL );
再调用 SetOperateState ( 0 );
25 、问:我用 VB 来调试一些帮助中列举的例子,在加载工程的时候用 bPRJLoadProject() ,系统给出错误: bad dll 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, Optional ByVal fastOpen As Integer = 0) As Long
26 、问:请问用 delphi 调用 mapgis 的 dll 一定要用 vc 的 dll 对吗
答: 不用重装 VC 。只需要到别的地方去找一个 MFC42D 。 DLL 文件复制到 SYSTEM 目录即可。
27 、问:我想取消 EditView 的右键功能,而自己用 Command1 (在 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",'1',fileter,NULL);
我调试的时候,一到最后一行就报错。
错误信息如下:
Unhandled exception in ChangePoint.exe(BAS60.DLL):0xC0000005:Access Violation
请指教,谢谢!
答:
char szName[128];
char dsn[32];
char owner[32];
char ftype;
char openflag=0; //0 打开文件; 1 保存文件
char filter[]=_T(" 线文件 (*.wl)\0*.wl\0 点文件 (*.wt)\0*.wt\0\0");
char ttlStr[]=_T(" 打开文件 ");
char log[32];
char psw[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[0]!='\0')
{
db_GetLogPsw(dsn, log, psw);
//m_hInst 工作区示例句柄 m_ai 工作区号
m_ai=_OpenFileArea(m_hInst,szName,dsn,log,psw);
}
else
m_ai=_OpenFileArea(m_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 。
调用 CalculateLength(xy As D_DotSet) As Double 求线长度
调用 CalculateOneArea(xy As D_DotSet) As Double 求该点集围成的区的面积
33 、问:请问用 delphi 开发,如何将某一 maplayer 和工作区绑定?
我打开了一个工程文件,现在想对其中某一层进行操作,如何把这一层和工作区进行绑定?那个 attach 怎么用?我的意思是已经用 map.load 把文件打开了,然后怎么绑定?我用的是
var regarea:iregarea;
regarea:=createcomobject(class_regarea) as iregarea;
maplayer.attach(regarea);
把 regarea 保存一下,发现还是空白一片
答:对工程中的某一层进行操作,只需要对该 layer 的 workarea 接口操作即可。
而你的代码是把该 layer 又和一个新的 regarea (你只是实例化了,没有装载文件)绑定,此时已经丢掉了原来的 workarea 。所以出现你描述的情况。
34 、问:那个函數能够实现计算一条曲线与其它多条曲线的交点?
答:
在 winarea.h 文件中有计算单个线段交点的函数
short WINAPI _CalCrossDot(D_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 得到了路径的文本,怎么修改呀?
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 、问: 用 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(&H0)
ai = bOpenArea(hInst, LIN)
Call bLoadFile(ai)
Call bE00out(ai, "d:\aa.e00")
Call bFreeWorkArea(hInst)
44 、问:请教在 WEBGIS 中,能否对 *.WP,*.WL,*.WT 文件进行操作,属性检索的功能和非 WEGGIS 开发模式下的有什么区别,我想闪烁某个 / 些被检索到的图元能做到吗?
答:在 webgis 中能够对点线面文件进行操作,可以根据用途的不同,可以进行不同的操作。 属性检索和非 webgis 开发模式下没有什么不同。在 webgis 中可以进行闪烁某个点或一些点,但是我们一般不建议这样作,因为这样速度可以跟不上,一般是通过改变颜色的方式来标志检索到的图元。
45 、问:怎么写点的属性,我想用 pntatt.write
答: 先得到你要写属性的那条记录。 pntarea.get ( i,rcd )然后对 rcd 属性记录进行操作, rcd.item.val(1)...... 再 pntarea.write 即可。
46 、问:如何在 vb 中使用 “GisConv.h” 中所声明的 api 函数?比如 convertapi_e
答:
Declare Function bGisAscIn Lib "w60_conv" Alias "#6" (ByVal AHInst As Integer, ByVal mPath As String, outAi As Integer) As Integer
' 明码文件转换二进制文件,返回成功和失败
Declare Function bGisAscOut Lib "w60_conv" Alias "#7" (ByVal ai As Integer, ByVal FileName As String) As Integer
' 二进制文件转换明码文件,返回成功和失败
Declare Function bE
Declare Function bE00out Lib "w60_conv" Alias "#9" (ByVal ai As Integer, ByVal FileName As String) As Integer
Declare Function bDxfOut Lib "w60_conv" Alias "#10" (ByVal ap As Integer, ByVal al As Integer, ByVal FileName As String) As Integer
Declare Function bArcInfIn Lib "w60_conv" Alias "#11" (ByVal AHInst As Integer, ByVal mPath As String, ByRef OutAp As Integer, ByRef OutAl As Integer, ByRef OutAr As Integer) As Integer
Declare Function bArcInfOut Lib "w60_conv" Alias "#12" (ByVal ai As Integer, ByVal FileName As String) As Integer
Declare Function bArcIn Lib "w60_conv" Alias "#13" (ByVal AHInst As Integer, ByVal mPath As String, ByRef OutAp As Integer, ByRef OutAl As Integer) As Integer
Declare Function bArcOut Lib "w60_conv" Alias "#14" (ByVal ai As Integer, ByVal FileName As String) As Integer
' 示例:
'Dim ahInst As Integer
'Dim binAi As Integer
'Dim ai As Integer
'Dim mpath As String
'Dim fname As String
'Dim res
' 'ahInst = bInitWorkArea(0)
'mpath = "d:\mapgis61\sample\china.wal"
'res = bGisAscIn(ahInst, mpath, binAi)
'MsgBox res
'fname = "d:\mapgis61\sample\china.wal"
'ai = bOpenLinArea(ahInst)
'bLoadFile ai
'res = bGisAscOut(ai, fname)
'MsgBox res
'bFreeWorkArea ahInst
47 、问: 对于区有一个生成 label 文件的操作,它是生成的一个新的点文件并提示保存,现在我就是想把生成的点文件保存在现在点文件的一层里,有什么办法吗?
答: 修改生成的点文件中的每个点的图形参数,将图层改为一致,再拷贝打一个点工作区中即可。
48 、问:求一个点到一个区的最近和最远距离要怎么做
答: double _MinDistofPntToReg(D_DOT *pnt,short ai,long,ri)
double _MaxDistofPntToReg(D_DOT *pnt,short ai,long ri)
*pnt 点坐标地址
ai 区所在工作区
ri 区号
若点位于区内,则最小距离为 0
================2003 年 12 月 10 新增 ==============
49 、问:请教关于定位的问题。
在一个工作区里面,我使用 SelectRegion 方法获得一个 selectset ,想把它放大显示在屏幕*,该如何操作,使用那一个对象或是方法??最好给几句代码( vb )。 3Q
答:
首先,取出集合中实体图形信息( Info )使用 EditView.SetMapRange(MapRect As D_Rect) 方法更改图形信息中的区域范围 (D_Rect) 。
50 、问:动画功能如何实现?
如何在有向的道路中心线上实现车行的模拟?
即在道路上定两个点,以一定的速度,模拟汽车(符合)在两个点间的动态的行走,能否给个简单的 demo 。
答:
MAPGIS 属性数据支持动画类型的数据,不需要什么示例,你只要把相应的动画剪辑(世面上有专门制作这种闪图的软件)建立到属性库中就可以了,在相应的地方调用程序执行就行了。
51 、问: 请教大师:如何用 vb 实现 mapgis 投影变换中的 “ 用户的文件投影转换 ” 的功能;
答:
使用以下方法,用对话框设置投影变换。
Function SetInPara([move As Integer], [EnableEdit As Integer = 1]) As Boolean
在 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 状态。
lParam 参数为指向 MGMSG 结构的指针,该指针所指结构空间属于属性编辑窗口, MGMSG 结构如下:
// 图元实体信息结构
typedef struct
{short ai; // 工作区号。
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 方法,当参数 rcdNo=0 时,弹出跳转条件对话框。但是我试过,却无法实现。我把 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_CurAttElement(ByVal lNo As Long)
GisAttEdit.GotoAtt lNo
End Sub
Private Sub GisAttEdit_CurRcdFldNo(ByVal 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 maxLength=0;
double tempLength;
double maxLi=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 是不是和 WINDOWS XP 这个操作系统不兼容?我迫切想知道答案,能快点回复我吗?
答:
对于数据源,可以用 Sql Server 和 Oracle ,对于 Access 和 FroPro 不支持,原因很简短,因为后两种数据库软件对大型数据库支持不好,所以我们没有作 SDE , Sql Server2000 不会与 Windows Xp 冲突,因为他们都是微软的,你可以打 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 中有函数 double WINAPI _CountPolygonArea(D_DOT *xyLst,int len,MAP_PARA *map);
可以根据形成多边形的点集以及相应的地图参数计算出实际面积。
63 、问:用 EDITVIEW 显示多个点(或线)文件后,怎样激活某一层点(线)文件,并对其修改?
答:根据你要修改的那一层的工作区类型,将工作区对象赋给 EditView 相应的工作区接口。如:要修改某区工作区 regAi ,则
EditView.RegArea = regAi
64 、问:我有一个 *.GRD 文件,利用什么 MAPGIS 库的什么函数把它显示为等值线?
要是离散的数据,显示之前又是调用什么函数把他规格化呢?
答:
MAPGIS 提供了 TIN SDk 开发包 , 可到网站下载 .
在 Tin_Area.h 文件中 ,
GRD 数据可通过 _tnTinGridDemTraceContour() 函数追踪为等值线 .
具体步骤 :
(1) 使用 _tnGetTinAI() 创建 TIN 工作区 ;
(2) 使用 _tnLoadFile() 装入 GRD 文件 ;
(3) 使用 _tnTinGridDemTraceContour() 进行追踪过程 ( 此函数提供参数设置界面 ).
离散数据 , 有两种网格化方法 ( 依数据而定 ):
(1) 直接使用 _tnDistInsGriding() 或 _tnKringGriding() 进行网格化 ;
(2) 先建立三角网 ( 可使用 _tnCreateTinNetInTinArea0),
再使用 _tnTinDatGriding() 内插网格化 .
65 、问: 我想将计算得到的一系列离散的数据,画成函数曲线通过对话框显示出来,请问用什么比较好?
答: 方法:得到了离散点,调用 mapgis 的光滑函数 (TinBas60.dll,w60LnCps.h), 生成线文件,直接放到 mapgis 提供的显示对象或控件显示即可。
66 、问:请问 QUERY 对象查询时,输入条件查询时, “ 输入日期大于
答: 对于日期的查询需要将日期用 "[]" 括起来,如: 日期 >[
67 、问:请教等值线问题
有我一批点的 X 坐标、 Y 坐标和观测值,想在自已的程序中画等值线, mapgis 里的数字地面模型中有这样的功能,但是我不知道二次开发函数是那些(特别是那三种数据网格化方法的函数)?而且对 TIN 文件也一点不懂,能不能给介绍下这方面的知识和 mapgis 的等值线绘制方法 , 并给发个例子程序?
答:
首先 , 要下载 TIN SDK 的开发库 ;
在其中 Tin_Area.h 头文件中 , 有相关函数的说明可供参考 .
由于这一部分的二次开发库还未正式推出 , 所以目前尚无开发手册 , 只能针对具体开发函数回答 .
对于等值线追踪 ,
对于离散点数据 , 应按照下列步骤进行 :
a. 首先按照系统要求的 DET 数据格式 , 编辑你的数据 ( 可以参考 DTM 系统 );
b. 使用 _tnGetTinAI() 创建 TIN 工作区 , 最后应用 _tnDeleteTinAI() 删除 ;
c. 使用 _tnLoadFile() 装入数据文件 ;
d. 使用 _tnCreateTinNetInTinArea() 生成三角网 ;
e. 使用 _tnTinTriNetTraceContour() 追踪等值线 ;
================
68 、问:关于输入区的问题
有什么办法,让边输入弧段边生成区,当弧段封闭时,就自动生成一个区。
而且输入弧段最好用键盘输入。
能实现吗?给段代码吧
答:
键盘输入点,记录下每一个点的坐标。添加到一个 D_Dot 数组中,记录下点数。
用下面的函数即可将这些点组成弧段并生成区。 ( 当然第一个点和最后一个点应该是同一个点。 )
long MakeRegFromLin(short ai,D_DOT* pddDot,long num)
{ ASSERT(ai>0);
// 添加弧段
LIN_INFO LinInfo={0};
long LinNo=_AppendLin(ai,pddDot,num,&LinInfo);
// 造区
long rdat[3]={0};
rdat[0]=num+1;
rdat[1]=LinNo;
REG_INFO RegInfo={0};
long RegNo=_AppendReg(ai,rdat,2,&RegInfo);
return RegNo;
}
69 、问:如何在 EDITVIEW 中加入多个点线区文件?
答:
Dim pntArea1 As PntArea
Dim pntArea2 As PntArea
Dim linArea1 As LinArea
Dim linArea2 As LinArea
Dim regArea1 As RegArea
Dim regArea2 As RegArea
Private Sub CommandButton1_Click()
Set pntArea1 = New PntArea
Set pntArea2 = New PntArea
Set linArea1 = New LinArea
Set linArea2 = New LinArea
Set regArea1 = New RegArea
Set regArea2 = New RegArea
pntArea1.Load
pntArea2.Load
linArea1.Load
linArea2.Load
regArea1.Load
regArea2.Load
End Sub
Private Sub EditView1_MyDraw(ByVal MpDC As Object)
MpDC.DispArea pntArea1
MpDC.DispArea pntArea2
MpDC.DispArea linArea1
MpDC.DispArea linArea2
MpDC.DispArea regArea1
MpDC.DispArea regArea2
End Sub
70 、问:如何在继承 PRJ 建立切分视后,向文件添加项目,给个示例吧?
答:
int flag;
char szName[256];
char dsn[32];
char owner[32];
char ftype;
char openflag;
char filter[]="MapGis 线文件 (*.wl)\0*.wl\0\0";
char ttlStr[]=" 添加线文件 ";
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 上同时闪烁 ?
答:
Dim selset As SelectSet
Set selset = New SelectSet
For i = 1 To lst.Count - 1
//\\ 闪烁多个实体,对每一个实体都要 New 一个 SelectItem
Set sel = New SelectItem
sel.Type = gisLIN_ENTITY
sel.ItemNo = lst.Item(i)
sel.WorkArea = areaObj
selset.Add sel
Set sel = Nothing
Next
Set EditView.SelectSet = selset
EditView.FlashElement EditView.SelectSet
Set selset = Nothing
72 、问:有什办法在 GAPGIS 内核启动之前修改环境目录?
我试过许多种方法,包括在 CMyApp::InitInstance() 甚至在构造函数 CMyApp::CMyApp() 中加入相关检查程序行也失败。看着连续蹦出来的几个标着惊叹号的对话框和接下来的死翘翘。真是让人伤心。
答:
在程序外面包一层不调用 mapgis 显示相关动态库的程序即可。外层程序仅仅调用 win_area.h 中的函数来修改目录环境。修改完成后,调用进程函数装入要执行的 mapgis 程序。
73 、问:如何根据点的属性(坐标值)调整点的位置?
答:如果是单个调整的话,可以利用 “ 定位点 ” 的方式;如果是批量调整,那就把坐标属性导出来然后再根据坐标来生成点。
74 、问:在用 VC++ 得类库开发时,调用 API 函数时 EDITWND 参数如何获取?
我是一位刚学 MAPgis 开发的新手。在用 VC++ 得类库开发时,调用 API 函数时 EDITWND 参数如何获取?谢谢,那位能帮助我。
答:
现在 Mapgis 推荐使用类库来进行二次开发,你说的 EDITWND 已经被封装到 CGisView 类当中,你直接继承 CGisView 类即可完成 Mapgis 图形显示的功能。具体的做法如下:
第一步:建一个 Visual C++ 的项目。打开 Visual C++ 工作环境,选择 File 菜单 New 命令,在弹出的对话框中选择 Projects 页的 MFC AppWizard(EXE) 项并在 Project name 编辑框中敲入工程名(例如: engineer ),然后单击 OK 。这样便进入了 AppWizard (向导)的第一步,在这一步里用户要选择工程类型,可以选择单文档或多文档工程,初学者最好选单文档类型;单击 Next 进入向导的第二步、第三步、直到完成( Finish 之后 OK ) , 这几步用户可以采用默认设置。到此为止一个 VC 的项目已建好,然后用户的工作就是在这个项目中实现 MAPGIS 平台中的功能及自己想要的其他功能。
第二步:要完成的工作是将工程中的视图类改为继承 CGisView 类。具体操作是打开工程中的视图类的两个文件( *View.h 、 *View.cpp ),用 Visual C++ 查找替换功能( Edit 菜单下的 Replace 命令或热键 Ctrl+H )分别将这两个文件中的 CView 字符串全部替换为 isView ,替换完毕,在工程中视图类的定义前面加入 #include “cgisview.h” ,这样就完成了 CGisView 类的继承。
第三步:调用 CGisView 类中的 OnDraw(pDC) 函数,以完成绘图工作的预先处理。具体操作方法:在视图类的 OnDraw(CDC* pDC) 函数中加语句 CGisView 。添加过程见下面示例:
void CEngineerView::OnDraw(CDC* pDC)
{ CEngineerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CGisView::OnDraw(pDC);
} 第四步:对 Visual C++ 的工作环境进行必要的设置,这些设置很重要。
第 1 项 ( 字节 ) 设置:选择 Project 菜单下的 Settings 命令,在 C/C++ 页面上, Category 一栏选择 Code Generation, 并将 Struct Member Alignment 设定为 1 Byte 。
第 2 项(输出目录)设置:把生成的可执行文件输出到 MAPGIS 动态连接库所在的目录下。选择 Project 菜单下的 Settings 命令 , 在 General 页面上, Output files 一栏,填写 mapgis 应用程序目录,例如:
c:\mapgis65\program 。
第 3 项(包含库)设置:设置头文件及库文件的路径。选择 Tools 菜单下的 Options 命令 , 在 Directory 页面上,在 Show directories for: 一栏选择 include files, 在 Directories: 下面填写 MAPGIS 二次开发库头文件目录,例如, C:\MAPGIS65\include ;然后,在此页面上的 Show directories for: 一栏再选择 library files ,在 Directories: 下面填写 MAPGIS 二次开发库目录,例如, C:\MAPGIS65\lib 。
75 、问: ZVelStrcT 结构,如何赋参数?
答:
typedef struct
{ LIN_INFO linf; // 等值线图形参数 .
REG_INFO rinf; // 填充区图形参数 .
double fZdem; // 等值线层值 .
char mskOn; // 该层注记开关 .
} ZVelStrcT; // 高程等值结构 .
如果要追踪 n 层等值线 , 就申请 n+1 个层结构 ( 区间 )!!!
赋值说明 :
1. 前两个参数可参考线 / 区图形参数结构赋值 ;
2. fZdem 为当前层高程值 ;
3. mskOn=0/1, 表示该层不注记 / 注记 .
76 、问:怎样获得正在编辑的工作区号?
答:
CGisEditView:: GetEditArea
原型: short GetEditArea(short aitype);
参数:入口 aitype – 正在编辑工作区类型。
返回值:编辑工作区号
77 、问:请教! _RectAskToArea 函数为什么返回值为零?
答:
如果返回值为 0 ,表示没有查询到实体。您检查下
1 、您给的参数 D_RECT *rc 的值是不是对应的是图形坐标(也称逻辑坐标)的值。
2 、工作区号是否合法;
3 、是否控制了图层开关;
78 、问:如何新建一个路径并把文件存进去?
_SaveAFile() 时,如果指定的文件路径不存在,则文件存不进去,如何让 MAPGIS 新建该路径,再把文件存进去?
答:
该函数要求文件夹存在。如果想让 MAPGIS 新建该路径,再把文件存进去,可以调用函数 _SaveFileAs();
79 、问:使用 _ClearArea() 清理工作区时会将属性结构也清空了,如果我想保留该用什么函数?
使用 _ClearArea() 清理工作区时会将属性结构也清空了,如果我想保留该用什么函数?特别当工作区类型时为 TBL 时!
答:
想保留属性结构,可以用循环语句将所有实体删除即可。比如想删除所有的线 , 可象如下调用:
_GetLin(lai,&logN,&n);
for(i=0;i<n;i++) /* 编者注:这行有问题,图元实体号应从 1 开始 */
_DelLin(lai,i); /* 应该是 for(i=1;i<=n;i++)*/
80 、问:请教:能否简单介绍 MAPGIS 中逻辑坐标,设备坐标和窗口坐标的关系呢?
我每次响应 CGisview::onmousemove 和 CGisview::onlfbuttondown 这些函数时,获取的 cpoint 是窗口坐标,每当用 _AppendLin()_AppendReg() 这些函数时好象又是逻辑坐标,和文件坐标信息一致,但我用 _MoveTo(),_LineTo(),_Circle()_Rect() 等函数时,用 _AppendLin()_AppendReg() 中同样的坐标,但显示结果不是一样位置。请教 _MoveTo(),_LineTo(),_Circle()_Rect() 等函数使用的是什么坐标系统?
答:
AppendLin() 等函数使用的是图形坐标(也称逻辑坐标), CGisview::onmousemove 使用的是窗口坐标, _MoveTo(),_LineTo(),_Circle()_Rect() 使用的是设备坐标。所以在函数使用中一定要分清楚不同的坐标系。并且 mapgis 提供了不同坐标系的转化函数,如 LpToDp,LpToWp,WpToDp,WpToLp 等。