在優(yōu)化維護工作中,MapInfo是很常用的一個GIS軟件,MapInfo支持二次開發(fā),可以根據(jù)不同的需求在MapInfo中通過地理化的形式表達出很多的想法,實現(xiàn)很多實用的功能。
當你看到一堆高大上的插件,總想把自己的想法變成實用的插件,但是絕大多數(shù)人的過程是從未入門直接就放棄了,少有能堅持到可以寫出好用插件的那天。這其中的原因很多,最主要的一個原因是MB(Mapbasic)資料太少,多數(shù)資料只講了些語法、怎么建菜單,怎么建工具欄,很少能結(jié)合實例進行講解的。等到感覺可以動手開始寫MB程序時,卻仍然云里霧里,無從下手。
想當初受到前輩點撥,終于找到了MB的門,有幸入門一探究竟,才明白原來確實有柳暗花明;剡^頭來,才發(fā)現(xiàn),原來MB并不難,難的只是沒有深入了解TA! ∏岸螘r間想查個LTE頻點的EARFCN,沒有找到啥方便的工具可以直接換算,只能通過協(xié)議的表查數(shù)據(jù),然后計算,于是索性直接用MapBasic寫一個,再也不用查表那么費勁了,正好也可以為想要入門的兄弟提供一個MB實例及一些MB編程的想法。
廢話不多說,我假裝很懂的樣子大概梳理一下整個功能從無到有的過程,基本語法不細說。
-----分隔線-----
首先看看效果,可以支持3GPP R13協(xié)議列舉的所有頻段的EARFCN和頻點的轉(zhuǎn)換。然后再來說下是怎么在MB下實現(xiàn)的。
[attach]324421[/attach]
一、從3GPP官網(wǎng)(注1)下載一個最新的TS36.101協(xié)議文檔(注2),獲取EARFCN和頻點轉(zhuǎn)換方法,編寫時,最新的是1/15號d21版本(即TS36.101 R13 v2.1)。
//注1:
http://www.3gpp.org/ftp/Specs/archive/36_series/36.101/
//注2:為啥是TS36.101,這個可以從TS21.201中各協(xié)議索引中看到,TS36.101是User Equipment (UE) radio transmission and reception
,不難想到頻點和頻點號、頻段間隔之類的可以在這個文檔中找到。
[attach]324422[/attach]
從目錄中可以看到5.7.3節(jié)即為頻點和EARFCN的關(guān)系,其中給出了轉(zhuǎn)換公式,及轉(zhuǎn)換公式中的所需數(shù)據(jù)的表。
[attach]324423[/attach]
[attach]324424[/attach]
5.7.4節(jié)列出了所有FDD-LTE的各頻段的上下行頻率間隔
[attach]324425[/attach]
二、分析協(xié)議中的表格數(shù)據(jù),確認程序?qū)嶋H需要的數(shù)據(jù)格式,整理成相應(yīng)的數(shù)據(jù)。
頻段數(shù)較多,且存在很多重復(fù)的頻段,各個數(shù)據(jù)之前無明顯的聯(lián)系,所以最先想到了用數(shù)據(jù)庫的形式來存儲。
最終整理成的數(shù)據(jù)如下圖,其中包含各個需要的字段,計算時直接用SQL查表得到所需的數(shù)據(jù)內(nèi)容。
[attach]324426[/attach]
[attach]324427[/attach]
三、結(jié)合轉(zhuǎn)換公式,設(shè)計需要呈現(xiàn)和輸入輸出的內(nèi)容,完成轉(zhuǎn)換流程圖,以便為后續(xù)代碼編寫提供非常清晰的框架。
[attach]324428[/attach]
四、設(shè)計轉(zhuǎn)換窗體
從分析的數(shù)據(jù)中可以看出,上下行頻點、頻段、EARFCN都是可以輸入輸出的變量,其他字段是可以通過查表獲得的常量,因此將轉(zhuǎn)換的窗體設(shè)計成最上面的效果圖(窗體一般用MBbuilder繪制比較方便)。代碼見DlgConvertFreq.mb
五、參照流程圖,對轉(zhuǎn)換子過程用MB代碼實現(xiàn)。//代碼見DlgConvertFreq_H.mb,不重復(fù)粘貼
1、在轉(zhuǎn)換窗體開始前,先初始化變量,所有字段用alias類型變量進行賦值,并創(chuàng)建轉(zhuǎn)換表,用SQL插入第二步整理的數(shù)據(jù)到表中,同時用數(shù)組為多頻段的頻點做準備。
//注:MB編程中應(yīng)該避免將字段寫死,建議用常量或者變量統(tǒng)一賦值,引用時,用alias類型變量,可以方便后續(xù)字段變化的情況,比如原先用的是中文字段,突然變成必須用英文字段,沒有用alias類型時,代碼的維護將非常痛苦,而用alias類型,也可方便進行自定義字段名。
2、從各輸入值獲取到相應(yīng)的數(shù)據(jù),代入到通用的計算過程中,進行計算,計算的結(jié)果呈現(xiàn)到轉(zhuǎn)換窗體的各個字段上。
3、查詢結(jié)果為多頻段時,再次用選擇的頻段進行計算。
六、設(shè)計菜單、工具欄及其他可以調(diào)出轉(zhuǎn)換窗體的輸入方式。
//比較簡單,一般的資料上都會有,代碼中也有注釋。
最后,再假裝很懂的樣子提2個建議MB編程的建議
建議1:所有需要呈現(xiàn)的字段、提示等都用變量賦值,而不是直接用字符串代入,這樣可以方便后續(xù)多語言的實現(xiàn)。
建議2:避免單個MB文件開發(fā),盡量模塊化程序,如果插件的功能足夠多,幾十上百個文件也是很正常的。比如本實例其實是模塊化的插件中的一小部分,模塊化后,團隊協(xié)作開發(fā)各功能會很高效,是的,MB可以是很多人的戰(zhàn)斗。
------
以上簡單描述了1個小功能用MB實現(xiàn)的步驟,僅供交流MB編程,希望對MB入門有所幫助。昨晚搞完,一直404,補發(fā)一下附件。
[
本帖最后由 adsn 于 2016-5-8 08:41 編輯 ]