MAPGIS 开发问题_第1页
MAPGIS 开发问题_第2页
MAPGIS 开发问题_第3页
MAPGIS 开发问题_第4页
MAPGIS 开发问题_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、mapgis开发问题22008-04-07 18:2139、问:如何在map对象中实现只对激活的maplayer进行编辑和操作?/B答:selectpoint方法可以选中所有的打开的点文件中的点。而不仅仅是你激活的那个layer。在最新的mapgis中对maplayer增加了一个selected的标志。如果该标志设为1,则selectpoint会在这个layer上做操作。相反,则不会影响这个layer。40、问:在mapgis输入编辑里有个功能叫“根据属性赋参数”,请问二次开发里提供这个功能吗?如果有怎么用,在哪里可以找到;如果没有怎么根据属性筛选符合条件的点。答:、“根据属性赋参数”实际上就

2、是找出那些满足你给定的属性条件的图元,然后给他们参数的某一项,或者某几项。用AttAsktoList即可,具体可参考vb开发示例。(MPGIS.COM.CN下载区)41、问: 用Gisedit1.SelectGraphics选中图元后,如何取得其属性值,请用VB示范一下,谢谢!答:可以自己写一个交互操作,用鼠标双击、或者拉框来查询图元。对于鼠标双击可以直接调用nearlin.,对于拉框可用rectasktolist来查询。前者得到图元实体好,后者得到实体号列表。然后用这些实体号即可取属性即可得到相应的属性。42、问:有关IMS 的浏览查询的问题我想在IMS中实现浏览查询功能,能不能按照如下的思

3、路做:1 选定某一个工作区;2 找出该工作区的所有图元3 显示该图元的信息问题是:怎么样找出一个工作区的所有图员dim PrjItemset PrjItem = Server.CreateObject("MpMapCom.MpPRJITEM.1")Session("MapViewObject").ViewPrj.GetItem i,PrjItem这样能得到i对应的工作区,下面该怎么得到此工作区的所有图元呢?答:要得到图元,是用户进行查询的,而查询有多种查询方法,可以模糊、点击等等,如果用添加查询,就用函数gisSearchByStr,点击就用gisSea

4、rchByHitting等等,lib库中有这样的函数,web开发实例中也有这样的例子,您可以看看那里的例子,希望对您有所帮助49、问:请教关于定位的问题。在一个工作区里面,我使用SelectRegion方法获得一个selectset,想把它放大显示在屏幕中央,该如何操作,使用那一个对象或是方法?最好给几句代码(vb)。3Q答:首先,取出集合中实体图形信息(Info)使用EditView.SetMapRange(MapRect As D_Rect)方法更改图形信息中的区域范围(D_Rect)。50、问:动画功能如何实现?如何在有向的道路中心线上实现车行的模拟?即在道路上定两个点,以一定的速度,模

5、拟汽车(符合)在两个点间的动态的行走,能否给个简单的demo。答:MAPGIS属性数据支持动画类型的数据,不需要什么示例,你只要把相应的动画剪辑(世面上有专门制作这种闪图的软件)建立到属性库中就可以了,在相应的地方调用程序执行就行了。51、问: 请教大师:如何用vb实现mapgis投影变换中的“用户的文件投影转换”的功能;答:使用以下方法,用对话框设置投影变换。Function SetInPara(move As Integer, EnableEdit As Integer = 1) As Boolean     在PRJTRANSCOMLib.PrjT

6、rans对象中52、问:mapgis的帮助中讲的图元号和实体号是一个意思吗?答:GIS里的一些专业术语是有些比较难懂,图元号与实体号是一个意思。53、问: _EditAtt这个函数包含联动的功能吗?我使用_EditAtt不能实现图形的联动,请问还需要使用别的函数吗?答:_EditAtt函数会弹出一个窗体,返回值是这个窗口的句柄。程序实现联动就是这个窗口和图形所在的视图窗口之间互相通信的结果。当在属性编辑窗口中编辑某个记录的字段时会像视图窗口发送消息MGM_FLASH_GRAPH,该消息的wParam参数为属性窗口状态,它可以是下列宏定义之一:BEGIN_EDATT:   表

7、示开始编辑属性。EDITING_ATT:   表示正在编辑属性。END_EDATT    :   表示结束编辑属性。属性窗口发送此状态时,属性窗口没有撤消。一般情况,属性窗口发送的所有MGM_FLASH_GRAPH消息中,开始时为BEGIN_EDATT状态,最后为END_EDATT状态,中间为若干EDITING_ATT状态。lParam参数为指向MGMSG结构的指针,该指针所指结构空间属于属性编辑窗口,MGMSG结构如下:/图元实体信息结构typedef struct      sho

