首页 理论教育物流堆场管理系统-物流可视化

物流堆场管理系统-物流可视化

【摘要】:有了前面知识的铺垫,下面围绕件杂货码头堆场管理系统中地图功能模块的实现展开叙述。堆场管理系统的地图绘制堆场中地图的绘制是在MapInfo中完成的,它是进行地图模块编程的前期工作。堆场管理信息系统比较适合按照逻辑意义的不同以及操作功能的不同划分图层。在堆场管理系统的开发中,选用以Maplnfo环境中定义的属性数据表为数据源。

有了前面知识的铺垫,下面围绕件杂货码头堆场管理系统中地图功能模块的实现展开叙述。在件杂货码头堆场管理中,是以堆场为核心,描述堆场上货位堆存货物的情况,为了描述一个码头的堆场,需要对堆场的大致位置、分布情况、库场特征等进行相应了解,然后进行地图可视化呈现的设计。地图绘制好以后,就在此基础上开发相应的地图模块程序,以发挥地图良好视觉效果的优势。在具体的码头堆场管理中,主要通过制定场地计划和实际机械作业的发生两方面来影响堆场中货位的堆存状态,最后对整个堆场的了解可以从“全场总貌”画面中得到。在此画面中,可以呈现堆场全貌,可以随意地操作地图,可以查询货位的描述信息,也可以查询货位的堆存情况,基本实现了一个与地图交互操作的小模块。

(1)堆场管理系统的地图绘制

堆场中地图的绘制是在MapInfo中完成的,它是进行地图模块编程的前期工作。一幅地图由一个Layers集合对象表示,一个Layers集合对象又是由若干个Layer对象表示,这个对象即所谓的图层,它是按照一定的规则组合起来的地图特征,代表包含各类图元(如区域、线条和符号)的地图图元集合的窗体中的矢量地图化数据。

一幅地图绘制的关键正是在图层的安排上。在一些通常的系统中,地图图层的划分是按照图元类型的不同进行的,即按照点、线、面来划分,但在堆场系统中,这种划分方式不太适合实际的应用。堆场管理信息系统比较适合按照逻辑意义的不同以及操作功能的不同划分图层。首先对堆场进行描述,它按照对货物所在位置的描述可以分成两个层次,一个是库、场、段、粮仓等,它是表征货物所在的大区域位置;另一个就是具体的货位,即是在库、场、段、粮仓中又细化的货物堆存的位置。所以地图上至少要划分这样两个层次。在具体的应用中,大的区域位置可以实现库场聚焦的功能,即可以将某个大区域移至整个地图的最中央,方便察看。而具体的货位层,则是用户主要与之交户的一层,因为查询货物的堆存情况时,是按照具体的货位进行的。除此之外,在堆场中,还有很多的建筑物,公路、铁路,如果都略去不画,整个堆场只有上述两层的话,地图会显得单调呆板,加上这样一些修饰后,地图的内容丰富起来,地图从表象上生动美观,而且由于建筑物和路可以起到一定的定位作用,也方便人们找到地图的相应区域,增加地图的可理解性。因此,再建立一个图层,用来描述建筑物及公路、铁路等。

依据上述思想,依次建立三个图层,分别命名为chang层、yard层、other层。每个图层均由以下四个基本的文件构成:属性数据表结构文件(.Tab)、属性数据文件(.Dat)、交叉索引文件(.Id)和空间数据文件(.Map)。地图分了3层,所以生成了12个文件。此刻,各个图层间还是相对独立的。最后,在MapX中加载所有的地图图层,组合成一个*.gst文件,就可以在程序中调用了。在组合成这一个文件的过程中,关键是要处理好各图层间的相对顺序,yard层一定在chang层之上,考虑到other层中的一些元素,如房子、公路、铁路、库场中的过道等也是对chang的修饰,如果被chang层覆盖,就把效果给遮掩了,所以设定将other层置于chang层和yard层之间。程序绘制地图时,按照从下到上的顺序绘制,这样yard层就位于整个地图的最上方了。最终生成的地图如图8-3所示。

图8-3 件杂货堆场示意图

(2)堆场管理系统的地图模块开发

图形绘制好以后,接下来的工作就是进行地图模块程序的开发。开发工作主要围绕地图的空间数据、属性数据、物资的属性数据三者之间的关系展开。下面结合说明程序这一模块具体完成的功能和实现的方式,简要阐述MapX开发中的一些特点。

①堆场管理系统的地图空间数据加载。

