在优化维护工作中,MapInfo是很常用的一个GIS软件,MapInfo支持二次开发,可以根据不同的需求在MapInfo中通过地理化的形式表达出很多的想法,实现很多实用的功能。
当你看到一堆高大上的插件,总想把自己的想法变成实用的插件,但是绝大多数人的过程是从未入门直接就放弃了,少有能坚持到可以写出好用插件的那天。这其中的原因很多,最主要的一个原因是MB(Mapbasic)资料太少,多数资料只讲了些语法、怎么建菜单,怎么建工具栏,很少能结合实例进行讲解的。等到感觉可以动手开始写MB程序时,却仍然云里雾里,无从下手。
想当初受到前辈点拨,终于找到了MB的门,有幸入门一探究竟,才明白原来确实有柳暗花明。回过头来,才发现,原来MB并不难,难的只是没有深入了解TA。 前段时间想查个LTE频点的EARFCN,没有找到啥方便的工具可以直接换算,只能通过协议的表查数据,然后计算,于是索性直接用MapBasic写一个,再也不用查表那么费劲了,正好也可以为想要入门的兄弟提供一个MB实例及一些MB编程的想法。
废话不多说,我假装很懂的样子大概梳理一下整个功能从无到有的过程,基本语法不细说。
-----分隔线-----
首先看看效果,可以支持3GPP R13协议列举的所有频段的EARFCN和频点的转换。然后再来说下是怎么在MB下实现的。
[attach]324421[/attach]
一、从3GPP官网(注1)下载一个最新的TS36.101协议文档(注2),获取EARFCN和频点转换方法,编写时,最新的是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中各协议索引中看到,TS36.101是User Equipment (UE) radio transmission and reception
,不难想到频点和频点号、频段间隔之类的可以在这个文档中找到。
[attach]324422[/attach]
从目录中可以看到5.7.3节即为频点和EARFCN的关系,其中给出了转换公式,及转换公式中的所需数据的表。
[attach]324423[/attach]
[attach]324424[/attach]
5.7.4节列出了所有FDD-LTE的各频段的上下行频率间隔
[attach]324425[/attach]
二、分析协议中的表格数据,确认程序实际需要的数据格式,整理成相应的数据。
频段数较多,且存在很多重复的频段,各个数据之前无明显的联系,所以最先想到了用数据库的形式来存储。
最终整理成的数据如下图,其中包含各个需要的字段,计算时直接用SQL查表得到所需的数据内容。
[attach]324426[/attach]
[attach]324427[/attach]
三、结合转换公式,设计需要呈现和输入输出的内容,完成转换流程图,以便为后续代码编写提供非常清晰的框架。
[attach]324428[/attach]
四、设计转换窗体
从分析的数据中可以看出,上下行频点、频段、EARFCN都是可以输入输出的变量,其他字段是可以通过查表获得的常量,因此将转换的窗体设计成最上面的效果图(窗体一般用MBbuilder绘制比较方便)。代码见DlgConvertFreq.mb
五、参照流程图,对转换子过程用MB代码实现。//代码见DlgConvertFreq_H.mb,不重复粘贴
1、在转换窗体开始前,先初始化变量,所有字段用alias类型变量进行赋值,并创建转换表,用SQL插入第二步整理的数据到表中,同时用数组为多频段的频点做准备。
//注:MB编程中应该避免将字段写死,建议用常量或者变量统一赋值,引用时,用alias类型变量,可以方便后续字段变化的情况,比如原先用的是中文字段,突然变成必须用英文字段,没有用alias类型时,代码的维护将非常痛苦,而用alias类型,也可方便进行自定义字段名。
2、从各输入值获取到相应的数据,代入到通用的计算过程中,进行计算,计算的结果呈现到转换窗体的各个字段上。
3、查询结果为多频段时,再次用选择的频段进行计算。
六、设计菜单、工具栏及其他可以调出转换窗体的输入方式。
//比较简单,一般的资料上都会有,代码中也有注释。
最后,再假装很懂的样子提2个建议MB编程的建议
建议1:所有需要呈现的字段、提示等都用变量赋值,而不是直接用字符串代入,这样可以方便后续多语言的实现。
建议2:避免单个MB文件开发,尽量模块化程序,如果插件的功能足够多,几十上百个文件也是很正常的。比如本实例其实是模块化的插件中的一小部分,模块化后,团队协作开发各功能会很高效,是的,MB可以是很多人的战斗。
------
以上简单描述了1个小功能用MB实现的步骤,仅供交流MB编程,希望对MB入门有所帮助。昨晚搞完,一直404,补发一下附件。
[
本帖最后由 adsn 于 2016-5-8 08:41 编辑 ]