




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 地理信息系统的开发与应用对从事地理信息系统研究和应用的工程技术人员而言, 开发和设计地理信息系统具有两个方面的含义: (1)从底层开发一个通用的地理信息系统, 即通用平台的开发; 从底层开发一个专用的地理信息系统。 实际上, 在专用的地理信息系统功能中应包括通用地理信息系统的所有命令。 (2)在商业化地理信息系统(主要是通用的地理信息系统开发平台 ) 的基础上进行二次开发,完成专用地理信息系统的开发任 务。7 1 地理信息系统通用功能的实现下面结合 VC+ 介绍从底层开发地理信息系统的通用功能需要完成的部分工作及技术方法 (在前面的章节中已经涉及到的内容不作详细介绍) 。1程序设计和开
2、发人员应注意的问题(1)一切工作都要以总体设计为依据。在进行系统变量的设计时,应避免与后期编程中可能出现的变量相同。 解决方法可以采用如下方法: 在具体的变量前加一具有特定含义的前缀, 如 sys_color,sys_ltype。 变量的名称一定合乎英语或中文的拼写习惯。(2)撰写详细的文挡,这又包括详细的文字描述材料和对程序行的注记。对程序行的注记,建议用汉字,不要用英文。对程序行的注记十分重要,这不仅包括子模块的功能,变量的含义,更重要的是对程序行功能的描述;(3)形成良好的编程习惯。这里主要指程序行结构的对称。/ 本程序的功能是修改图形实体的颜色void CWindow:mod_colo
3、r()Cdialog *pDlg;char huge *p_set,huge *p1,huge *p1,huge *p2,*mao,*chr;int ii,i,j,k,n,color,cel_number;int id6,*id_set,type,head_long,total_long,ltype;double x0,y0,r,xmi,ymi,alf,high,xy2;int k1,k2,k3,k4,k5,k6,k7,k8;int m1,m2,m3;long n1,n2,n3,n4;int id_hz,id_ch,x00,y00;id_hz=id_hz_style;/ 保存已有的字体,颜色等
4、参数id_ch=id_ch_style;color=cadcolor;mao=new char2;if(mao=NULL) exit(1);p_set=(char huge *)_halloc(2000,1);/ 记录图形实体在内存中的初始位置if(p_set=NULL) exit(1);id_set=i_dim_alloc(2000,6); / 记录图形实体的类型,颜色,线型等参数strcpy(ex_string,"请选择将被修改颜色的图形实体 (窗口方式请按w键)!");/ 利用鼠标通过交互式的方式选中图形实体。这里cel_number 为得到的图形实体数cel_num
5、ber=find_object(p_set,id_set,ex_string);if(cel_number<0)/ 没有选中图形实体或中断的标志if(cel_number=-30000) cel_number=0;/中断标志,如敲 ESC 键k=0;cel_number=-cel_number;else k=1;/ 选中图形实体的标志满足修改图形实体颜色的条件得到图形实体的颜色保证为 256 色把整数转换为字符串*mao=-1;if(cel_number>0)&&(k=1) /i=id_set01;/if(i<0) i=256+i;/sprintf(ex_st
6、ring,"%d",i); /id_dlg=60; / 对话框的代码pDlg=new CAppDialog("SET_COLOR",NULL); / 通过对话框得到修改后的颜色代码if(pDlg->DoModal()=IDOK)i=strlen(ex_string);if(i>0) cadcolor=atoi(ex_string);/颜色代码else k=0;elsek=0;/ 没有得到新的颜色代码的标志pDlg->EndDialog(IDOK);for(ii=0;ii<cel_number;ii+)p0=p_setii;/ 得到
7、单个图形实体的参数for(j=0;j<6;j+) idj=id_setiij;if(k=1)/ 修改当前图形实体的颜色/ 修改颜色*mao=cadcolor;memcpy(p0+4,mao,1);/ 把新的颜色代码写入图形数据库中/ 下面的程序行的功能是以新的颜色显示图形实体。p1=p0;/ 当前图形实体的首指针type=id0;/ 图形的类型head_long=id3; / 分别为图形实体数据结构头和整个数据结构占的字节数total_long=id4;switch(type)case 1:/ 当前图形实体是二维线p2=p1+head_long;memcpy(&n,p2-2,2)
8、;/ 得到线的数据点数for(i=0;i<n;i+)memcpy(ex_xx+i,p2,8);p2=p2+8;/ 得到二维平面坐标 memcpy(ex_yy+i,p2,8);p2=p2+8;draw_scr(ex_xx,ex_yy,n,cadcolor); / 以新颜色绘制二维线 break;default:break;else un_cell(p,id,1);/ 不修改当前图形实体的颜色,以原有的颜色重新显示。delete mao;/ 释放临时开辟的变量空间_hfree(p_set);i_dim_free(id_set);cadcolor=color;/恢复以前的系统变量值id_hz_
9、style=id_hz;id_ch_style=id_ch;2 .系统体系结构的详细设计主要指输入、存储、操作、分析和输出等子系统或功能模块 之间的关系。这里又主要指数据的传递或调用关系。见图 7-1。手扶跟踪数了化打指敬丁化统计分析DTMm7 of屈性/数招小寸,奈统图缭处加系统/丁加网唱勃打: 缢人扑h:.里成DBMS数抵放据 库J更新子系统 综门分类一 专家判双网络操伶 管理格式交换我败嬴网络分析图7-1通用GIS的系统结构图3 .数据模型和数据结构的设计(1)图形数据库文件的数据结构主要指文件头的结构。包括版本号,纵横比例尺,图形范围,文 件头的字节数(可以固定),图形实体的字节数,线
10、型的字节数等。(2)图形实体的数据结构这次课程要建立的数据结构有:特殊点,结点,弧,多边形,园,园弧,字符,一般线段的数据结构。注意,在字符的数据结构中,应包括中文和西文字体,字符的高 度和宽度,是否覆盖(主要指显示字符后,是否使字符范围内的其它图形消失,最多用一个字节表示)等信息。图 7-2(a)、(b)分别为字 符覆盖和不覆盖的情况。可以把颜色等参数直接存入数据结构中,也可以存储在等放入属 性数据库中。在数据结构或属性数据库中,应包括图形实体显示的顺序。4 .图形实体显示先后顺序的设计设置正确的显示顺序,既可以满足生成合乎要求的图形,也可 以达到加快运算速度的目的。一般情况下,区域填充的图
11、形实体先显 示,再显示弧段、点状图形和圆,最后显示字符。注意,可以利用 VC+铃制园的特性实现对图形的裁剪。如自动删除通过园的线段。如 果线段需要通过园,可以以线段拟合园,而不使用VC+铃制园的专用命令。不规定显示顺序,将产生的主要问题是:如果某一填充区域 在后面显示,那么,它将覆盖在它区域范围内的已经显示的所有图形。5 .建立头文件在头文件中,需定义全局变量。如 GIS.H。#define CM_WP1101# define CM_WP2102# define CM_WP3103# define CM_WP4104# define CM_WP5105# define CM_WP6106#de
12、fine CM_WP7107#define CM_WP8108#define CM_WP9109#define CM_WP10110class Wp:public CWindowfriend CAppDialog;public:Wp();Wp();int map_scale;/ 比例尺/ 图形区域坐下角,右上角坐标double left_x,left_y,right_x,right_y;int id_begin;/ 标识与消息有关的参数int id_fbl_x,id_fbl_y;/ 标识屏幕的分辨率double scr_s_xy; / 标识屏幕坐标与实际坐标间换算的比例系数afx_msg vo
13、id OnWp1();afx_msg void OnWp2();afx_msg void OnWp3();afx_msg void OnWp4();afx_msg void OnWp5();afx_msg void OnWp6();afx_msg void OnWp7();afx_msg void OnWp8();afx_msg void OnWp9();afx_msg void OnWp10();afx_msg void OnWp11();afx_msg void OnLButtonDown(UINT nFlags,CPoint point);afx_msg void OnLButtonUp
14、(UINT nFlags,CPoint point);afx_msg void OnRButtonDown(UINT nFlags,CPoint point);afx_msg void OnMouseMove(UINT nFlags,CPoint point);afx_msg void OnKeyDown( UINT nChar,UINT nRepCnt,UINT nFlags)afx_msg void OnKeyUp( UINT nChar,UINT nRepCnt,UINT nFlags);DECLARE_MESSAGE_MAP();6 菜单和对话框的设计这些内容都包括在资源文件中。#in
15、clude <windows.h>#include <afxwin.h>#include <afxres.h>#include "gis.h"/ 对话框ID_NET_LINK DIALOG DISCARDABLE LOADONCALL PURE MOVEABLE 90,30,95,100STYLE WS_POPUP|WS_CLIPSIBLINGS|WS_CAPTION|WS_SYSMENU|DS_MODALFRAMECAPTION选择显示汉字白特殊类型 "BEGINGROUPBOX " 网络路径 ",ID_S
16、FILL_GRP,10,10,75,50,WS_GROUPCONTROL " 本地机",ID_NFILL_RBT,"Button",BS_AUTORADIOBUTTON,20,20,55,16CONTROL " 服务器",ID_YFILL_RBT,"Button",BS_AUTORADIOBUTTON,20,40,55,16CONTROL " 确定 ",IDOK,"BUTTON",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_DEFPUSHBUTTON,
17、15,70,30,20CONTROL " 取消 ",IDCANCEL,"BUTTON",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON,51,70,30,20END/ 菜单MENU MENU LOADONCALL MOVEABLE PURE DISCARDABLEBEGINPOPUP " 存取图形 "BEGINMenuItem " 调入图形 ",CM_WP1MENUITEM SEPARATORMenuItem " 调入图形为 ",CM_WP2*MENUI
18、TEM SEPARATORMenuItem " 保存图形 ",CM_WP3MENUITEM SEPARATORMenuItem " 保存图形为 ",CM_WP4MENUITEM SEPARATORMenuItem " 打印图形 ",CM_WP5MENUITEM SEPARATORMenuItem " 退出 ",CM_WP6ENDPOPUP " 基本绘图 "BEGINMenuItem "绘制折线",CM_WP7MenuItem "绘制曲线",CM_WP8Me
19、nuItem "绘制字符",CM_WP9ENDPOPUP " 图形编辑 "BEGINMenuItem "编辑线划",CM_WP10MenuItem "删除图形",CM_WP11MenuItem "移动图形",CM_WP12MenuItem "复制图形",CM_WP13MenuItem "旋转图形",CM_WP14MenuItem "延长图形",CM_WP15MenuItem "裁剪图形",CM_WP16MenuIte
20、m "截断图形",CM_WP17MENUITEM SEPARATORMenuItem "修改图层",CM_WP18MenuItem "修改属性",CM_WP19MenuItem "修改颜色",CM_WP20MenuItem "修改线型",CM_WP21MenuItem "修改线宽",CM_WP22MenuItem "修改字体",CM_WP23MENUITEM SEPARATORMenuItem "综合查询",CM_WP24MENUITE
21、M SEPARATORMenuItem "恢复图形",CM_WP25ENDPOPUP " 缩放或查询 "BEGINMenuItem "重新显示",CM_WP26MenuItem "放大显示",CM_WP27MenuItem "缩小显示",CM_WP28MenuItem "原图显示",CM_WP29MenuItem "全屏显示",CM_WP30MenuItem "最小显示",CM_WP31MENUITEM SEPARATORMENUITE
22、M " 移动窗口 ",CM_WP32MENUITEM SEPARATORMENUITEM "量测距离和方位”,CM_WP33ENDPOPUP "专业命令"BEGINMenuitem "自动生成拓扑关系”,CM_WP34Menuitem "交互式生成拓扑关系”,CM_WP35Menuitem "结点的一致性检查”,CM_WP36ENDPOPUP "图形设置"BEGINMenuitem "颜色设置",CM_WP37Menuitem " 线型设置",CM_WP3
23、8Menuitem " 图层设置",CM_WP39Menuitem " 图形范围",CM_WP40Menuitem " 图层选择",CM_WP41 MENUiTEM SEPARATORMENUiTEM "捕捉方式",CM_WP42 MENUiTEM SEPARATORMenuitem "填充方式",CM_WP43MENUiTEM SEPARATORMenuitem "设置字体",CM_WP447-3和图7-4END根据上述资源文件得到的对话框和菜单如图选择显示汨字的特殊类型网
24、络路径.服务器|确定|取消图7-3对话框存取图添 基本整图 图形编辑 箱改或查询 专业绘图 图形设置 弱箍相划 删除酬 移动触复制酬 旋转琳 延长期 薪典跚 截断邮阳外部图删除的例,修改的层 修改局生 修改颜色 修改侬 修改线宽恢复哪图7-4通过资源文件生成的菜单7.线型 下面介绍的是一种较为通用的设计方法。* 大车路,0.15,0 / 线型的中文名称,线宽,颜色 L6.23,8.0,-2.0 /线型的内部代码,线型参数描述* 依比例尺白乡村路,0.15,0L6.24-1,4.0,-1.0,0* 不依比例尺的乡村路,0.4 L6.24-2,8.0,-2.0* 小路,0.3,0L6.25,4.0
25、,-1.0* 内部道路,0.15,0 L6.26,1.5,-0.5* 县自治县旗县级市界,0.3,0L9.4,5.0,-1.5,$9.4,-1.58.颜色从节约存储空间的角度出发,在图形或属性数据库中存储的是颜色代码,而非具体的RGB®。这就需要建立一个颜色表。在下面的颜 色表中,可以把记录号作为颜色的代码。000002550255 0255 0255255 000255 255128128128 2242241282242241602242241922242242249通过消息获取相关信息(1) 对 鼠标和键盘的操作#include <stdio.h>#include
26、<stdlib.h>#include <math.h>#include <afxwin.h>#include <afxext.h>#include "gis.h"extern double left_x,left_y,right_x,right_y,scr_s_xy;extern int id_osnap,arr_dlt,arr_i,arr_j,id_key,key_value;extern void scr_xy(double yx2);extern void real_xy(double xy2,int i,int j);
27、extern char *ex_string;/ 对鼠标进行操作, xy 记录鼠标所在位置的平面坐标int CWindow:arrow2(double xy2)CClientDC dc(this);intid_right,id,r,i,i1,j1,i2,j2,i3,j3,k,id_digi,idid;MSG Msg;id_right=0; / 非鼠标右键的标志i1=arr_i;j1=arr_j; / 鼠标的当前位置i3=arr_i;j3=arr_j;key_value=0; / 没有敲击键盘的标志while(GetMessage(&Msg,NULL,0,0)/ 循环并实时获取消息 Tr
28、anslateMessage(&Msg);DispatchMessage(&Msg);if(Msg.message=WM_LBUTTONUP) break;佩标左键退出 if(Msg.message=WM_RBUTTONDOWN)柝右键退出 id_right=1; / 右键的标志 break;if(Msg.message=WM_KEYUP) break;/ 敲击键盘键退出i3=arr_i;/ 最新的鼠标位置 j3=arr_j;/key_value 为键盘的 ASCII 码值if(key_value!=0)/ 为键盘而非鼠标switch(key_value) case 87:/
29、Wid=3;break;case 67:/ Cid=4; break;case 27:/ ESCid=5; break; case 85:/ Uid=6;break;case 13:/ ENTERid=7;break;case 76: /Lid=17; break;case 77: / Mid=8; break;case 65: / Aid=9;/Bbreak;case 66:id=20; break;case 78:/ Nid=10; break;case 84:/ Tid=12; break;case 68:/ Did=13; break;case 73:/ Iid=14; break;c
30、ase 81:/ Qid=15; break;case 80:/ Pid=16; break;default:id=0; break; return id;(2) 鼠 标和键盘消息的传递及相关功能的实现/GIS 的一个功能void Wp:OnWp163() / 保存图形 CString StrText;id_begin=0;save_map();id_begin=263;StrText=" 子程序运行结束!"m_wndStatusBar.SetPaneText(0,StrText);/ 按鼠标右键,重复执行刚刚执行完的命令void Wp:OnRButtonDown(UINT
31、 nFlags,CPoint point)id_key=0; / 表示当前操作的设备是鼠标而非键盘if(id_begin!=0) SendMessage(WM_COMMAND,id_begin); / 按下鼠标左键 void Wp:OnLButtonDown(UINT nFlags,CPoint point) / 鼠标左键弹起void Wp:OnLButtonUp(UINT nFlags,CPoint point)arr_i=point.x; arr_j=point.y; id_key=0;/ 按下键盘上的键void Wp:OnKeyDown(UINT nChar,UINT nRepCnt,U
32、INT nFlags)/ 键盘键弹起void Wp:OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags)id_key=1;key_value=nChar; / 键盘键的值if(id_begin!=0) SendMessage(WM_COMMAND,id_begin);/ 移动鼠标void Wp:OnMouseMove(UINT nFlags,CPoint point)CString StrText;char string200,str30;double xy2;int ii;arr_i=point.x;/ 鼠标在屏幕上的坐标arr_j=point.y;10.
33、 选中或捕捉图形实体的两种算法( 1 ) 通 过点捕捉图形实体算法的功能是通过鼠标得到屏幕上的图形实体。算法的主要步骤为:1) 移动鼠标至将要选中的图形实体上(对于线划图形、圆和弧,鼠标的箭头或十字丝位于图形实体上, 而对于字符, 则位于刚好包住字符串的矩形范围内) ;2) 按鼠标左键,得到屏幕坐标3) 把屏幕坐标换算为实际的图形坐标;4) 程序进入循环体,与调入内存中的图形数据库中的内容进行比较,以得到满足要求的图形实体。a)如果鼠标点在刚好包住图形实体的矩形(数据结构或属性数据库中标识图形范围的外接矩形) 范围内, 那么当前图形可能是将要选中的图形实体;b)对于线划图形,鼠标点到线段的垂直
34、最短距离小于4个(程序员可以自己定义)象素,那么当前线段被选中;对于圆和圆弧,鼠标点与圆心的距离小于 4 个(程序员可以自己定义)象素,那么圆或圆弧被选中;对于字符,鼠标点位于字符串范围内(进行比较时,需根据字符串的左下角坐标, 字符高度, 角度换算出刚好包住字符串的矩形) ,那么,字符串被选中;c) 用 屏幕背景色绘制被选中的图形实体,再以灰色显示之;d) 把被选中图形实体在内存中的位置(指针)存入有关数组或指针中。5) 重复上述步骤,得到所有应被选中的图形实体;6) 按鼠标右键,结束对图形实体的选择;7) 把图形实体的参数传给其它功能模块,如编辑、删除等。( 2 ) 通 过窗口方式捕捉图形
35、实体1) 正 选(利用鼠标先得到窗口的左下角或左上角,再得到右上角或右下角)只有那些图形实体的外接矩形完全位于窗口范围内,该图形才能被选中。2) 反选(利用鼠标先得到窗口的右下角或右上角,再得到左上角或左下角)只要图形实体的外接矩形部分位于窗口范围内,该图形就可以被选中。11. 图形数据库文件头的操作如前所述,文件头中只保存全局变量等参数。假设文件头是定长的,如 4000字节,保存图形数据库的指针为 beg_p, 图形的比例尺为长整型,且位于beg_p+96处,那么,我们对图形比例尺的操作方法为:(1) 保存比例尺:memcpy(beg_p+96,&map_scale,4);(2) 读
36、取比例尺:memcpy(&map_scale,beg_p+96,4);12. 对文件的存取下面是把图形内容保存到硬盘上的一段程序。#include <stdio.h>#include <io.h>#include <memory.h>#include <string.h>#include <malloc.h>#include <stdlib.h>#include <afxwin.h>#include <afxext.h>#include "mine_mfc.h"/ 这些参
37、数都是全局变量extern FILE *mapfp;extern unsigned long end_id;/ 图形数据库的总字节数/ 图形区域 (x,y,z) 的最大最小值( 刚好包住图形的矩形)extern double map_xmi,map_ymi,map_zmi,map_xma,map_yma,map_zma;extern double left_x,left_y,right_x,right_y;/ 图形视见区的大小extern double whole_alf;/ 图形的旋转角extern char huge *beg_p,huge *end_p;/图形数据库的首尾指针extern
38、 char curpath40;/ 执行程序的路径extern char *ex_string;/ 操作字符的公用指针extern char file_head20,*set_layer;/记录文件名称和层信息extern in dis_layer2003,id_layer,id_save_as;/记录层信息等参数extern long map_scale;/ 比例尺/ 把内存中的图形数据库内容保存到硬盘上void CWindow:end_map()/ 定义各种临时变量long i,j,k;int ii,jj,mao1;unsigned int byte_n=2048;char huge *l
39、ly,huge *msb,*mao,*msj;int mao220=0,0,-1,0,-1,-1,0,-1,-1,0,-1,0,-1,0,-1,0,0,-1,0,0;double x0,y0;/ 开始处理图形if(id_save_as=1)/ 当前操作是”保存图形为 ” ,而非 ”保存图形 ”/* 检查文件是否存在*/strcpy(ex_string,curpath);/ strcat(ex_string,"mgt"); strcat(ex_string,file_head);/ strcat(ex_string,".mgt");/判断当前文件是否存在得
40、到路径文件名得到包括路径在内的文件名if(_access(ex_string, 0)!=-1)strcat(ex_string," 文件已经存在, 是否覆盖它 ");if(MessageBox(ex_string,"询问 ",MB_YESNO|MB_ICONQUESTION)=IDY)E Selse return;/ 返回/当前文件可以保存msj=new char1;if(msj=NULL) exit(1);strcpy(ex_string,curpath);strcat(ex_string,"mgt");strcat(ex_stri
41、ng,file_head);strcat(ex_string,".mgt");/ 得到文件全名 mapfp=fopen(ex_string,"wb");/ 以二进制形式保存图形 if(mapfp=NULL) exit(1);/ 开始保存部分全局变量lly=beg_p+96;memcpy(lly,&map_scale,4);/ 保存比例尺 lly=beg_p+100;mao=(char *)malloc(2048);if(mao=NULL) exit(1); / 临时指针strcpy(beg_p," 北京大学 ");memcpy
42、(lly,&map_xmi,8);lly=lly+8; memcpy(lly,&map_ymi,8);lly=lly+8; memcpy(lly,&map_zmi,8);lly=lly+8; memcpy(lly,&map_xma,8);lly=lly+8; memcpy(lly,&map_yma,8);lly=lly+8; memcpy(lly,&map_zma,8);lly=lly+8;memcpy(lly,&left_x,8);lly=lly+8;memcpy(lly,&left_y,8);lly=lly+8;memcpy(
43、lly,&right_x,8);lly=lly+8;memcpy(lly,&right_y,8);lly=beg_p+508; end_id=end_p-beg_p;/ 图形数据库的总字节数 memcpy(lly,&end_id,4);/ 保存 lly=beg_p;/ 开始对文件进行加密 , 加密的单位为 20 字节while(lly+20)<end_p)for(i=0;i<20;i+)memcpy(msj,lly,1);mao1=*msj;mao1=mao1+mao2i;/ 在图形内容上加减一个数*msj=mao1;memcpy(lly,msj,1);ll
44、y+;/ 保存加密后的内容lly=beg_p;j=end_id/2048;/for(i=0;i<j;i+)k=i*2048;/ 每一次保存2048字节fmemcpy(mao,lly,byte_n);fseek(mapfp,k,SEEK_SET);fwrite(mao,byte_n,1,mapfp);lly=lly+2048;i=2048*j;byte_n=(unsigned int)(end_id-i);if(byte_n!=0)/ 保存被 2048整除的余数字节fmemcpy(mao,lly,byte_n);fseek(mapfp,i,SEEK_SET);fwrite(mao,byte
45、_n,1,mapfp);/ 保存完毕fclose(mapfp);free(mao);delete msj;对图形文件的读取与上面的操作方法类似, 只不过应用的命令是读取数据而不是保存数据。当前,读入数据后需要解密。13. 对图形实体内容的保存图形实体包括点、线、面等内容。这里介绍对一般曲线的保存。下面介绍的方法不是面向对象的,而是一般的保存方法。#include <stdio.h>#include <memory.h>#include <string.h>#include <math.h>#include <conio.h>#incl
46、ude <afxwin.h>#include <afxext.h>#include "mine_mfc.h"extern char huge *beg_p,huge *end_p;extern char cadlayer35,cadatt35;/ 记录层名和一般属性extern char *set_layer;extern int id_layer,dis_layer2003;extern long map_scale;/ 计算 (x,y) 序列的最大最小值extern void xy_min_max(int n,double *x,double *
47、y,double xy22);/ 保存诸如光滑的等值线等曲线/n: 原始 (没有拟合 )数据点个数void CWindow:m_gline2d(int n,double *x,double *y,double *z)unsigned int head_long,total_long;/ 临时变量int i,j,ii,k,kk,kkk,mm;int layer_long,att_long;double x0,y0,x1,y1,x2,y2,xy22,d1,d2,d3,d4;char *mao;/ 去掉相邻且相等的点 ( 避免曲线拟合时出错 )for(k=0;k<n-1;k+)x0=*(x+k
48、);y0=*(y+k);x1=*(x+k+1);y1=*(y+k+1);x1=hypot(x0-x1,y0-y1);if(x1<0.01)/ 两点之间相差 0.01 米就认为相等for(kk=k;kk<n-1;kk+)*(x+kk)=*(x+kk+1);*(y+kk)=*(y+kk+1);*(z+kk)=*(z+kk+1);n-;k-;if(n<2) return; / 无法成为一条线段,不保存mao=new char1;if(mao=NULL) exit(1);xy_min_max(n,x,y,xy); / 得到刚好包住图形的矩形的左下, 右上角坐标 (最小最大值)laye
49、r_long=strlen(cadlayer);/ 层名的长度att_long=strlen(cadatt);/ 属性的长度head_long=48+layer_long;/ 结构头的长度total_long=head_long+24*n+att_long;/ 结构的总长度*mao=5; / 线的类型memcpy(end_p,mao,1);/ 保存图形实体的类型end_p+;/ 往下移动一个指针*mao=head_long;memcpy(end_p,mao,1); / 保存结构头的长度end_p+;memcpy(end_p,&total_long,2);/ 保存结构的总长度end_p=
50、end_p+2;*mao=cadcolor;memcpy(end_p,mao,1);/ 保存颜色end_p+;*mao=cadltype;memcpy(end_p,mao,1);/ 保存线型end_p+;memcpy(end_p,&xy00,8);end_p=end_p+8; / 保存矩形左下角、右上角的数值memcpy(end_p,&xy01,8);end_p=end_p+8;memcpy(end_p,&xy10,8);end_p=end_p+8;memcpy(end_p,&xy11,8);end_p=end_p+8;memcpy(end_p,cadlayer
51、,layer_long);/ 保存图层end_p=end_p+layer_long;memcpy(end_p,&cadwidth,8);/ 保存线的宽度或厚度end_p=end_p+8;memcpy(end_p,&n,2);/ 保存数据点数end_p=end_p+2;/ 结构头结束,开始保存数据点坐标for(ii=0;ii<n;ii+)memcpy(end_p,x+ii,8);end_p=end_p+8; /xmemcpy(end_p,y+ii,8);end_p=end_p+8; /ymemcpy(end_p,z+ii,8);end_p=end_p+8; /zmemcpy
52、(end_p,cadatt,att_long);/ 如等值线值等属性值end_p=end_p+att_long;delete mao;/ 结束(1) 在上面的例子中, 结构的总字节数等于结构头, (x,y,z) 坐标,属性所占字节数的总和。即:total_long=head_long+n*24+att_long( 1)(2) 式中, n 为数据点数, 24 为每一 (x,y,z) 坐标对占的字节数( 8字节 / 浮点数) 。(3) 文件头 head_long 的字节数等于固定的字节数与变长的层名的综合,即:head_long=1( 图形实体的类型)+1( 结构头的字节数)+2( 总字节数)+1
53、( 颜色)+1( 线型)+32( 图 形范 围 )+layer_long( 层 名 的 长度 )+8( 线的宽度 )+2( 数据点数 )=48+layer_long虽然数据结构 中 layer_long,att_long 是变长的 , 但通过 head_long,total_long 可以精确定位所有的参数。所以系统能够实现对图形实体的操作。14. 编制数字化仪接口程序我们采用最新的与wintab 有关的技术编制数字化仪接口程序。有关的主要文件有七个:(1) Msgpack.h(2) pktdef.h(3) wintab.h(4) wintab.lib(5) wintab.dll(6) win
54、tab32.dll(7) wintabx.h在具体编程时,需把(5) 、 ( 6)考入c:windowssystem 下,其它文件考入源程序目录下。 另外, 需把 wintab.lib 加入工程文件中。(1) 实现程序接口的技术方法1) 在头文件中定义数字化的消息。如: GIS.Hclass Wp:public CWindowfriend CAppDialog;public:Wp();Wp();protected:afx_msg void OnWp1();afx_msg void OnWp2();afx_msg void OnWp3();afx_msg void OnWp162();afx_m
55、sg long OnWtPacket( UINT nFlags,LONG id ); / 数字化仪的消息afx_msg void OnLButtonDown(UINT nFlags,CPoint point);afx_msg void OnLButtonUp(UINT nFlags,CPoint point);afx_msg void OnRButtonDown(UINT nFlags,CPoint point);afx_msg void OnMouseMove(UINT nFlags,CPoint point);afx_msg void OnKeyDown( UINT nChar,UINT
56、nRepCnt,UINT nFlags);afx_msg void OnKeyUp( UINT nChar,UINT nRepCnt,UINT nFlags);afx_msg void HandleTablBtn();afx_msg void HandleSectBtn();2) 实现对消息传递(a) 完善的头文件#include <assert.h>#include <afxext.h>#include <math.h>#include <afxwin.h>#include <malloc.h>#include <memory
57、.h>#include <stdio.h>#include <string.h>#include <conio.h>#include <stdlib.h>#include <direct.h>/ 下面都与数字化仪有关#include "msgpack.h"#include "wintab.h"#define PACKETDATA( pk_x | pk_y | pk_buttons | pk_normal_pressure)#define PACKETMODPEK_BUTTONS#include "pktdef.h"(b) 消息传递机制long Wp:OnWtPacket(UINT nFla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物医药研发项目融资及成果转化合同
- 高端电商品牌专供瓦楞纸箱长期采购协议书
- 智能驾驶体验场租赁及配套设施服务协议
- 支付材料款协议书
- 抖音账号运营权分割及收益分配合作协议
- 普洱茶订货协议书
- 周星驰签下协议书
- 电商平台商品展示与大数据分析应用合作协议
- 承包建猪场协议书
- 给饭店供货协议书
- 路基土石方施工作业指导书
- 幼儿园班级幼儿图书目录清单(大中小班)
- 四川省自贡市2023-2024学年八年级下学期期末数学试题
- 山东省济南市历下区2023-2024学年八年级下学期期末数学试题
- 校园食品安全智慧化建设与管理规范
- DL-T5704-2014火力发电厂热力设备及管道保温防腐施工质量验收规程
- 检验科事故报告制度
- 分包合同模板
- 中西文化鉴赏智慧树知到期末考试答案章节答案2024年郑州大学
- 英语定位纸模板
- eras在妇科围手术
评论
0/150
提交评论