MapInfo Pen文件格式

我不知道大家对这个有没有兴趣,也不知道是不是已经有公开的信息。

以前实现样式库的时候,参照MapInfo7.0的线型实现了一个类似的线型,当时琢磨了MapInfo线型的实现方式与PEN的格式意义。

这次是重新整理。从这份说明,可以大致推测它的实现。不知道现在这样的线型是否还能满足需要,不知是否有较全面而到位的GIS样式评论。

 

文件格式:
Endian:Little-Endian
示例图:

0-3字节,4个char类型,确认字,为"PEN2"
4-5字节,ushort类型,文件长度,如示例为1178
5-6字节,ushort类型,PEN数目,此为15
7起有(PEN数目)个ushort类型,为PEN数据位置索引。
PEN数据结束-文件结束:若有,为无效数据。

PEN数据说明:
0字节,共1字节,PEN的层数。若为0,则PEN数据仅此3字节(如示例图0026H,0029H),否则紧跟着即为层数据(如002fH)。
1-2字节,未知,可以不用理会。
PEN层数据:
0字节,BYTE类型,本字节后层数据长度,如002fH为2,即该层还有2个字节数据。层最后一个字节为0,因此也可以理解是层长度为2+1=3字节。
1字节后,PEN层数据是按编码进行,长度不固定。
层数据字节编码:
0x00, 1个字节,层结束,即层最后一个字节为0,后不跟数据。
0x01, 1个字节,从当前位置按当前颜色宽度设置,实线绘制到结束,后不跟数据。
0x02, 2个字节,沿线绘制n个单位长,紧跟一个字节即为n。关于单位,缺省即为1个像素,但绘制时可修改单位,从而绘制n*2或者n*其他的长度。即单位可变。
0x03, 2个字节,沿线忽略n个单位长,紧跟一个字节即为n。
0x04, 2个字节,在当前垂线绘制,后续字节设为c,则垂线相对线的起始结束y坐标为( c&0x0F, -( (c>>4)&0x0F ) )。
0x05, 1个字节,从当前位置起循环绘制,1层仅可能有一个此标志,若无,则从0开始循环,即循环整个层定义长。

0x06, 2个字节,设置绘制线宽,后续字节即为线宽为几个单位,若为0,线绘制时采用1个单位宽,填充绘制时无边界线。
0x07, 4个字节,设置绘制线颜色,后续3个字节为RGB。
0x08, 1个字节,设置绘制线颜色为缺省颜色,可通过参数传递缺省颜色。
0x09, 1个字节,设置缺省线宽,可通过参数指定。
0x0A, 2个字节,设置绘制线宽为缺省线宽+n个单位,n即为后续值。

0x0B, 2个字节,最小绘制线宽值,后续字节即为值。
0x0C, 2个字节,最大绘制线宽值,后续字节即为值。

0x0D, 2个字节,折线"<"绘制,当前位置即为左边点,设后续字节为c,右边点相对线的坐标为( (c>>4)&0x0F, -( (c>>4)&0x0F ) )和( c&0x0F, c&0x0F)。
0x0E, 2个字节,折线">"绘制,当前位置为右边点,设后续字节为c,左边点相对线的坐标为( -((c>>4)&0x0F), (c>>4)&0x0F )和( -(c&0x0F), -(c&0x0F))。

0x0F, 1个字节,从当前位置起忽略到结束,1层仅可能有一个此标志。

0x10, 4个字节,从当前位置起绘制Polygon,PEN格式的Polygon是按对进行,一对是垂直的两点,后续字节第1个是后面还有多少对,第2个字节是该队的沿线y值大者,第3个字节是沿线y值的差。如10 02 04 01,即为还有2对点,本对点为(X, 4)和(X, 3),若第3个字节为0,则退化为1点。
0x11, 4个字节,Polygon点对,第1个是后面相对上一个0x10或者0x11沿线长度,第2个字节是该队的沿线y值大者,第3个字节是沿线y值的差。如10 02 04 01,即为沿线2个单位,本对点为(X, 4)和(X, 3)。

0x12, 3个字节,从当前位置起绘制Polyline,后续字节第1个是后面还有多少点,第2个字节是该点的沿线y值。
0x13, 3个字节,Polyline点,第1个是后面相对上一个0x12或者0x13沿线长度,第2个字节是该队的沿线y值。

0x14, 4个字节,设置填充颜色,后续3个字节为RGB。
0x15, 1个字节,设置填充颜色为缺省颜色,可通过参数传递缺省颜色。
0x16, 1个字节,设置填充颜色为透明。

0x17, 2个字节,从当前位置起绘制到保留n个单位不绘制,n为后续字节值。
0x18, 2个字节,从当前位置起忽略到保留n个单位,n为后续字节值。
0x01、0x05、0x0F、0x17、0x18只可存在一个其中一个标志。若无任一,缺省为0x05循环整个层定义长。

 

posted @ 2008-08-18 22:07  zhiwen  阅读(1462)  评论(0编辑  收藏  举报