8、rt ai;   /工作区号。       short type; /图元类型,为LIN,PNT,REG,NOD,NET,TBL之一。         long elmi;       /图元号。     ENTITY_MSG;/图元重新显示信息结构typedef ENTITY_MSG MGMSG;通过lParam参数,通知hWnd窗口当

9、前记录对应的图元是什么。当联动状态为断开时,属性窗口不给hWnd窗口发送当前图元消息。当鼠标在视图窗口双击选中一个实体时应该像属性窗口发送GoToAtt的消息,让属性跳转到和空间实体对应的属性处。具体的程序可参考VC开发第五章示例54、问:gisattedit控件问题请问大虾,mapgis组件开发手册中说gisattedit的GotoAtt方法,当参数rcdNo=0时,弹出跳转条件对话框。但是我试过,却无法实现。我把gisattedit与工作区绑定后,仍然不能用,不知有何奥妙?答:Dim area As PntAreaSet area = New PntArea  

10、0;   If area.Load() Then          EditView.PntArea = area          EditView.LinkAttSwitch = True          EditView.AttachAttWorkArea area, area.Type &

11、#160;        GisAttEdit.AttachArea area, area.Type      End IfPrivate Sub EditView_CurAttElement(ByVal lNo As Long)     GisAttEdit.GotoAtt lNoEnd SubPrivate Sub GisAttEdit_CurRcdFldNo(ByVal rcdNo As Long, ByVal fldNo As

12、Integer)     EditView.GotoElement area, rcdNo, area.TypeEnd Sub55、问: 怎么在裁剪的时候不用装入裁剪框文件,而是直接在工作区内用鼠标画一个框子.答:不是在工作区中画一个框子,而是在View上拉一个框子,记录下框子的各个点添加到一个新的工作区中,将这个工作区作为裁减框工作区。裁减完成后可以设置这个工作区的改变标志为false,在关闭它。56、问:用_OverlayPntReg函数,叠加在某一区上的点时,如何不让区文件的属性追加到点属性上!谢答:你可以将点中和区属性有关的一些属性字段删除。57

13、、问:在MAPGIS里如何获得一个区的最长的边,并且怎么知道它的方位答:对每一个区调用_GetReg(.,rdat,len.);double   maxLength=0;double   tempLength;double   maxLi=0;for(i=1;i      if(rdati!=0)     _GetLin(.abs(rdati),dotset,linlen.)tempLength=_CalculateLength(dotset,linlen

14、);if(tempLength>maxLeghth)      maxLeghth=tempLeghth;     maxLi=abs(rdati);      58、问:(MSVC+)如何使用API在SQLSERVER2000的库中建立MAPGIS管理过程?答:出于安全方面的考虑,我们没有将建mapgis管理过程的函数引出,故一定要在平台上进行操作才能建立Mapgis管理过程。59、问:如何建立shapefile与mapgis的颜色对照表?答:sh

15、apefile本身并不带有颜色信息,是需要在arcview中重新赋予的,比如根据属性赋参数,所以也就没有和mapgis间的对照表,包括线型、颜色、子图等。60、问:关于数据源的问题!我是WEBMAPGIS的用户,我想知道对于数据源,是不是必须用SQLSERVER作为数据源,能不能用其他的数据库软件?如ACCESS、FOXPRO等?另外我想问问QLSERVER2000是不是和WINDOWS XP这个操作系统不兼容?我迫切想知道答案,能快点回复我吗?答:对于数据源,可以用Sql Server 和Oracle,对于Access和FroPro不支持,原因很简短,因为后两种数据库软件对大型数据库支持不好

16、,所以我们没有作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)     参数:入口    *l

17、a0 - 线段的起点坐标                  *la1 - 线段的终点坐标                  *lb0 - 另一线段的起点坐标        

18、0;         *lb1 - 另一线段的终点坐标           出口    *xy   - 两直线的交点坐标         返回值 1/0   - 成功/失败用一个双循环,对每一条等值线调用_GetLin得到线的空间数据,其中会返回一个点集,点集中每两个相

19、邻的点形成一条直线,对这每一条直线和直线工作区中的直线调用上述的函数_CalCrossDot即可得到交点坐标。62、问:能够通过区域的边界点的地理坐标求得区域得实际面积吗?答:在projDll中有函数double   WINAPI _CountPolygonArea(D_DOT *xyLst,int len,MAP_PARA *map);可以根据形成多边形的点集以及相应的地图参数计算出实际面积。63、问:用EDITVIEW显示多个点(或线)文件后,怎样激活某一层点(线)文件,并对其修改?答:根据你要修改的那一层的工作区类型,将工作区对象赋给EditView相应的工作区接口。