在进行地图开发的过程中,第一步的工作就是要在程序中调入地图,才能在此基础上进行其他功能的开发。在PB环境中,加入MapX地图控件,然后设定该控件的相关属性。加载地图空间数据的语句如下:

Ole_1.object.GEOset=”* .gst”

其中,等号左边的Ole_1.object代表对一个地图控件的引用,GEOset就是地图控件的一个属性,它表示地图的空间数据来自哪里。等号右边的文件就是刚才在MapX中集成好的地图文件,指定地图控件中显示的地图。

②堆场管理系统的地图属性数据的加载。

地图空间数据加载完毕后,堆场以图形化的形式呈现出来,这时的地图还没有实际的意义。正如前面所述,对地图的完整描述不仅要有空间数据,也需要属性数据;因此还需要加载地图的属性数据。

MapX中有数据集集合对象DataSets,通过调用DataSets的Add方法就可以进行数据绑定了。此数据绑定过程会创建DataSet对象。这个DataSet对象添加到DataSets集合中,包含了数据绑定到地图图层中的图元的计算值。一个地图控件有一个DataSets集合,该集合包含若干个DataSet对象。加载地图属性数据的语句如下:

Ole_1.object.DataSets.Add(Type,SourceData)

其中,参数Type指定地图所对应的数据源类型,是MapX的一个常数特性,即在程序中它是用常数代表具体的意义。当取值为6时,对应的数据源类型为MapInfo环境中定义的属性数据表;取值为2时,对应的数据源类型为ODBC数据库中的表。当然还有很多其他的数据源可以用常数表示。参数SourceData会根据具体数据源的不同而有所不同。

在堆场管理系统的开发中,选用以Maplnfo环境中定义的属性数据表为数据源。通过形如DataSets.Add[6, Layer(1)]的语句就可以完成地图属性数据的加载。这时参数SourceData就是具体的图层,即指明该数据集究竟是和哪个图层的MapInfo表相关联。经过地图空间和属性数据的加载,使地图空间对象和相关属性有机结合起来,在堆场管理系统的开发中,是实现地图对象和地图属性数据之间互相查询的前提,同时也为进一步通过地图属性数据查询物资属性数据提供可能,从而为地图模块中各种功能的实现打下基础。

在进行具体功能模块实现之前,简要说明一下MapX开发中的一个特点,正如上文进行地图属性数据加载时参数Type的设定,它用常数代表具体的含义,这一特性方便了编程,使得语句得到简化。

③堆场管理系统地图功能模块的实现。

在堆场管理系统功能模块中,要实现对堆场地图本身的操纵,要能够在堆场地图中实现地图与属性之间的相互查询;同时,对使用和管理者而言,要进一步查询到堆场中货位信息与存货信息之间的关系,这样,使用者就可以在良好的可视化环境中,实现对堆场货位信息与堆存信息的获取。

首先,系统要提供对地图本身的操作功能,能够随心所欲地查看地图,如放大、缩小、平移等,这是就地图空间数据本身的功能开发。因为调用的是一个诸多功能已经集成好的地图控件,该控件已经具备这些基本功能,所以只需要使用工具即可。

在MapX中存在两种类型的工具,一类是系统标准工具,每一种标准工具在MapX中都由常量和值与其对应。上文提到的就属于此类,开发中只需使用工具即可;另一类是系统自定义工具,从工具的光标样式到具体实现的功能,都需用户自行指定,然后再使用。

无论何种工具,使用时均是通过将该工具设定为地图当前工具来实现的。它的语句如下:

Ole_1.object.currenttool=1003

其中,currenttool是地图控件的一个属性,表征地图的当前工具是什么,如现在要放大地图,就把当前工具设为“放大”,等号右边是一个常数,它就是具体某种工具的代号。在MapX中,编号从1000到1015的常数都表征系统工具,如1003表示放大、1004表示缩小、1001表示平移、1007表示选择地图的某个区域等。

实现地图放大功能的语句已经具备,接下来就是何时触发该语句。一般会在按钮或者菜单中,如建立一个“放大”按钮,这时在“放大”按钮的CLICKED事件中设定地图的currenttool属性,这样就自然实现了点击“放大”按钮,地图工具改变而呈现出放大镜加号标志,标志地图可以实现放大功能。同理,可以建立“缩小”“平移”按钮实现相应的功能。

综上,可总结“系统标准工具”使用的两大步骤,一是设定currenttool属性,二是在适当的事件中,如按钮的单击事件中调用该工具。

其次,进一步提高地图的可视化效果,将本书前面介绍的可视化方法用程序予以实现。比如需要对堆场按区域有文字性的描述,能提供主动的地图定位功能等。

