背景知识:
kiwi趣闻:
kiwi是新西兰的一种鸟的名称,Kiwi鸟是尾巴翅膀极短不会飞的鸟,非常珍贵,只在新西兰僻静的丛林里才能见到,所以成为新西兰的国鸟。Kiwi鸟为新西兰人骄傲,新西兰人也自称为Kiwi. 另外大家熟悉的猕猴桃也和KIWI有关,猕猴桃的英文名称为KIWIFRUIT,我国翻译为奇异果,就是因为外表类似KIWI鸟的羽毛而得名。
其他的数据格式:
HAL98,HAL99, HAL00
地图数据,地图盘,地图格式
地图数据:以某种格式为基础电子化的二进制的数据。
地图盘:存储地图数据的数据盘
地图格式:地图数据保存的标准,必须按照这种格式才能读出正确的数据,格式中说明了数据的组织方式和相互之间的关联
版本:地图格式和地图数据都有版本,它们之间不是一一对应的,一对多的关系,一个版本的格式可能对应多个版本的数据,一个版本的数据必要能够找到和其相对应的格式。
和其他格式的比较
格式适用范围:
HAL:日本ALPINE的数据格式,目前在美,欧,日仍然很流行
KIWI:国际上通用的数据格式
CMDN:ZENRIN公司的专有格式
APPLI的开发:
HAL:这种格式主要针对于APPLI来设计,因此对于APPLI的开发更容易
KIWI:关联性强,APPLI开发不容易
CMDN:只能进行描画,其他的应用需要借助于其他格式
扩展性:
HAL,CMDN:扩展性弱,不支持扩展数据的开发。
KIWI:扩展性强,可以制作各种扩展数据。
冗余性:
HAL:冗余大,每层的分割都是相同的,即使数据量小,也要进行分割。
KIWI:冗余小,可以对数据比较大的部分进行再分割。
CMDN:每层的分割相同,基本的分割情况和KIWI相同,在PARCEL的基础上进行4*4分割
探索数据:
HAL:存在于道路UNIT中,划分和描画数据是相同的,即使没有探索数据,UNIT也存在
KIWI:存在单独的REGION数据,有自己的划分,只是在有探索数据的时候才制作REGION数据
CMDN:只有描画数据,没有探索数据,其他的检索等数据也没有
kiwi数据盘中的数据和用途:
alldata.kwi:主要存储描画数据,探索数据,诱导数据---MAP,DG, RP,VP使用
guidsrch.kwi: 检索数据的管理数据—NOTE使用
guide文件夹:下面保存的都是检索数据 ---NOTE使用
picture.kwi:画像数据---DG使用
voicedata.kwi:声音数据---DG使用
index.kwi:描画参数数据的管理文件 ---MAP使用
land.kwi:landmark数据---MAP使用
para.kwi:描画参数数据---MAP使用
kiwi数据的主要分类.
Parcel数据:主要用于描画,也被称作描画数据,数据的存储主要的一些坐标的记录,和相关的属性。根据所存的点,线,面的信息,进行显示其中包括背景,道路,文字。这些数据是构成地图的基本元素。
Region数据:主要用于经路探索,这些数据的组织形式也是为了方便最优路的探索。所谓最优路探索就是如何从地图上任意两点中找到一条最近的能够通行的路。在探索的过程中需要设定一定的条件,比如距离优先,费用优先等等,最优路探索的实现依赖于道路数据的连通性,道路的通行规则和道路的Cost值和其他条件的限制,region数据中主要强调了道路的接续,交通规制,通行方向等属性,因此能够应用于经路探索中
诱导数据:主要用于经路诱导,就是在车走行过程中提供一些信息,比如交叉点名称,道路名称,前方交叉的道路的目的地,等等,通过这些信息,提供行车途中走行的各种信息。
画像数据:提供高速道路上主要交叉点的一些情况,表示各个方向上的目的地。
声音数据:保存在经路诱导过程中所能提供的所有的声音信息。
检索数据:保存了地图数据中主要的点的信息,能够提供这个点上具有的地图要素的详细信息。
描画参数数据:保存地图描画时各种要素描画的参数信息,比如某某道路需要描画多宽,某个背景需要使用什么颜色来描画,某种文字需要描画成什么颜色等等,虽然landmark的数据单独保存成一个文件,但把描画参数和landmark统一称为描画参数数据。
数据的分层存储和分块存储.
地图的分层存储:
地图的分层存储可以理解为分不同的比例尺存储,地图最一般的特点,是以缩小的图形显示制图区域的物体和现象,这势必导致对其进行综合。大家都知道这样一个最简单的事实:实地25平方公里在1:10万,1:25万和1:50万比例尺地图上,分别为25平方厘米,4平方厘米,1平方厘米。很明显,欲在上述各种比例尺地图上以相同的详细程度显示实地25平方公里范围内的制图物体和现象是不可能的。即使是很大比例尺的地图(例如1:1000或更大),也不可能将实地的全部物体(现象)毫无遗漏地表示出来。显然,在编制较小比例尺地图时,不加任何选取、化简和概括地将资料地图上的全部内容都表示到新编地图上,那也是不可能的。
这样一来,当所编地图上单位面积内的地物数量过多时,就要对其进行取舍,即选取一部分,舍去另一部分;当地物轮廓图形的弯曲太小太多时,就要予以化简,即删除一些小弯曲;当制图物体(现象)的数量、质量特征过于详细时,就要减少其数量、质量的差别。
地图比例尺标志着地图对地面的缩小程度,直接影响着地图内容表示的可能性,即选取、化简和概括地图内容的详细程度;它决定着地图的几何精度,影响着各要素相互关系处理的难度;它决定着地图表示的空间范围,影响着对制图物体(现象)重要性的评价。
为了满足对于不同比例尺条件下数据处理或检索的需要,把地图分层(Level)存储。一般在最底层存储最详细的数据,而上层逐渐进行数据的抽取。比如目前中国地图数据分为7层,0到6层,最高层6层可能就只描画整个中国的版图,中间标注主要的都市,而到了0层就有可能详细到某个市镇的道路。
参考下面的两个图
6层的数据:
0层数据
地图的分块存储:
分层存储能够将地图数据划分为很小的单元,但是即使这样取得每层的数据也是比较困难,因此在分层存储的基础上对每层的数据分块进行存储,这样为数据的取得和管理也提供了很大的便利条件,因为每层的数据量不同,因此不同层的数据块的个数也是不相同的,低层的数据量较大,划分的数据块较多,高层的数据量小,划分的数据块也少。
parcel数据和region数据
parcel数据:
parcel数据的组织:
parcel数据就是我们上面提到的描画数据,parcel是描画数据的最小单位,它的组织方式就是level层---blockset---block---parcel。每层的数据首先划分为m*m个blockset, 每个blockset又划分为n*n个block, 每个block又划分为p*p个parcel, 如果某个parcel的数据太大,也有可能将parcel划分为q*q个分割parcel. 其中每层的parcel的个数都是2的幂数,比如2的0次幂,就是1*1分割,因此每层的分割都是非0值。另外每层数据的parcel的分割都是相同的,比如0层有4个blockset, 一个blockset划分为4个block, 其他的blockset也划分为4个block, 每个block下的parcel的分割也是相同的,但是同一层的分割parcel是不相同的,有的分割parcel是2*2分割,有的parcel是4*4分割,这时因为分割parcel的划分是根据数据量划分的缘故。
Parcel数据中还存储了诱导信息,它的组织也是按照parcel来进行的。每个parcel都是规则的四边形,描画信息中存储的信息包括背景,道路,文字。在地图数据的每一层都存在parcel数据。地图层越低,parcel数越多。Parcel数据中保存的都是坐标信息,并没有规定各种不同的数据描画成什么颜色等,这些参数的规定都在描画参数数据中规定。
- 相关的概念:
显示class: 是指数据的各种分类,比如背景数据中存在绿地,岛,铁道等显示class,通过描画不同class的背景数据,可以显示不同类别的数据。
正规化坐标:每个parcel内的坐标划分,每个parcel内的最大正规化坐标为4096*4096,通过正规化坐标和每个parcel的左下坐标能够计算parcel内所有点的实际坐标。正规化坐标的使用可以减少很大的数据量
经纬度:和现实中的经纬度的含义相同,kiwi数据中的经纬度的单位是1/8秒,提高了一定的精确度
缩尺scale:每层的数据显示的都是一个scale的数据,比如0层的比例尺是1/25000,实际上在每层又分了多个比例尺,这样的比例尺称为缩尺scale,每层最多允许有5个scale, 实际上0层的scale最多,有3个缩尺scale.每层的数据只有一份,可以通过缩尺scale的控制描画在不同的比例尺下。
- 背景数据:
背景数据是包括点,线,面,点就是地图上的mark, mark的坐标信息保存在背景数据中,mark的形状信息保存在landmark数据中。线是指地图上显示的铁道,区域线,比较窄的河流等等,面是指地图上的绿地,比较宽的河流,建筑物等等。见下图所示:
背景数据是按照下面的方式进行组织的:
显示class->data的排列->地图要素(点,线,面)
相关的概念:
- offset:背景数据中的形状点相对于前一个形状点的偏移量,使用offset可以大大的减少数据的存储容量。
- penup, pendown: 在背景数据的描画过程中,可能需要中断某一部分的描画,比如一个背景线可能会不描画中间的部分,这样就需要描画到某一位置时抬笔,到另外一个位置时落笔,记录这样位置的坐标点称为penup点,pendown点。penup点,pendown点指出现在背景线和背景面中,背景面中一般出现在parcel边界上的面中。
- polyline:背景线,比如铁道,行政边界等等,和道路线不同的是,背景中的线是不能用来走车的。
- polygon:背景面,比如绿地,建筑物等
道路数据:
道路数据中保存的就是车能走行的道路信息,和实际的道路的意义相似,地图中的道路使用点和线来表示。道路数据如下所示:
道路数据是按照下面的方式组织的:道路显示classàlink列àlink,node
相关的概念:
- Node:两条以上的Link的交叉点。
- 形状补间点:两个node点之间的形状点,主要用于描述道路的实际形状。
- ShapeLink:两个形状补间点之间的线段。
- Link列:某些属性相同的一系列Link和Node。
- Linkid:数据中的每个link的番号,对于一层数据保存的所有link,linkid是唯一的。
- 差分linkid:每个link并不直接的记录对应的linkid, 只在link列中记录起始link的linkid, 其他link都记录相对于起始link的差分linkID, 从而间接的求出linkid.
- 幅员:道路宽度
- 顺,逆方向:link的方向和node出现的顺序一致为顺方向,否则为逆方向。
- 通行规制:就是link是否能够走行的信息
文字数据:
地图上显示的各种文字,见下图
- 文字的排列:文字的排列分为横排和纵排两种。横排如上面的“中山大道东“,纵排如上面的“东环高速公路“
- 文字的转行:文字有可能不在一行显示,这样就需要保存转行的文字,比如上面的“广州本田汽车有限公司”
- 文字的类型:文字主要分为重心型,指示pointer型。
重心型
指示pointer型
region数据:
经路计算数据也被称作region数据,region数据的存储也是分块进行,不过它的组织就简单得多,在每层的基础上直接分为若干个region,也就是level层---region号。Region数据中只保存道路的相关信息,随着地图层的降低,region的个数会增加。Region的划分基本上和行政区域的划分相关,region不存在分割region,region就是最小的组织单位。下层region是由上层region数据进行细化得来的。上下层的region存在父子关系。
Region中虽然保存的也是道路信息,但是和parcel数据不同的是,它不保存道路的坐标信息,只有一些道路的通行条件等内容,它和parcel数据的唯一联系就是linkID, 同样的link不管是在parcel中还是在region中,它的linkId都是相同的。
Parcel数据和region数据的关系:
在同时保存了parcel数据和region数据的地图层中,两者的关系如下图所示
- Parcel数据的大小可以使用左下,右上的经纬度范围来定义,它是标准的矩形,在每一层所有parcel的大小都是相同的
- Region也是一个矩形,但是即使在同一层,region的大小也是不相同的,region数据的范围用包含的数据的最大,最小范围表示。
Kiwi格式的读取
Kiwi格式表结构
name[主要地图parcel管理记录]
项番 | Offset | Data长 | Data形式 | 项目名 | 备注 | 识别 |
1 | 0 | 4 | DSA | 主要地图DataFrame的先头Address | (1) | B |
2 | 4 | 2 | BS | 主要地图DataFrame的Size | (2) | B |
- […] 表的名称;
- 项番:给每个项目赋予的项目番号;
- Offset:描述该项目在所属表中的相对位置(用字节表示);
- Data长: 相应项目的data容量,不固定长时,用B表示;
- Data形式:相应项目的数据类型;
- 项目名:相应项目的名称,如暂时未使用,用Reserved 表示;
- 备注 :相应项目的解释;
- 识别:表示是否是有意义的值或是可以省略的值;
- 总是保存有意义的值;
- 根据情况保存,可以保存无意义的值;
- 如果不需要的话省略。
Kiwi格式中的基本概念:
Field : 保存数据的最小单位;
Record: 由多个Field组成的一组数据;
Table : 由相同种类的固定长Record 组成的数据;
List: 由相同种类的不固定长Record 组成的数据
Frame: 由多个Table 或List组成的Data;
Distribution Head:一般配置在一个Frame的先头部分,记载此Frame中各Table 或List的位置和大小的部分。
Kiwi格式中的数据类型:
N:自然数型,0~filed 所规定的最大长,如是两个字节的N型,则表示的范围是0~65536;
I:整数型,补码型表示的整型范围;
C:字符串型;
CC:字符串型,用来表示日文字符;日文字符一般由两个字节组成;
D:表示从0到Field长规定的最大值的2倍。如果是两个字节的D型,则表示的值得最大可能是131068(值为0~65534)。
SWS:表示从0到Field长规定的最大值的2倍。如果是两个字节的D型,则表示的值得最大可能是131070。
LWS:表示从0到Field长规定的最大值的4倍。如果是两个字节的LWS型,则表示的值得最大可能是262140。
PID:ParcelID 番号
0 Word
项目 | Bit | 内 容 | ||
1 | 15 | 南北识别Flag | Bit 15 | 意义 |
0 | 北纬 | |||
1 | 南纬 | |||
2 | 14~0 | 纬度(秒) |
1 Word
项目 | Bit | 内 容 |
1 | 15~11 | 纬度(秒) |
2 | 10~8 | 纬度(0.125秒) |
3 | 7~0 | 扩张用 |
3 Word
项目 | Bit | 内 容 | ||
1 | 15 | 东西识别Flag | Bit 15 | 意义 |
0 | 东经 | |||
1 | 西经 | |||
2 | 14~0 | 经度(秒) |
3 Word
项目 | Bit | 内 容 |
1 | 15~11 | 经度(秒) |
2 | 10~8 | 经度(0.125秒) |
3 | 7~0 | 扩张用 |
这个经纬度用来记录一个Parcel左下角的经纬度值。用来作为相对坐标换算的一个基准值。
SA:用3byte的Sector的大小和6bit block的大小来记录物理的Sector地址
项番 | Bit | 内容 | ||
1 | 15~0 | Sector Address | ||
项番 | Bit | 内容 | ||
1 | 15~8 | Sector Address | ||
2 | 7 | Disk面识别Flag | Bit 7 | 意义 |
0 | A面 | |||
1 | B面 | |||
3 | 6 | 保存Layer识别Flag | Bit 6 | 意义 |
0 | Single Layer | |||
1 | Double Layer | |||
4 | 5~0 | 理论Block数 |
一般在格式中规定了Sector 和Block 的大小,Sector 是Block的整数倍。
DSA:与SA的格式相同,只是意义不同,SA表示从某个表开头的相对地址,而DSA表示绝对地址。
Kiwi格式中表的连续性:
在KIWI格式中,涉及到很多的表,这些表从最开始的管理记录,一直到最后的实际数据的保存,都是通过“指针”来实现的。这里的“指针”指的是能够从一个表到另一个表的索引。一般这种索引是通过给出下一个表的Address来实现的。前一级的表通过给出下一级表的相关信息,地址和大小,来确定的找到下一级表。这样,整张地图盘都可以用这种关系关联起来。
例如:
通过这种逐级索引,一直指到实数据的位置。
KIWI格式结构
可以形象的把整个地图的数据想象成一棵树,既有这种逐级的索引关系,在一定程度上,又有数据逐渐详细,数据量增多的特点。我们全部的数据是按照KIWI格式存在盘上的,我们必须将这些数据分解出来以利用,而首先要理解的就是地图的格式。
全数据管理DataFrame是整个地图格式的总索引,他除了给出一些版本的信息,还给出到Parcel系数据,region系数据,检索数据等的索引。
版本信息主要是包括一些制作者的名称,日期,版本号,包括地图数据的种类等等。而对于各种数据的索引,则是给出各个DataFrame 的地址和大小,如果这些数据包含在新的文件中,则同时还给出文件名。
在这里,我们主要介绍Parcel系管理数据的结构和Region系管理数据的结构。
Parcel系数据管理部分
数据结构
首先形成一种树的概念:
再确定索引关系:
几点说明:
在level管理记录中,给出了划分的个数,这是对于一个单位来说的,例如,纬度方向和经度方向Block数表示的是一个Blockset内的Block划分个数。
对于一级表,一般来说它所给出的地址,是它所管理的下一级表的表头地址,例如一个Level管理记录,它所给出的地址,是它所管理的BlockSet管理记录的开头地址;
关于分割Parcel 的类型:在Level管理记录中,给出了三种在进行Parcel再分割时的分割方法,在Parcel管理情报中只给出分割类型,无分割时存0;
关于Parcel管理情报:实际上Parcel管理情报是对于一个Block内所有的Parcel的管理记录的排列,当然包括主要地图parcel管理记录的排列和径路诱导Parcel管理记录的排列。当这个Block内的某一个Parcel存在分割时,在这个Parcel管理情报的后面在附加一个Parcel管理情报,这时,你可以把原Parcel想象成一个Block,在这个Parcel管理情报中,保存了各个分割parcel的管理记录。当然在原Parcel管理情报中,会给出分割类型。
Parcel内数据的存储:
Region系数据管理部分
数据结构
几点说明:
从高层到低层,Region管理记录呈树的结构:(如图)
高层的一个Region,在低层可能会划分成多个Region,在每一个Level中。Region的编号都是从0开始。在每一个Region管理记录中,记录了它的上位Region号和下位第一个Region号。
因为Region是不规则的形状,所以在描述Region范围时,实际上给出的是所占的最大的四边形。
Region内数据的存储:
Region数据中包括NodeData,LinkData,CostData等与径路计算有关的数据。在开头会给出到各个data的索引。