亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于MapInfo的線對(duì)象剪斷功能探討*

        2012-12-23 06:19:40高自強(qiáng)
        地礦測(cè)繪 2012年2期
        關(guān)鍵詞:按鈕功能

        高自強(qiáng)

        (河北省地勘局測(cè)繪院,河北廊坊 065000)

        基于MapInfo的線對(duì)象剪斷功能探討*

        高自強(qiáng)

        (河北省地勘局測(cè)繪院,河北廊坊 065000)

        將MapInfo軟件的線剪斷功能和MapGIS軟件的線剪斷功能進(jìn)行比較,指出MapInfo的線剪斷功能單一的問題。為此,介紹了一種利用MapBasic編譯生成線對(duì)象剪斷工具的方法,較好地解決了這一問題。

        MapGIS;MapInfo;線對(duì)象;剪斷功能

        0 引言

        MapInfo提供了一些點(diǎn)線面及注記工具,能進(jìn)行圖形對(duì)象的基本編輯操作。然而,在地質(zhì)測(cè)繪行業(yè)中,大多數(shù)電子地圖數(shù)據(jù)生產(chǎn)的從業(yè)人員由于用慣了其他圖形編輯軟件,總感覺MapInfo的圖形操作工具過于單調(diào)。例如,熟悉MapGIS的人就對(duì)Map-Info的線剪斷功能心存芥蒂。為此,筆者設(shè)計(jì)了一種MapInfo環(huán)境下的線剪斷模型,較好地解決了這一問題。

        1 MapGIS與MapInfo環(huán)境下線剪斷功能的比較

        在MapGIS中,軟件為用戶提供了多種剪斷線工具,主要有:“線編輯”菜單下的“剪斷線”功能(高版本MapGIS提供3種方式:有剪斷點(diǎn)、無剪斷點(diǎn)和定比剪斷);“線編輯”菜單下的“相交線剪斷”功能(2種方式:剪斷母線和不剪斷母線);“其他”菜單下的“自動(dòng)剪斷線”——對(duì)全圖作完全線剪斷處理。這些方式幾乎窮盡了剪斷線的所有方式,使用也相當(dāng)方便。

        MapInfo軟件也為用戶提供了剪斷線的功能,一般做法是:

        1)首先置當(dāng)前表為“可編輯”,選中要剪斷的線。

        2)點(diǎn)擊“對(duì)象/設(shè)置目標(biāo)”菜單,將選中的線對(duì)象設(shè)置為當(dāng)前目標(biāo)。

        3)選中另一個(gè)線對(duì)象,此線對(duì)象應(yīng)滿足兩點(diǎn):一是必須與目標(biāo)對(duì)象相交,二是兩對(duì)象之交點(diǎn)就是準(zhǔn)備剪斷的位置。如果沒有這樣的線對(duì)象存在,則需要利用輸入折線工具增加一個(gè)。

        4)點(diǎn)擊“對(duì)象/折線分割”菜單,完成目標(biāo)對(duì)象的切割。

        5)如果切割器是臨時(shí)生成的,最后還要將其刪除。

        很顯然,與MapGIS相比,MapInfo中的剪斷線功能單一、操作繁瑣。

        2 利用MapBasic生成Mbx工具的模型及基本思路

        MapInfo提供一種名為MapBasic開發(fā)工具,它是一種類似Basic的解釋性語言,語法規(guī)則和函數(shù)與通用Basic語言極其相似,有一定Basic基礎(chǔ)的人員能很快學(xué)會(huì)使用。利用MapBasic編譯生成的*.mbx文件能在MapInfo環(huán)境下直接運(yùn)行,因而可以用MapBasic生成Mbx用以擴(kuò)展MapInfo的功能。下面分析用MapBasic生成MapInfo環(huán)境下線剪斷工具的基本模型:

        第一,該工具應(yīng)能作為菜單項(xiàng)或工具箱項(xiàng)于啟動(dòng)MapInfo時(shí)即自動(dòng)運(yùn)行并駐留至MapInfo退出,以便隨時(shí)調(diào)用。

        第二,使用時(shí)不進(jìn)行更多的操作,只須選中該工具后在地圖窗口中單擊線對(duì)象需要剪斷的部位即可將原來的對(duì)象一分為二。

        第三,被剪斷后形成的新對(duì)象保留原對(duì)象的樣式和屬性,而且其任何片斷均能保留原對(duì)象相應(yīng)片斷的走向(延伸方向)。

        第四,不必進(jìn)行任何其他操作就可以無限次地重復(fù)使用。

        上述第一項(xiàng)和第四項(xiàng),利用MapBasic提供的Alter Menu語句和Create ButtonPad語句就可實(shí)現(xiàn)。

        利用MapBasic建立新的線對(duì)象的一般做法是:先用Create pline語句創(chuàng)建一個(gè)節(jié)點(diǎn)數(shù)為0的空對(duì)象,再依次向其增加節(jié)點(diǎn),最后用Insert語句將這個(gè)新對(duì)象插入文件。為說明方便,把需要剪斷的原始線對(duì)象稱為L(zhǎng)0,把剪斷后的兩個(gè)線對(duì)象稱為L(zhǎng)1和L2,把單擊位置的坐標(biāo)定義為(x,y)。L1應(yīng)包含L0從首節(jié)點(diǎn)開始的若干節(jié)點(diǎn),其末節(jié)點(diǎn)就是(x,y);相應(yīng)的,L2以(x,y)為首節(jié)點(diǎn),并且包含L0除L1已經(jīng)用到的節(jié)點(diǎn)之外的所有節(jié)點(diǎn)。

        但是,存在問題是:雖然從地圖窗口中取得坐標(biāo)是可以實(shí)現(xiàn)的,但這個(gè)坐標(biāo)究竟位于L0的哪一個(gè)片斷中,L1(或L2)究竟包含L0的哪幾個(gè)節(jié)點(diǎn)。由于用MapInfo的選擇工具選擇一個(gè)對(duì)象并不要求單擊位置一定要位于對(duì)象之上,當(dāng)單擊發(fā)生于對(duì)象附近一定范圍內(nèi)時(shí),該對(duì)象就能被選中,因而僅以單擊位置作為(x,y)加入對(duì)象中,必然會(huì)有一定偏差,L1的最后一個(gè)片斷和L2的第一個(gè)片斷實(shí)際上已經(jīng)偏離了原來的走向。

        3 如何定位剪斷點(diǎn)

        3.1 坐標(biāo)的確定

        如圖1所示,L0就是前述的原始線對(duì)象(圖中只畫了它的一部分),圓O的圓心就是鼠標(biāo)單擊位置,其半徑為一個(gè)定長(zhǎng)d,圓O與L0的一個(gè)片斷——線段AB交于M點(diǎn)和N點(diǎn),直線OP為AB的垂線,P點(diǎn)為垂足。顯然,P點(diǎn)就是將L0分為L(zhǎng)1和L2的分割點(diǎn)。

        圖1 剪斷點(diǎn)的定位示意圖Fig.1 Positioning schematic of snipped point

        求P點(diǎn)坐標(biāo)的過程是:把圓O看作一個(gè)線對(duì)象Obj1,然后以A(x1,y1)和B(x2,y2)為節(jié)點(diǎn)構(gòu)造一個(gè)新的折線對(duì)象Obj2,用MapBasic提供的函數(shù)IntersectNodes可以返回一個(gè)線對(duì)象Obj3,代碼如下:

        Obj3=IntersectNodes(Obj1,Obj2,INCL_ALL)

        這個(gè)新對(duì)象包含兩個(gè)節(jié)點(diǎn),其首節(jié)點(diǎn)為M,末節(jié)點(diǎn)為N,坐標(biāo)分別為:

        線段MN的中分點(diǎn)P的坐標(biāo)公式為:

        3.2 具體實(shí)驗(yàn)

        為了給前文提到的圓O的半徑d定義一個(gè)合理的值,筆者進(jìn)行了一個(gè)實(shí)驗(yàn),實(shí)驗(yàn)代碼如下:

        執(zhí)行以上代碼需要建立一個(gè)名稱為“實(shí)驗(yàn)”的MapInfo表文件,在該表中畫一條豎直的折線對(duì)象。將上述代碼復(fù)制粘貼至MapBasic文檔中,編譯后執(zhí)行,程序?qū)⒃贛apInfo中添加一個(gè)有ToolButton按鈕的工具箱,點(diǎn)擊該按鈕,在折線對(duì)象左側(cè)距離折線稍遠(yuǎn)一點(diǎn)的位置單擊,此時(shí)MapInfo沒有任何反應(yīng),接著,慢慢向折線移動(dòng)鼠標(biāo)并單擊,當(dāng)單擊點(diǎn)很接近折線時(shí),屏幕右下方出現(xiàn)一個(gè)消息框,報(bào)告一個(gè)數(shù)字。繼續(xù)從折線左側(cè)趨近折線,不斷有數(shù)字報(bào)告。重復(fù)多次后,改為從折線右側(cè)趨近折線。結(jié)果如圖2所示。

        圖2 實(shí)驗(yàn)結(jié)果Fig.2 Experiment result

        如果把那條豎直線改為水平線,把上面代碼中的print d/(x1-x)改為print d/(y1-y),結(jié)果基本相同。

        上面代碼中“d=MapperInfo(i_win_id,MAPPER_INFO_SCALE)”將當(dāng)前地圖窗口的顯示比例賦給變量d。這段代碼的執(zhí)行結(jié)果說明,當(dāng)點(diǎn)擊位置與對(duì)象的距離約為窗口顯示比例分母的1/30或更近時(shí),該對(duì)象即可被選中。

        3.3 圓半徑的確定

        根據(jù)以上的分析和測(cè)試,當(dāng)d取值不小于當(dāng)前窗口顯示比例的1/30時(shí),圓O就會(huì)與折線相交。為彌補(bǔ)測(cè)試誤差,把d的值定為窗口顯示比例的1/20。

        4 剪斷線工具代碼的編寫與編譯執(zhí)行

        4.1 向MapInfo添加工具按鈕

        代碼如下:

        主過程Main向MapInfo界面中加入一個(gè)標(biāo)題為“線工具”的工具箱,并向工具箱放入一個(gè)ToolButton按鈕,該功能由Create ButtonPad語句完成。MapBasic允許定義如下3種類型的按鈕:

        第一種:ToolButton工具按鈕。當(dāng)用戶單擊ToolButton工具按鈕時(shí),它處于激活狀態(tài)直到選擇了另一個(gè)工具。當(dāng)一個(gè)工具按鈕處于激活狀態(tài)時(shí),如果用戶在某種MapInfo窗口單擊,將調(diào)用由Calling子句指定的處理程序。ToolButton的Icon子句指定按鈕的顯示圖案。MapBasic的安裝目錄下有一“SAMPLESMAPBASICICONDEMO”子目錄,雙擊其下的 ICONDEMO.MB文件,在打開的MapBasic窗口下編譯并執(zhí)行,它將為MapInfo添加一個(gè)Icon Sampler菜單項(xiàng),依次選取其下的子菜單打開各種工具箱,單擊合適的按鈕出現(xiàn)對(duì)話框(見圖3)。把Constant項(xiàng)下的文本內(nèi)容復(fù)制粘貼到ToolButton的Icon子句中即可完成按鈕圖案的定義(直接在該子句中填入ID號(hào)也可以);ToolButton的Cursor子句定義該按鈕處于激活狀態(tài)時(shí)的鼠標(biāo)形狀,Draw-Mode子句指定該按鈕在地圖窗口中的繪圖方式;Calling子句指定與按鈕對(duì)應(yīng)的子過程名,即按鈕的處理程序;HelpMsg子句指定提示文本的內(nèi)容,文本內(nèi)容前加“ ”的功能是,當(dāng)鼠標(biāo)在按鈕上停留時(shí)顯示提示文本。

        圖3 Icon ID對(duì)話框Fig.3 Icon ID dialog box

        第二種,PushButton觸發(fā)式按鈕。用戶鼠標(biāo)左鍵點(diǎn)擊Push-Button觸發(fā)式按鈕時(shí),與它連接的子過程立即被執(zhí)行。

        第三種,ToggleButton開關(guān)式按鈕,當(dāng)用戶單擊這類按鈕時(shí),按鈕會(huì)在按下/非按下之間來回變換,同時(shí)程序會(huì)調(diào)用相應(yīng)子過程。

        PushButton和ToggleButton都沒有Cursor和DrawMode子句。需要指出的是,為了能夠使用各種圖標(biāo),MapBasic程序必須包含如下代碼行(一般將其置于程序文件的開始部分):

        Include"icons.def"

        4.2 實(shí)現(xiàn)線剪斷功能

        本文只給出實(shí)現(xiàn)線剪斷功能的一般過程:選擇線(獲取其所在表文件名、行號(hào)、屬性值)創(chuàng)建以d為半徑的圓折線對(duì)象通過循環(huán)將被選擇的線對(duì)象的各個(gè)片斷作為獨(dú)立線對(duì)象如果此對(duì)象與圓對(duì)象相交則計(jì)算它們的相交部分、依前述公式取得交點(diǎn)坐標(biāo)、同 時(shí)記錄片斷位置創(chuàng)建一個(gè)與原對(duì)象樣式相同的折線對(duì)象并添加第一部分節(jié)點(diǎn)坐標(biāo)將選擇的線對(duì)象的obj列Update 為此新對(duì)象再創(chuàng)建一個(gè)與原對(duì)象樣式相同的折線對(duì)象并添加第二部分節(jié)點(diǎn)坐標(biāo)將此新對(duì)象插入原表將新對(duì)象的屬性Update為原屬性值。

        由于MapInfo在許多函數(shù)和語句中并不支持以變量表示的表文件名,因此,如s_tab為一表名變量,用“Obj1=s_tab.obj”這樣的賦值語句并不能取得一個(gè)對(duì)象,程序會(huì)報(bào)錯(cuò)。解決方法是,先聲明一個(gè)alias類型變量(例如oli),賦值如下:

        oli=s_tab+ ”.obj”

        Obj1=oli

        則Obj1的值就是所要的對(duì)象。還應(yīng)注意,創(chuàng)建新的折線對(duì)象時(shí),如果要求該對(duì)象與原對(duì)象的方向一致,應(yīng)反向賦值,即依次從末節(jié)點(diǎn)向首節(jié)點(diǎn)添加坐標(biāo)。

        4.3 存在問題及處理方法

        仔細(xì)分析圖1可知,當(dāng)單擊點(diǎn)剛好位于要剪斷的線的某個(gè)節(jié)點(diǎn)附近時(shí),用上述方法取得的坐標(biāo)反而發(fā)生了偏移。其實(shí),只需添加一個(gè)條件語句就能解決這個(gè)問題,即當(dāng)循環(huán)枚舉原線節(jié)點(diǎn)坐標(biāo)時(shí),如果發(fā)現(xiàn)單擊點(diǎn)與某節(jié)點(diǎn)的距離小于d時(shí),則將該節(jié)點(diǎn)作為剪斷點(diǎn)。

        4.4 編譯執(zhí)行

        在MapBasic界面下將代碼編譯為mbx文件后,雙擊即可執(zhí)行。如果要在啟動(dòng)MapInfo時(shí)自動(dòng)運(yùn)行,則可將mbx文件拷貝至“C:Program FilesMapInfoProfessionalTools”,執(zhí)行MapInfo環(huán)境下的“工具/工具管理器”菜單命令,在圖4的界面中選“增加工具”,為工具指定標(biāo)題和位置。確定后將新工具右側(cè)的自動(dòng)裝入框選中即可。

        圖4 工具管理器界面Fig.4 The interface of the manager of tools

        [1]關(guān)健.MapInfo系統(tǒng)功能擴(kuò)展幾例[J].城市勘測(cè),2005(4):35~37.

        [2]劉光.地理信息系統(tǒng)二次開發(fā)教程——語言篇[M].北京:清華大學(xué)出版社,2003.

        Primarily Probing into the Snipping Function of Line Object Based on MapInfo

        GAO Zi-qiang
        (Hebei Institute of Geological Surveying and Mapping,Langfang Hebei 065000,China)

        By comparison the line snipping function between MapInfo and MapGIS,this paper points out that the line snipping function of MapInfo is single,for this reason,the paper introduces one kind of method to apply MapBasic compiling and generating way of line object snipping tool,then well solving the problem.

        MapGIS;MapInfo;line object;snipping function

        P 208

        B

        1007-9394(2012)02-0038-03

        2011-07-11

        高自強(qiáng)(1963~),男,滿族,河北灤南人,碩士,高級(jí)工程師,現(xiàn)主要從事工程測(cè)量及GIS方面的工作。

        猜你喜歡
        按鈕功能
        哪個(gè)是門鈴真正的按鈕
        也談詩的“功能”
        中華詩詞(2022年6期)2022-12-31 06:41:24
        當(dāng)你面前有個(gè)按鈕
        門鈴按鈕
        關(guān)于非首都功能疏解的幾點(diǎn)思考
        死循環(huán)
        懷孕了,凝血功能怎么變?
        媽媽寶寶(2017年2期)2017-02-21 01:21:24
        “簡(jiǎn)直”和“幾乎”的表達(dá)功能
        內(nèi)心不能碰的按鈕
        中西醫(yī)結(jié)合治療甲狀腺功能亢進(jìn)癥31例
        东北女人一级内射黄片| 毛片av在线播放亚洲av网站| 精品国产又大又黄又粗av| 国内免费自拍9偷1拍| 国产97在线 | 日韩| 3344永久在线观看视频| 国产成人一区二区三区高清| 国产精品99久久久久久98AV| 亚洲精品熟女乱色一区| 日韩精品人妻系列中文字幕| 欧美黑人巨大videos精品| 色老板精品视频在线观看| 亚洲AV无码久久久一区二不卡 | 亚洲av高清在线一区二区三区| 一本色道久久亚洲加勒比| 精品人妻午夜一区二区三区四区 | 久久99热精品这里久久精品| 日本在线视频二区一区| 日本一区二区在线免费视频| 国产精品无码午夜福利| 在线观看网址你懂的| 亚洲精品久久麻豆蜜桃| 成人无码av免费网站| 无套内谢的新婚少妇国语播放| 免费 无码 国产精品| 午夜一区二区在线视频| 国产毛片黄片一区二区三区 | 亚洲最大天堂无码精品区| 国产福利一区二区三区视频在线看 | 精品久久久久久久久午夜福利| 欧美亚洲国产精品久久高清| 久久久诱惑一区二区三区| 干日本少妇一区二区三区| 四虎影视免费观看高清视频| 97中文字幕在线观看| 麻豆国产精品久久天堂| 一本色道久久亚洲综合| 熟女人妇交换俱乐部| 一区二区三区福利在线视频| 久久精品免费视频亚洲| 内射欧美老妇wbb|