版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第七章 地理信息系統(tǒng)的開發(fā)與應(yīng)用對從事地理信息系統(tǒng)研究和應(yīng)用的工程技術(shù)人員而言, 開發(fā)和設(shè)計(jì)地理信息系統(tǒng)具有兩個方面的含義: (1)從底層開發(fā)一個通用的地理信息系統(tǒng), 即通用平臺的開發(fā); 從底層開發(fā)一個專用的地理信息系統(tǒng)。 實(shí)際上, 在專用的地理信息系統(tǒng)功能中應(yīng)包括通用地理信息系統(tǒng)的所有命令。 (2)在商業(yè)化地理信息系統(tǒng)(主要是通用的地理信息系統(tǒng)開發(fā)平臺 ) 的基礎(chǔ)上進(jìn)行二次開發(fā),完成專用地理信息系統(tǒng)的開發(fā)任 務(wù)。7 1 地理信息系統(tǒng)通用功能的實(shí)現(xiàn)下面結(jié)合 VC+ 介紹從底層開發(fā)地理信息系統(tǒng)的通用功能需要完成的部分工作及技術(shù)方法 (在前面的章節(jié)中已經(jīng)涉及到的內(nèi)容不作詳細(xì)介紹) 。1程序設(shè)計(jì)和開
2、發(fā)人員應(yīng)注意的問題(1)一切工作都要以總體設(shè)計(jì)為依據(jù)。在進(jìn)行系統(tǒng)變量的設(shè)計(jì)時,應(yīng)避免與后期編程中可能出現(xiàn)的變量相同。 解決方法可以采用如下方法: 在具體的變量前加一具有特定含義的前綴, 如 sys_color,sys_ltype。 變量的名稱一定合乎英語或中文的拼寫習(xí)慣。(2)撰寫詳細(xì)的文擋,這又包括詳細(xì)的文字描述材料和對程序行的注記。對程序行的注記,建議用漢字,不要用英文。對程序行的注記十分重要,這不僅包括子模塊的功能,變量的含義,更重要的是對程序行功能的描述;(3)形成良好的編程習(xí)慣。這里主要指程序行結(jié)構(gòu)的對稱。/ 本程序的功能是修改圖形實(shí)體的顏色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、參數(shù)id_ch=id_ch_style;color=cadcolor;mao=new char2;if(mao=NULL) exit(1);p_set=(char huge *)_halloc(2000,1);/ 記錄圖形實(shí)體在內(nèi)存中的初始位置if(p_set=NULL) exit(1);id_set=i_dim_alloc(2000,6); / 記錄圖形實(shí)體的類型,顏色,線型等參數(shù)strcpy(ex_string,"請選擇將被修改顏色的圖形實(shí)體 (窗口方式請按w鍵)!");/ 利用鼠標(biāo)通過交互式的方式選中圖形實(shí)體。這里cel_number 為得到的圖形實(shí)體數(shù)cel_num
5、ber=find_object(p_set,id_set,ex_string);if(cel_number<0)/ 沒有選中圖形實(shí)體或中斷的標(biāo)志if(cel_number=-30000) cel_number=0;/中斷標(biāo)志,如敲 ESC 鍵k=0;cel_number=-cel_number;else k=1;/ 選中圖形實(shí)體的標(biāo)志滿足修改圖形實(shí)體顏色的條件得到圖形實(shí)體的顏色保證為 256 色把整數(shù)轉(zhuǎn)換為字符串*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;/ 沒有得到新的顏色代碼的標(biāo)志pDlg->EndDialog(IDOK);for(ii=0;ii<cel_number;ii+)p0=p_setii;/ 得到
7、單個圖形實(shí)體的參數(shù)for(j=0;j<6;j+) idj=id_setiij;if(k=1)/ 修改當(dāng)前圖形實(shí)體的顏色/ 修改顏色*mao=cadcolor;memcpy(p0+4,mao,1);/ 把新的顏色代碼寫入圖形數(shù)據(jù)庫中/ 下面的程序行的功能是以新的顏色顯示圖形實(shí)體。p1=p0;/ 當(dāng)前圖形實(shí)體的首指針type=id0;/ 圖形的類型head_long=id3; / 分別為圖形實(shí)體數(shù)據(jù)結(jié)構(gòu)頭和整個數(shù)據(jù)結(jié)構(gòu)占的字節(jié)數(shù)total_long=id4;switch(type)case 1:/ 當(dāng)前圖形實(shí)體是二維線p2=p1+head_long;memcpy(&n,p2-2,2)
8、;/ 得到線的數(shù)據(jù)點(diǎn)數(shù)for(i=0;i<n;i+)memcpy(ex_xx+i,p2,8);p2=p2+8;/ 得到二維平面坐標(biāo) 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);/ 不修改當(dāng)前圖形實(shí)體的顏色,以原有的顏色重新顯示。delete mao;/ 釋放臨時開辟的變量空間_hfree(p_set);i_dim_free(id_set);cadcolor=color;/恢復(fù)以前的系統(tǒng)變量值id_hz_
9、style=id_hz;id_ch_style=id_ch;2 .系統(tǒng)體系結(jié)構(gòu)的詳細(xì)設(shè)計(jì)主要指輸入、存儲、操作、分析和輸出等子系統(tǒng)或功能模塊 之間的關(guān)系。這里又主要指數(shù)據(jù)的傳遞或調(diào)用關(guān)系。見圖 7-1。手扶跟蹤數(shù)了化打指敬丁化統(tǒng)計(jì)分析DTMm7 of屈性/數(shù)招小寸,奈統(tǒng)圖繚處加系統(tǒng)/丁加網(wǎng)唱勃打: 縊人撲h:.里成DBMS數(shù)抵放據(jù) 庫J更新子系統(tǒng) 綜門分類一 專家判雙網(wǎng)絡(luò)操伶 管理格式交換我敗嬴網(wǎng)絡(luò)分析圖7-1通用GIS的系統(tǒng)結(jié)構(gòu)圖3 .數(shù)據(jù)模型和數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)(1)圖形數(shù)據(jù)庫文件的數(shù)據(jù)結(jié)構(gòu)主要指文件頭的結(jié)構(gòu)。包括版本號,縱橫比例尺,圖形范圍,文 件頭的字節(jié)數(shù)(可以固定),圖形實(shí)體的字節(jié)數(shù),線
10、型的字節(jié)數(shù)等。(2)圖形實(shí)體的數(shù)據(jù)結(jié)構(gòu)這次課程要建立的數(shù)據(jù)結(jié)構(gòu)有:特殊點(diǎn),結(jié)點(diǎn),弧,多邊形,園,園弧,字符,一般線段的數(shù)據(jù)結(jié)構(gòu)。注意,在字符的數(shù)據(jù)結(jié)構(gòu)中,應(yīng)包括中文和西文字體,字符的高 度和寬度,是否覆蓋(主要指顯示字符后,是否使字符范圍內(nèi)的其它圖形消失,最多用一個字節(jié)表示)等信息。圖 7-2(a)、(b)分別為字 符覆蓋和不覆蓋的情況??梢园杨伾葏?shù)直接存入數(shù)據(jù)結(jié)構(gòu)中,也可以存儲在等放入屬 性數(shù)據(jù)庫中。在數(shù)據(jù)結(jié)構(gòu)或?qū)傩詳?shù)據(jù)庫中,應(yīng)包括圖形實(shí)體顯示的順序。4 .圖形實(shí)體顯示先后順序的設(shè)計(jì)設(shè)置正確的顯示順序,既可以滿足生成合乎要求的圖形,也可 以達(dá)到加快運(yùn)算速度的目的。一般情況下,區(qū)域填充的圖
11、形實(shí)體先顯 示,再顯示弧段、點(diǎn)狀圖形和圓,最后顯示字符。注意,可以利用 VC+鈴制園的特性實(shí)現(xiàn)對圖形的裁剪。如自動刪除通過園的線段。如 果線段需要通過園,可以以線段擬合園,而不使用VC+鈴制園的專用命令。不規(guī)定顯示順序,將產(chǎn)生的主要問題是:如果某一填充區(qū)域 在后面顯示,那么,它將覆蓋在它區(qū)域范圍內(nèi)的已經(jīng)顯示的所有圖形。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;/ 比例尺/ 圖形區(qū)域坐下角,右上角坐標(biāo)double left_x,left_y,right_x,right_y;int id_begin;/ 標(biāo)識與消息有關(guān)的參數(shù)int id_fbl_x,id_fbl_y;/ 標(biāo)識屏幕的分辨率double scr_s_xy; / 標(biāo)識屏幕坐標(biāo)與實(shí)際坐標(biāo)間換算的比例系數(shù)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 菜單和對話框的設(shè)計(jì)這些內(nèi)容都包括在資源文件中。#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 " 網(wǎng)絡(luò)路徑 ",ID_S
16、FILL_GRP,10,10,75,50,WS_GROUPCONTROL " 本地機(jī)",ID_NFILL_RBT,"Button",BS_AUTORADIOBUTTON,20,20,55,16CONTROL " 服務(wù)器",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 " 調(diào)入圖形 ",CM_WP1MENUITEM SEPARATORMenuItem " 調(diào)入圖形為 ",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 "復(fù)制圖形",CM_WP13MenuItem "旋轉(zhuǎn)圖形",CM_WP14MenuItem "延長圖形",CM_WP15MenuItem "裁剪圖形",CM_WP16MenuIte
20、m "截?cái)鄨D形",CM_WP17MENUITEM SEPARATORMenuItem "修改圖層",CM_WP18MenuItem "修改屬性",CM_WP19MenuItem "修改顏色",CM_WP20MenuItem "修改線型",CM_WP21MenuItem "修改線寬",CM_WP22MenuItem "修改字體",CM_WP23MENUITEM SEPARATORMenuItem "綜合查詢",CM_WP24MENUITE
21、M SEPARATORMenuItem "恢復(fù)圖形",CM_WP25ENDPOPUP " 縮放或查詢 "BEGINMenuItem "重新顯示",CM_WP26MenuItem "放大顯示",CM_WP27MenuItem "縮小顯示",CM_WP28MenuItem "原圖顯示",CM_WP29MenuItem "全屏顯示",CM_WP30MenuItem "最小顯示",CM_WP31MENUITEM SEPARATORMENUITE
22、M " 移動窗口 ",CM_WP32MENUITEM SEPARATORMENUITEM "量測距離和方位”,CM_WP33ENDPOPUP "專業(yè)命令"BEGINMenuitem "自動生成拓?fù)潢P(guān)系”,CM_WP34Menuitem "交互式生成拓?fù)潢P(guān)系”,CM_WP35Menuitem "結(jié)點(diǎn)的一致性檢查”,CM_WP36ENDPOPUP "圖形設(shè)置"BEGINMenuitem "顏色設(shè)置",CM_WP37Menuitem " 線型設(shè)置",CM_WP3
23、8Menuitem " 圖層設(shè)置",CM_WP39Menuitem " 圖形范圍",CM_WP40Menuitem " 圖層選擇",CM_WP41 MENUiTEM SEPARATORMENUiTEM "捕捉方式",CM_WP42 MENUiTEM SEPARATORMenuitem "填充方式",CM_WP43MENUiTEM SEPARATORMenuitem "設(shè)置字體",CM_WP447-3和圖7-4END根據(jù)上述資源文件得到的對話框和菜單如圖選擇顯示汨字的特殊類型網(wǎng)
24、絡(luò)路徑.服務(wù)器|確定|取消圖7-3對話框存取圖添 基本整圖 圖形編輯 箱改或查詢 專業(yè)繪圖 圖形設(shè)置 弱箍相劃 刪除酬 移動觸復(fù)制酬 旋轉(zhuǎn)琳 延長期 薪典跚 截?cái)噜]陽外部圖刪除的例,修改的層 修改局生 修改顏色 修改儂 修改線寬恢復(fù)哪圖7-4通過資源文件生成的菜單7.線型 下面介紹的是一種較為通用的設(shè)計(jì)方法。* 大車路,0.15,0 / 線型的中文名稱,線寬,顏色 L6.23,8.0,-2.0 /線型的內(nèi)部代碼,線型參數(shù)描述* 依比例尺白鄉(xiāng)村路,0.15,0L6.24-1,4.0,-1.0,0* 不依比例尺的鄉(xiāng)村路,0.4 L6.24-2,8.0,-2.0* 小路,0.3,0L6.25,4.0
25、,-1.0* 內(nèi)部道路,0.15,0 L6.26,1.5,-0.5* 縣自治縣旗縣級市界,0.3,0L9.4,5.0,-1.5,$9.4,-1.58.顏色從節(jié)約存儲空間的角度出發(fā),在圖形或?qū)傩詳?shù)據(jù)庫中存儲的是顏色代碼,而非具體的RGB®。這就需要建立一個顏色表。在下面的顏 色表中,可以把記錄號作為顏色的代碼。000002550255 0255 0255255 000255 255128128128 2242241282242241602242241922242242249通過消息獲取相關(guān)信息(1) 對 鼠標(biāo)和鍵盤的操作#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;/ 對鼠標(biāo)進(jìn)行操作, xy 記錄鼠標(biāo)所在位置的平面坐標(biāo)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; / 非鼠標(biāo)右鍵的標(biāo)志i1=arr_i;j1=arr_j; / 鼠標(biāo)的當(dāng)前位置i3=arr_i;j3=arr_j;key_value=0; / 沒有敲擊鍵盤的標(biāo)志while(GetMessage(&Msg,NULL,0,0)/ 循環(huán)并實(shí)時獲取消息 Tr
28、anslateMessage(&Msg);DispatchMessage(&Msg);if(Msg.message=WM_LBUTTONUP) break;佩標(biāo)左鍵退出 if(Msg.message=WM_RBUTTONDOWN)柝右鍵退出 id_right=1; / 右鍵的標(biāo)志 break;if(Msg.message=WM_KEYUP) break;/ 敲擊鍵盤鍵退出i3=arr_i;/ 最新的鼠標(biāo)位置 j3=arr_j;/key_value 為鍵盤的 ASCII 碼值if(key_value!=0)/ 為鍵盤而非鼠標(biāo)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) 鼠 標(biāo)和鍵盤消息的傳遞及相關(guān)功能的實(shí)現(xiàn)/GIS 的一個功能void Wp:OnWp163() / 保存圖形 CString StrText;id_begin=0;save_map();id_begin=263;StrText=" 子程序運(yùn)行結(jié)束!"m_wndStatusBar.SetPaneText(0,StrText);/ 按鼠標(biāo)右鍵,重復(fù)執(zhí)行剛剛執(zhí)行完的命令void Wp:OnRButtonDown(UINT
31、 nFlags,CPoint point)id_key=0; / 表示當(dāng)前操作的設(shè)備是鼠標(biāo)而非鍵盤if(id_begin!=0) SendMessage(WM_COMMAND,id_begin); / 按下鼠標(biāo)左鍵 void Wp:OnLButtonDown(UINT nFlags,CPoint point) / 鼠標(biāo)左鍵彈起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);/ 移動鼠標(biāo)void Wp:OnMouseMove(UINT nFlags,CPoint point)CString StrText;char string200,str30;double xy2;int ii;arr_i=point.x;/ 鼠標(biāo)在屏幕上的坐標(biāo)arr_j=point.y;10.
33、 選中或捕捉圖形實(shí)體的兩種算法( 1 ) 通 過點(diǎn)捕捉圖形實(shí)體算法的功能是通過鼠標(biāo)得到屏幕上的圖形實(shí)體。算法的主要步驟為:1) 移動鼠標(biāo)至將要選中的圖形實(shí)體上(對于線劃圖形、圓和弧,鼠標(biāo)的箭頭或十字絲位于圖形實(shí)體上, 而對于字符, 則位于剛好包住字符串的矩形范圍內(nèi)) ;2) 按鼠標(biāo)左鍵,得到屏幕坐標(biāo)3) 把屏幕坐標(biāo)換算為實(shí)際的圖形坐標(biāo);4) 程序進(jìn)入循環(huán)體,與調(diào)入內(nèi)存中的圖形數(shù)據(jù)庫中的內(nèi)容進(jìn)行比較,以得到滿足要求的圖形實(shí)體。a)如果鼠標(biāo)點(diǎn)在剛好包住圖形實(shí)體的矩形(數(shù)據(jù)結(jié)構(gòu)或?qū)傩詳?shù)據(jù)庫中標(biāo)識圖形范圍的外接矩形) 范圍內(nèi), 那么當(dāng)前圖形可能是將要選中的圖形實(shí)體;b)對于線劃圖形,鼠標(biāo)點(diǎn)到線段的垂直
34、最短距離小于4個(程序員可以自己定義)象素,那么當(dāng)前線段被選中;對于圓和圓弧,鼠標(biāo)點(diǎn)與圓心的距離小于 4 個(程序員可以自己定義)象素,那么圓或圓弧被選中;對于字符,鼠標(biāo)點(diǎn)位于字符串范圍內(nèi)(進(jìn)行比較時,需根據(jù)字符串的左下角坐標(biāo), 字符高度, 角度換算出剛好包住字符串的矩形) ,那么,字符串被選中;c) 用 屏幕背景色繪制被選中的圖形實(shí)體,再以灰色顯示之;d) 把被選中圖形實(shí)體在內(nèi)存中的位置(指針)存入有關(guān)數(shù)組或指針中。5) 重復(fù)上述步驟,得到所有應(yīng)被選中的圖形實(shí)體;6) 按鼠標(biāo)右鍵,結(jié)束對圖形實(shí)體的選擇;7) 把圖形實(shí)體的參數(shù)傳給其它功能模塊,如編輯、刪除等。( 2 ) 通 過窗口方式捕捉圖形
35、實(shí)體1) 正 選(利用鼠標(biāo)先得到窗口的左下角或左上角,再得到右上角或右下角)只有那些圖形實(shí)體的外接矩形完全位于窗口范圍內(nèi),該圖形才能被選中。2) 反選(利用鼠標(biāo)先得到窗口的右下角或右上角,再得到左上角或左下角)只要圖形實(shí)體的外接矩形部分位于窗口范圍內(nèi),該圖形就可以被選中。11. 圖形數(shù)據(jù)庫文件頭的操作如前所述,文件頭中只保存全局變量等參數(shù)。假設(shè)文件頭是定長的,如 4000字節(jié),保存圖形數(shù)據(jù)庫的指針為 beg_p, 圖形的比例尺為長整型,且位于beg_p+96處,那么,我們對圖形比例尺的操作方法為:(1) 保存比例尺:memcpy(beg_p+96,&map_scale,4);(2) 讀
36、取比例尺:memcpy(&map_scale,beg_p+96,4);12. 對文件的存取下面是把圖形內(nèi)容保存到硬盤上的一段程序。#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、數(shù)都是全局變量extern FILE *mapfp;extern unsigned long end_id;/ 圖形數(shù)據(jù)庫的總字節(jié)數(shù)/ 圖形區(qū)域 (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;/ 圖形視見區(qū)的大小extern double whole_alf;/ 圖形的旋轉(zhuǎn)角extern char huge *beg_p,huge *end_p;/圖形數(shù)據(jù)庫的首尾指針extern
38、 char curpath40;/ 執(zhí)行程序的路徑extern char *ex_string;/ 操作字符的公用指針extern char file_head20,*set_layer;/記錄文件名稱和層信息extern in dis_layer2003,id_layer,id_save_as;/記錄層信息等參數(shù)extern long map_scale;/ 比例尺/ 把內(nèi)存中的圖形數(shù)據(jù)庫內(nèi)容保存到硬盤上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)/ 當(dāng)前操作是”保存圖形為 ” ,而非 ”保存圖形 ”/* 檢查文件是否存在*/strcpy(ex_string,curpath);/ strcat(ex_string,"mgt"); strcat(ex_string,file_head);/ strcat(ex_string,".mgt");/判斷當(dāng)前文件是否存在得
40、到路徑文件名得到包括路徑在內(nèi)的文件名if(_access(ex_string, 0)!=-1)strcat(ex_string," 文件已經(jīng)存在, 是否覆蓋它 ");if(MessageBox(ex_string,"詢問 ",MB_YESNO|MB_ICONQUESTION)=IDY)E Selse return;/ 返回/當(dāng)前文件可以保存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");/ 以二進(jìn)制形式保存圖形 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," 北京大學(xué) ");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;/ 圖形數(shù)據(jù)庫的總字節(jié)數(shù) memcpy(lly,&end_id,4);/ 保存 lly=beg_p;/ 開始對文件進(jìn)行加密 , 加密的單位為 20 字節(jié)while(lly+20)<end_p)for(i=0;i<20;i+)memcpy(msj,lly,1);mao1=*msj;mao1=mao1+mao2i;/ 在圖形內(nèi)容上加減一個數(shù)*msj=mao1;memcpy(lly,msj,1);ll
44、y+;/ 保存加密后的內(nèi)容lly=beg_p;j=end_id/2048;/for(i=0;i<j;i+)k=i*2048;/ 每一次保存2048字節(jié)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整除的余數(shù)字節(jié)fmemcpy(mao,lly,byte_n);fseek(mapfp,i,SEEK_SET);fwrite(mao,byte
45、_n,1,mapfp);/ 保存完畢f(xié)close(mapfp);free(mao);delete msj;對圖形文件的讀取與上面的操作方法類似, 只不過應(yīng)用的命令是讀取數(shù)據(jù)而不是保存數(shù)據(jù)。當(dāng)前,讀入數(shù)據(jù)后需要解密。13. 對圖形實(shí)體內(nèi)容的保存圖形實(shí)體包括點(diǎn)、線、面等內(nèi)容。這里介紹對一般曲線的保存。下面介紹的方法不是面向?qū)ο蟮模且话愕谋4娣椒ā?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;/ 計(jì)算 (x,y) 序列的最大最小值extern void xy_min_max(int n,double *x,double *
47、y,double xy22);/ 保存諸如光滑的等值線等曲線/n: 原始 (沒有擬合 )數(shù)據(jù)點(diǎn)個數(shù)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;/ 去掉相鄰且相等的點(diǎn) ( 避免曲線擬合時出錯 )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)/ 兩點(diǎn)之間相差 0.01 米就認(rèn)為相等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); / 得到剛好包住圖形的矩形的左下, 右上角坐標(biāo) (最小最大值)laye
49、r_long=strlen(cadlayer);/ 層名的長度att_long=strlen(cadatt);/ 屬性的長度head_long=48+layer_long;/ 結(jié)構(gòu)頭的長度total_long=head_long+24*n+att_long;/ 結(jié)構(gòu)的總長度*mao=5; / 線的類型memcpy(end_p,mao,1);/ 保存圖形實(shí)體的類型end_p+;/ 往下移動一個指針*mao=head_long;memcpy(end_p,mao,1); / 保存結(jié)構(gòu)頭的長度end_p+;memcpy(end_p,&total_long,2);/ 保存結(jié)構(gòu)的總長度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; / 保存矩形左下角、右上角的數(shù)值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);/ 保存數(shù)據(jù)點(diǎn)數(shù)end_p=end_p+2;/ 結(jié)構(gòu)頭結(jié)束,開始保存數(shù)據(jù)點(diǎn)坐標(biāo)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;/ 結(jié)束(1) 在上面的例子中, 結(jié)構(gòu)的總字節(jié)數(shù)等于結(jié)構(gòu)頭, (x,y,z) 坐標(biāo),屬性所占字節(jié)數(shù)的總和。即:total_long=head_long+n*24+att_long( 1)(2) 式中, n 為數(shù)據(jù)點(diǎn)數(shù), 24 為每一 (x,y,z) 坐標(biāo)對占的字節(jié)數(shù)( 8字節(jié) / 浮點(diǎn)數(shù)) 。(3) 文件頭 head_long 的字節(jié)數(shù)等于固定的字節(jié)數(shù)與變長的層名的綜合,即:head_long=1( 圖形實(shí)體的類型)+1( 結(jié)構(gòu)頭的字節(jié)數(shù))+2( 總字節(jié)數(shù))+1
53、( 顏色)+1( 線型)+32( 圖 形范 圍 )+layer_long( 層 名 的 長度 )+8( 線的寬度 )+2( 數(shù)據(jù)點(diǎn)數(shù) )=48+layer_long雖然數(shù)據(jù)結(jié)構(gòu) 中 layer_long,att_long 是變長的 , 但通過 head_long,total_long 可以精確定位所有的參數(shù)。所以系統(tǒng)能夠?qū)崿F(xiàn)對圖形實(shí)體的操作。14. 編制數(shù)字化儀接口程序我們采用最新的與wintab 有關(guān)的技術(shù)編制數(shù)字化儀接口程序。有關(guān)的主要文件有七個:(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) 實(shí)現(xiàn)程序接口的技術(shù)方法1) 在頭文件中定義數(shù)字化的消息。如: 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 ); / 數(shù)字化儀的消息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) 實(shí)現(xiàn)對消息傳遞(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>/ 下面都與數(shù)字化儀有關(guān)#include "msgpack.h"#include "wintab.h"#define PACKETDATA( pk_x | pk_y | pk_buttons | pk_normal_pressure)#define PACKETMODPEK_BUTTONS#include "pktdef.h"(b) 消息傳遞機(jī)制long Wp:OnWtPacket(UINT nFla
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西柳州市2025屆高三第二次模擬考試歷史試題(含答案)
- 【全程復(fù)習(xí)方略】2020年人教A版數(shù)學(xué)文(廣東用)課時作業(yè):6.2一元二次不等式及其解法
- 一年級數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)匯編
- 【KS5U原創(chuàng)】新課標(biāo)2021年高二英語暑假作業(yè)-8
- 2025年0197北京風(fēng)信科技有限公司
- 20202021學(xué)年選修6課件第四章第一節(jié)水污染及其防治課件
- 2015-2016年英語必修Ⅴ北師大版Unit15課件W-up及L1
- 2024年中國通號總部招聘筆試真題
- 2024年西安醫(yī)專附屬醫(yī)院招聘筆試真題
- 中學(xué)教育班會班會 換位思考 與人為善人課件
- 垃圾清運(yùn)服務(wù)投標(biāo)方案(技術(shù)方案)
- 《民俗旅游學(xué)》教學(xué)大綱(含課程思政元素)
- 人教版小學(xué)三年級上學(xué)期期末數(shù)學(xué)試卷(及答案)
- 2021年學(xué)校意識形態(tài)工作總結(jié)
- 降低成本費(fèi)用的措施
- 工程量確認(rèn)單范本
- 潔凈室工程行業(yè)深度分析
- 《關(guān)于加強(qiáng)和改進(jìn)新時代師德師風(fēng)建設(shè)的意見》培訓(xùn)課件
- 頻譜儀N9020A常用功能使用指南
- 天津高考英語詞匯3500
- 2023年智慧電廠垃圾焚燒發(fā)電廠解決方案
評論
0/150
提交評論