20、如:要修改某区工作区 regAi,则 EditView.RegArea = regAi64、问:我有一个*.GRD文件,利用什么MAPGIS库的什么函数把它显示为等值线?要是离散的数据,显示之前又是调用什么函数把他规格化呢?答:MAPGIS提供了TIN SDk开发包,可到网站下载.    在Tin_Area.h文件中,    GRD数据可通过_tnTinGridDemTraceContour()函数追踪为等值线.    具体步骤:     (1) 使用_tnGetTinAI(

21、)创建TIN工作区;    (2) 使用_tnLoadFile()装入GRD文件;    (3) 使用_tnTinGridDemTraceContour()进行追踪过程(此函数提供参数设置界面).    离散数据,有两种网格化方法(依数据而定):    (1) 直接使用_tnDistInsGriding()或_tnKringGriding()进行网格化;    (2) 先建立三角网(可使用_tnCreateTinNetInTinArea0),&#

22、160;       再使用_tnTinDatGriding()内插网格化.65、问: 我想将计算得到的一系列离散的数据,画成函数曲线通过对话框显示出来,请问用什么比较好?答:   方法:得到了离散点,调用mapgis的光滑函数(TinBas60.dll,w60LnCps.h),生成线文件,直接放到mapgis提供的显示对象或控件显示即可。66、问:请问QUERY对象查询时,输入条件查询时,“输入日期大于2002-2-1”的条件,应该何格式?我用“日期>2002-2-1"格式后,查询的结果超出查询的

23、范围。答:   对于日期的查询需要将日期用""括起来,如: 日期>2002-2-167、问:请教等值线问题有我一批点的X坐标、Y坐标和观测值,想在自已的程序中画等值线,mapgis里的数字地面模型中有这样的功能,但是我不知道二次开发函数是那些(特别是那三种数据网格化方法的函数)?而且对TIN文件也一点不懂,能不能给介绍下这方面的知识和mapgis的等值线绘制方法,并给发个例子程序?答:首先,要下载TIN SDK的开发库;     在其中Tin_Area.h头文件中,有相关函数的说明可供参考. 

24、60;   由于这一部分的二次开发库还未正式推出,所以目前尚无开发手册,只能针对具体开发函数回答.对于等值线追踪,     对于离散点数据,应按照下列步骤进行:     a.首先按照系统要求的DET数据格式,编辑你的数据(可以参考DTM系统);     b.使用_tnGetTinAI()创建TIN工作区,最后应用_tnDeleteTinAI()删除;     c.使用_tnLoadFile()装入数据文件; 

25、;    d.使用_tnCreateTinNetInTinArea()生成三角网;     e.使用_tnTinTriNetTraceContour()追踪等值线;=2003年12月17日新增=68、问:关于输入区的问题有什么办法,让边输入弧段边生成区,当弧段封闭时,就自动生成一个区。而且输入弧段最好用键盘输入。能实现吗?给段代码吧答:键盘输入点,记录下每一个点的坐标。添加到一个D_Dot数组中,记录下点数。用下面的函数即可将这些点组成弧段并生成区。(当然第一个点和最后一个点应该是同一个点。)long MakeRegFrom

26、Lin(short ai,D_DOT* pddDot,long num) ASSERT(ai>0);/ 添加弧段LIN_INFO LinInfo=0;long LinNo=_AppendLin(ai,pddDot,num,&LinInfo);/ 造区long rdat3=0;rdat0=num+1;rdat1=LinNo;REG_INFO RegInfo=0;long RegNo=_AppendReg(ai,rdat,2,&RegInfo);return RegNo; 69、问:如何在EDITVIEW中加入多个点线区文件?答:Dim pntArea1 As PntArea

27、Dim pntArea2 As PntAreaDim linArea1 As LinAreaDim linArea2 As LinAreaDim regArea1 As RegAreaDim regArea2 As RegAreaPrivate Sub CommandButton1_Click()     Set pntArea1 = New PntArea     Set pntArea2 = New PntArea     Set linArea1 = New LinAr

28、ea     Set linArea2 = New LinArea     Set regArea1 = New RegArea     Set regArea2 = New RegArea         pntArea1.Load     pntArea2.Load     linArea1.Load &

29、#160;   linArea2.Load     regArea1.Load     regArea2.LoadEnd SubPrivate Sub EditView1_MyDraw(ByVal MpDC As Object)         MpDC.DispArea pntArea1     MpDC.DispArea pntArea2   

30、  MpDC.DispArea linArea1     MpDC.DispArea linArea2     MpDC.DispArea regArea1     MpDC.DispArea regArea2End Sub70、问:如何在继承PRJ建立切分视后,向文件添加项目,给个示例吧?答:int flag;char szName256;char dsn32;char owner32;char ftype;char openflag;char filter=&q

31、uot;MapGis线文件(*.wl)0*.wl00"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)        /给工程添加文件,只需要