对堆场的标注可以借助于绘制地图时地图的属性数据,当然也可以在绘制时直接把文字性的描述作为地图元素添加到地图中。选择后一种方法时,地图的绘制量大为增加,而且控制起来不灵活,因为这时标注总是相对固定地和地图一起显示出来;而前一种方法,直接利用属性数据来标注,这样想显示库场的标注时就将chang层的标注显示出来,想显示货位的标注时就将yard层的标注显示出来,并且控制起来非常灵活,只需要设定标注显示与否的语句即可,它的语句如下:

Ole_1.object.Layer(3).autolabel=ture

其中,Layer(3)表示地图的第三层,即库场层,autolabel是层的一个属性,表征该层是否自动标注,如果值为ture,表明显示标注,反之表明不显示标注。这里采用第三层作为标注层而没有选择最细化的货位层,是因为如果显示货位层的标注,由于货位之间的距离很接近,整张地图会堆积着很多文字,文字与文字甚至相互叠加在一起,显得凌乱不堪,反而与增加地图可视化效果的目的背道而驰;而选择库场层标注,场与场之间的距离较大,标注一般显示在自己的区域中,达到了提示地图区域的作用。当地图很小时,同样标注的存在也会使地图凌乱,这时可以通过设定地图标注的显示范围,比如当地图一定大时才显示标注。

对于地图,当用户需要随意点击自己感兴趣的区域时,一般希望该区域能够快速定位,为此,地图要能够根据用户的要求把某个区域显示在地图的中央,实现的思路是找到用户的定位目标,然后把该定位目标的中心作为地图的中心,这样定位目标就出现在地图的正中间了。它的语句如下:

Ftrs= Ole_1.object.Layer(3).search(condi)

Ole_1.object.ZoomTo(0.2,ftrs.item(1).centerx,ftrs.item(1).centery)

其中,第一句话是按照某个条件查找出定位目标,它利用了层对象的search方法,括号内的condi是具体的条件;第二句话是把地图移至该定位目标的中心坐标,因此实现了定位目标居中的效果。

再次,要通过点击地图区域查询地图的属性数据,并进一步查询地图区域的堆存性质;同时也需要根据一定的条件,查明该条件下库场的分布。

选择地图的某个区域后,使地图该区域高亮显示出来,这是系统标准工具已经提供的,但在堆场的应用中,仅仅做到这一点还远远不够,这时还需查看货位的属性信息,以及该货位的堆存情况。这意味着系统工具不再适用,需要建立自定义工具完成上述功能。 自定义工具的使用包含以下三个过程:

a.创建自定义工具:所有的工具都需要有一个代号,如同上文放大工具的代号为1003一样,自定义工具也需要代号,这里就是为自定义工具指定一个代号。它的语句如下:

Ole_1.object.CreatCustomTool (ToolNumber, Type, Cursor)

其中,CreatCustomTool是地图对象的方法,表示新建自定义工具,它一共有三个参数,参数ToolNumber表示新建工具的工具代号,Type表示它的工作方式,比如是点形、矩形或是多边形,Cursor表示光标的类型,比如放大工具就是放大镜和加号的光标。

b.编写自定义工具的处理过程:这一步决定工具具体执行的工作,因为这里完全按用户的要求编写代码,因此非常灵活,可以实现各种功能。工具的执行代码写在地图控件的ToolUsed事件中。

c.在应用程序界面使用自定义工具:设定地图当前的工具为该自定义工具,这部分与系统标准工具相同。

在堆场系统中,创建一个“选择”自定义工具,当选择该工具后,可以选择地图上的堆场货位,显示货位名称,并进一步显示堆存情况。实现的方式是建立一个文本编辑框,用来显示货位名称,建立若干个数据窗口,表征货位的堆存状态。它关键的语句如下:

Ftrs=Ole_1.object.Layers(1).SearchAtPoint (point1 )

其中,point1表示鼠标单击地图所在的点,SearchAtPoint方法表示搜索包含该点的区域特征。那么货位的属性可以通过Ftrs.item(i).name得到,货位的堆存情况可以通过以该货位代码为参数来检索堆场的港存表来实现。

这时,实现了按照空间位置查询港存的功能,反过来,也可以通过设定条件来查询空间的分布,它的语句如下:

Ftrs=ole_1.object.layers(1).search(condi)

其中,与上条语句相比,不同在于这里调用的是search方法,是按照某种条件来查询地图,比如给用户提供查询条件的设定界面,可以按照船舶航次来查询货物的分布位置。