32、知道该文件的文件名,并不需要打开该文件(装入工作区)       _PRJAppend(GetProject(),szName,NULL,-1);      /PrjListView中显示刚添加进的文件      (CMyPrjListView *)(CChildFrame *)(CFrameWnd *)(AfxGetMainWnd()->GetActiveFrame()->m_wndSplitter.GetPane( 0, 0 )-

33、>ReloadPrjItems();      /PrjEditView复位显示      OnRestoreWindow();71、问:请问如何用VB实现多个图元在EDITVIEW上同时闪烁?答:Dim selset As SelectSet         Set selset = New SelectSet      For i = 1 To lst.Co

34、unt - 1                 /闪烁多个实体,对每一个实体都要 New 一个 SelectItem                 Set sel = New SelectItem       

35、;          sel.Type = gisLIN_ENTITY                     sel.ItemNo = lst.Item(i)            

36、60;    sel.WorkArea = areaObj                 selset.Add sel                 Set sel = Nothing     &

37、#160;       Next         Set EditView.SelectSet = selset         EditView.FlashElement EditView.SelectSet         Set selset = Nothing 72、问:有什办法在GAPGI

38、S内核启动之前修改环境目录?我试过许多种方法,包括在CMyApp:InitInstance()甚至在构造函数CMyApp:CMyApp()中加入相关检查程序行也失败。看着连续蹦出来的几个标着惊叹号的对话框和接下来的死翘翘。真是让人伤心。答:在程序外面包一层不调用mapgis显示相关动态库的程序即可。外层程序仅仅调用win_area.h中的函数来修改目录环境。修改完成后,调用进程函数装入要执行的mapgis程序。73、问:如何根据点的属性(坐标值)调整点的位置?答:如果是单个调整的话,可以利用“定位点”的方式;如果是批量调整,那就把坐标属性导出来然后再根据坐标来生成点。74、问:在用VC+得类库

39、开发时,调用API函数时EDITWND参数如何获取?我是一位刚学MAPgis开发的新手。在用VC+得类库开发时,调用API函数时EDITWND参数如何获取?谢谢,那位能帮助我。答:     现在Mapgis推荐使用类库来进行二次开发,你说的EDITWND已经被封装到CGisView类当中,你直接继承CGisView类即可完成Mapgis图形显示的功能。具体的做法如下:     第一步:建一个Visual C+的项目。打开Visual C+工作环境,选择File菜单New命令,在弹出的对话框中选择Projects页的

40、MFC AppWizard(EXE)项并在Project name编辑框中敲入工程名(例如:engineer),然后单击OK。这样便进入了AppWizard(向导)的第一步,在这一步里用户要选择工程类型,可以选择单文档或多文档工程,初学者最好选单文档类型;单击Next进入向导的第二步、第三步、直到完成(Finish之后OK),这几步用户可以采用默认设置。到此为止一个VC的项目已建好,然后用户的工作就是在这个项目中实现MAPGIS平台中的功能及自己想要的其他功能。     第二步:要完成的工作是将工程中的视图类改为继承CGisView类。具体操作是打开工程

41、中的视图类的两个文件(*View.h、*View.cpp),用Visual C+查找替换功能(Edit菜单下的Replace命令或热键Ctrl+H)分别将这两个文件中的CView字符串全部替换为isView,替换完毕,在工程中视图类的定义前面加入#include “cgisview.h”,这样就完成了CGisView类的继承。     第三步:调用CGisView类中的OnDraw(pDC)函数,以完成绘图工作的预先处理。具体操作方法:在视图类的OnDraw(CDC* pDC)函数中加语句CGisView。添加过程见下面示例:void CEngineer

42、View:OnDraw(CDC* pDC) CEngineerDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCGisView:OnDraw(pDC);      第四步:对Visual C+的工作环境进行必要的设置,这些设置很重要。第1项(字节)设置:选择Project菜单下的Settings命令,在C/C+页面上,Category一栏选择 Code Generation,并将Struct Member Alignme

43、nt设定为1 Byte。第2项(输出目录)设置:把生成的可执行文件输出到MAPGIS动态连接库所在的目录下。选择Project菜单下的Settings命令,在General页面上,Output files一栏,填写mapgis应用程序目录,例如:c:mapgis65program。第3项(包含库)设置:设置头文件及库文件的路径。选择Tools菜单下的Options命令,在Directory页面上,在Show directories for:一栏选择include files,在Directories:下面填写MAPGIS二次开发库头文件目录,例如,C:MAPGIS65include;然后,在此页面上的Show directories for:一栏再选择library files,在Directories:下面填写MAPGIS二次开发库目录,例如,C:MAPGIS65lib。75、问:ZVelStrcT结构,如何赋参数?答:typedef struct     LIN_INFO linf; /等值线图形参数.   REG_INFO rinf; /填充区图形参数.   double&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论