最后,要完成地图的颜色渲染。此时的地图与最初画出的地图并没有什么差别,然而使用者是希望通过地图的表象就可以知道类似该货位是否有货,是否做了计划等信息,这样就需要通过开发得到关于这类信息的专题地图。

通过和大量的堆场管理人员的沟通得知,货位的堆存情况即一个货位是否有货物,是否已经做了计划对他们日常工作有很多的影响,所以如果开发的地图可以从视觉上直观地给使用者呈现这种状态就十分必要。这种需求是专题地图可以提供的。

在建立专题地图之前,要先选择专题变量,并确定专题变量的取值。依据调查的结果,建立表征堆场堆存状态的变量,并依据其含义:无货、仅有计划、有货、有货也有计划,为专题变量建立四个相应的取值0、1、2、3。建立专题图的语句如下:

Ole_1.object.datasets(1).themes.add(5,“shadeval”)

其中,参数中,常数5表明MapX专题图为独立值型。分别用0、1、2、3四个独立的值代表货位的堆存状态。 “shadeval”表明具体的渲染变量对应的属性集合中字段的名称,这里即指MapInfo表中字段的名称。接下来,就可以设定各种独立值对应的显示样式,显示样式中包括前景、背景的颜色、填充样式等,这样就使得各种地图区域呈现出了不同的显示效果。

每个专题图会对应一个图例,图例中自动会添加各种独立值对应的区域数量有多少,但是颜色的意思会根据据具体的应用环境有所不同,它不可能自动添加上去。因此,为了让程序的可读性更好,应该具体指明某种颜色对应的具体含义,这样人们一看堆场地图,再看看图例说明,整个堆场的状态就一目了然了。

有时,地图的渲染颜色使得地图中处于选中状态的高亮区域不十分明显,也就是说,两者的颜色存在一定的视觉干扰,这种情况下,需要把专题图隐藏,从而使地图选中状态的特征清晰一些。至此,专题图的开发结束。

经过以上各部分开发过程的解读,堆场管理系统的地图模块功能已基本实现。下面再结合图文简单演示一下地图模块的功能。

(3)堆场管理系统的地图模块演示

首先,图8-4为使用者提供了件杂货码头堆场的总貌,使用者可以通过这张图对自己即将管理操作的堆场总貌有所了解,形成对堆场的客观概念。在界面上可以看到移动、放大、缩小,单选、库场标注显示、专题图隐藏等操作。

图8-4 件杂货堆场总貌

图8-5提供了库场标注显示的界面,选中图中的“库场标注显示”,即可以看见该显示前有√的标记,此刻的地图界面就出现了诸如“开发科4场”“开发科5场”的标注,当使用者不清楚库场的具体位置时,只需要进行“库场标注显示”的操作就可以得知库场具体位置。

图8-5 库场标注显示操作

图8-6所示为库场聚焦,在操作过程中如果操作者想看看某库场的存货情况,可以使用库场标注显示的功能,但是他还需要花费时间精力查找该库场,如果这时使用“库场聚焦”的工具,那么需要查找的库场立即就显示在屏幕的中央。比如需要查找204库,只需要在库场聚焦一栏中选择204库,即可以发现屏幕中央是204库。

图8-6 库场聚焦

图8-6和图8-7其实表示的是一个库场,但是在显示上两者却有很大差别,主要是图8-6中的专题图隐藏选项被选中。上文已经阐述专题图是经过变量渲染的地图,这次选用四种颜色分别代表“未操作”“仅有计划”“仅有实际”“实际计划”,这样在图8-7上就看见了不同颜色的色块,以图8-7为例,说明目前204库大部分都是未操作的货位,这样管理者就可以合理安排计划,妥善利用货位。

图8-7 专题图显示效果

图8-8是单选地图的操作演示。方框即为选中货位,选中后,该货位出现阴影底纹,图右的货位名称中出现该货位的编号,并在下面的数据窗口出现了该货位的堆存情况,即货物的物资属性信息。这就是联合MIS中业务数据的结果。

图8-8 单选地图

图8-9为条件查询的操作演示。首先选中条件查询,然后按照需要查询的条件输入,这样的结果就是在图中看到符合条件的货位是有底纹的,但是由于专题图的渲染,颜色的加入使得界面的显示有些模糊,这时可以隐藏专题图来更清晰地表现条件查询的结果,如图8-10所示,该图是隐藏了专题图的条件查询地图,可以发现有些货位是有底纹的,这就是符合设定条件的空间货位。

图8-9 条件查询

图8-10 专题图隐藏