Partitioning of Geographic Data(NDS,导航数据标准中的地理数据分区)

地理数据映射到NDS数据库,NDS坐标系统编码,tile划分。

7.1 坐标参考系

NDS使用墨卡托投影或结合wgs84和EGM96进行地图投影和定位目标。

7.1.1 WGS 84和EGM 96

NDS使用1984年的世界大地测量系统wgs84,作为表示物体纬度和经度的标准坐标参考系统。WGS84为整个地球定义了一个固定的全球参照系,用于大地测量和导航。通过使用这个标准的坐标参考系统,可以通过两个数字,即该点的横坐标和纵坐标,唯一地确定地球表面上的任何一点(北极除外),其中x对应经度,y对应纬度。

NDS使用EGM 96来表示高度信息,EGM 96描述的高度信息很好的近似海拔高度,比WGS84中的高度信息更准确。

注:NDS使用以下术语:

Elevation表示地球表面的高度

Altitude表示地球表面以上的高度

Height表示相对高度,例如建筑物的高度

7.1.2 墨卡托投影

墨卡托投影是一种圆柱形地图投影,其中平行线和子午线都是直线且相互垂直的。地图由东向西延伸,相应地由北向南延伸,使得在每个点位置,东西比例尺与南北比例尺相同,使投影呈正方形。许多导航应用做地图渲染转WGS 84数据到墨卡托投影,因为墨卡托保留了角度,并且只对极点有失真。

 

正射影像和高度图的墨卡托投影

NDS编译器可以对正射影像和高程图使用墨卡托投影,这样应用程序就不需要将WGS 84的栅格数据转换为墨卡托图来显示地图。DTM元数据和正射影像元数据定义了编译中使用的:coordinateProjrction和nds.shareddb.DtmMetadata。

对于墨卡托投影,将coordinateProjection设为SPHERICAL MERCATOR。

墨卡托投影中瓦片的空间位置

当墨卡托投影用于结构单元时,和WGS84相比瓦片被放置在不同的空间位置上,因为墨卡托没有覆盖整个地球。每个极点附近的水平条纹被排除(例如,5度)。普通的NDS平铺方案应用于墨卡托投影覆盖的空间。

这意味着,为了使用墨卡托投影结构单元,应用程序需要调整其过程:

·从一个坐标确定一个瓦片ID

·解释瓦片内容索引

 

 

7.2 处理坐标系

描述NDS中坐标系的编码和存储。

7.2.1 坐标系编码

坐标系编码,应用一个缩放因子,使360°对应于232,对于经度(X坐标)从-180°到+180°,完全覆盖32位整型。在NDS中,一个坐标单位等于经度或纬度的90/230度。坐标值的范围经度在-231≤x≤231,纬度在-230≤y≤230。

作为例外,在BDAM中允许纬度的坐标值+230表示北极的坐标。这个例外是必要的,因为北极是BDAM Level之间的一个重要连接点:当在地球上应用NDS规则混合BDAM Level时,纬度+90°的北极是任何两个相邻BDAM Level之间的联合边界的一部分。

坐标系的原点是WGS 84-0子午线与赤道的交点。

对于x坐标,用32位的整型表示:x = x31 x30…x1 x0

对于y坐标,用31位的整型表示:y = y30…y1 y0

注:

·由于采用了浮点运算,不同实现之间在最低有效位上的结果值可能有所不同。由于NDS中的数据精度通常高于地图供应商提供的数据精度,这对整体数据质量没有负面影响。然而,重要的是要确保一致的转换。(供应商提供的浮点坐标,一般是小数点后六位,精度大概是0.1米,而NDS精度大概是0.009米)

·在把浮点型值转换成整型时,采用向下取整(floor)的操作,不是四舍五入(round)也不是truncate(对于正数,和floor一样,对于负数,就是取一个比自己大中最小的正数,就是在坐标轴上向0方向取),之所以用floor,关系到tile的划分规则,因为坐标向下取整,不改变坐标点所在的tile,同时也不会改变下层tile间的关系。

·纬度范围180°,只用到31位就可以满足纬度的范围,但在实际的使用过程中,还是用32位来存储纬度,读取的时候把最高位掩盖掉,比如:-273788154,用31位整型表示,值为0x6fae5306,用32位表示就是0xefae5306,其实就是最高2位的值必须相同。

莫顿码

一个经纬度坐标是二维值,包括经度(X)和纬度(Y),莫顿马是个表示一维的值,所以把一个二维的值映射到一维的值,方法如下:

由x和y的各个bit位交错组合而成,c的值得范围为0≤c<263.如果用一个64bit的整型来存,是最高bit总是为0,这样这个整型总是为一个正数。

如果是按照莫顿码排序,就称为Morton order.

在NDS中,有多个应用是按mordon order排序,比如POI结构单元,tile也是按mordon order排序的。

7.2.2 Reducing Coordinate Precision

坐标精度决定了NDS中存储空间数据的数值精度。NDS的最大坐标分辨率定义为360°/232,在赤道或子午线上,每个坐标单位约0.9 cm。

为了存储具有最大分辨率的坐标,需要32位值。但是,为了节省空间,NDS允许最多15位(包括1个符号位)来编码tile内的坐标。为此,必须降低包括13级在内的所有级别的坐标精度。

这是使用位移值参数完成的,该参数作为所有结构单元的全局元数据项存储在不同的级别。参数shift value由位数指定,使用方法如下:当NDS应用程序从数据库中读取坐标值时,将其向左移动指定为位移量的位数。之后,在NDS坐标系中基于360°/232进行坐标值解释。因此,在将坐标写入数据库之前,编译器必须将完全解析的坐标值向右移动定义的位移量。

例如,4位的移位值意味着从数据库中读取的每个数字都要向左移动4位(即乘以16)。因此,分辨率降低到1 / 16,相当于沿赤道或子午线的每个坐标单位大约14.4厘米。对于除基本地图显示和路径规划结构单元之外的所有结构单元,3位的移位值是允许在坐标宽度为15位的13级tile中编码坐标的最低移位值。在基本地图显示和路径规划结构单元中,最小移动值为4是必需的。对于地图显示,这允许存储覆盖整个tile的区域特征。对于路径规划,这允许存储跨越整个tile宽度的直线道路几何线。然而,这个移位值仍然产生一个比通常输入数据的精度更高的分辨率。因此,建议将13级的偏移值指定为5或6,这将导致沿赤道或子午线每个坐标单位的分辨率约为30或60厘米。

移位值通常(但不一定)会随着每一个上层而增加。不允许降低上一级的位移值。考虑到NDS tile scheme,每个上层增加1的偏移值是一个明显的过程。作为一个结果, 在上一层,坐标分辨率降低了4倍(因子2是由于高一层,因子2是由于移位值增加)。

改变移位值会导致同一点在不同级上的坐标值不同,从而导致点“移动”。因此,用坐标差计算出两点之间的距离,就会在各层级之间产生差异。一种特殊情况是将两个不同的点映射到相同的坐标值。例如,(每一级位移值得增加)在第13级中相距160米的两个点有可能在第4级中是一个单一点。 编译器必须考虑这些降低精度的缺点,并相应地处理它们。处理可以根据结构单元的不同而有所不同。

注:如果相同NDS数据库的基本地图显示结构单元使用相同level,他们也会使用相同的坐标偏移。

       输入数据的坐标是通过truncation而不是通过数学四舍五入来适应坐标网格的。例如,如果移动值在每一级递增1,则坐标值的最低有效位将被删除。使用truncation而不是rounding的原因是rounding可能会移动位于附近的点。导航数据标准-格式规范地理数据的划分,将东部或北部的瓦片边界直接划分到边界上。根据给tile分配要素的规则,将一个点要素分配给相邻的tile。truncation确保点要素总是分配给相同的tile。

7.3 Tiling Scheme(网格划分)

 

每个feature都有自己的唯一的坐标点,我们可以通过地理位置来查找feature,定位feature和分组feature。这要求我们必须支持高性能的数据管理,比如。。。。

    NDS使用tiling scheme来完成这个功能。就是把整个地球表面按网格切分成一个一个格子,这个格子我们称为tile。每个tile近似为一个正方形的区域(实际上,每个tile的4条边长度都不一样,因为tile是按经纬度大小一样宽来切割的,但是纬度越高,相同经度表示的距离就越短)。

     NDS中,database是以tile为单位来进行存储的。也就是说,一个tile包含了在这个tile边界的地理范围的内的所有feature,这些feature将按datascript所定义的格式进行编码,存储为database的一个BLOBs。

      Tiles具有很多优点:

     * 应用程序通过一次访问数据库,就可以把在同一个地理范围内的所有相关数据都加载进来。这能够提高地图显示和路径规划的性能。

     * tiles可以作为数据更新的单位。我们只需要对每一个tile记录一个版本信息,而不是每个独立的feature记录版本信息。这也可以节省大量的数据空间。

     * tiles可以实现了对feature的分层引用。比如如果我们要引用到多个feature,这些feature属于同一个tile,这时候,这些feature的tileId只需要指定一次就可以。

      Tiles and Building Blocks

     导航数据在存储的时候,按照存储方式不同,分为BLOBs(二进制流存储)和relational(关系表存储)。

      tiling scheme应用于BLOBs的存储方式,比如basic map display building block,routing building block等等,都是按照tiles的方式来分隔数据,按tiles划分数据后,就可以通过一个点快速查找这个点周边的数据。

     而关系表存储的数据是没有tile的概念,比如POI building block。不过,我们也是需要支持周边查询POI的功能,这时候通过virtual tiles来支持那些特殊的查询功能。

    7.3.1 Tile and Levels

      tiling scheme同时定义了level的概念,在一个level上对应的所有的tile刚好覆盖了整个地球表面。在同一个level的每个tile的边界宽度都是固定的经纬度宽,所以同一level的tile在wgs84的坐标系统中大小是一致的。

       *tile的边界长和宽,在wgs84的坐标系统中是相同的,但是如果转换成米为单位的坐标系统,他们的长宽就是不同的,纬度越高,相同经度所表示的距离(以米为单位)就越短。

       最高level只包含2个tiles,到下一级level的时候,每个当前level的tile分割成下一级level的4个大小一样的tiles。这个过程反复进行,知道最低级level。上下级tiles就组成了类似于父子包含关系。

        最高level被定义为level 0,最低level定义为level 15。一共16级,其中有些level是强制需要的,有些level是可选择是否生成这个level的数据。NDS使用level 13来定义最详细的路网数据,也就是说在routing data里面没有比level 13更低的level数据。对于那些低于level 13的level是留给 map display使用了。比如,我们可以存储详细的city map在levle 14中。

       下图显示了level 0的tile情况,只有2个tile,这个tile的tile number 分别是tile 0和tile 1。在这个level中,一个坐标点属于哪个tile,由经度坐标的最高bit位来决定,即经度范围为(0° ≤ x < 180°)的属于tile 0,经度范围为(–180° ≤ x < 0°)的属于tile 1。上面我们定义了坐标的morton code,morton code很容易确定一个坐标属于哪个tile number。即,在level 0中,坐标点的morton code的最高bit位决定了这个坐标点的tile number(morton code共有63bit,别搞错成64bit),最高bit为0,就属于tile 0,最高bit为1就属于tile 1。

   下图显示了level 1的tile划分情况。同样的按照morton code规则,这层level的tile number由morton code最高3bit来定义。下图中显示了tile number的二进制表示法,其中最高1位用破折号分开,从中可以看出,这个最高位就是当前tile所从属的上一级level的tile number。即当前tile number总是以上一级level的tile number为前缀的。

下图显示了level 2的情况,还是根据morton code来定义tile number。规则简单,实用,真是划分tile居家便利之良策。图上我们也画出morton order(也就tile number从小到大的排序)。

  level k所包含的tile数为2^(2k+1),其每个tile的边长为2^(31-k)。level k所在的tile的tile number由坐标点的morton code的最高2^(k+1)位来标示(morton code是64bit)。

  tile还有个概念就是anchor point,我们知道,就是tile内部的坐标点在存储的时候,为了压缩空间,我们并不是把完整的x,y值存起来,而是存储一个相对某个坐标的offset。这个相对坐标就是anchor point。一般而言,anchor point有2种取法,一种是取最左下角的点,这样好处是所有的offset都是正数,还有一种是取中心点,好处是offset是对称的,(中心点坐标anchor point还有个好处是可用应用Tolerance Range来划分网格来减少link被打断的概率,不过NDS的link总是不被打断,也就没这个好处) 。

数据库中的tile通过其打包的tile ID进行标识。每个打包的tile ID由level number和tile ID组成。打包的tile ID的物理编码将两个组件打包成一个32位的值。 

 下表显示了每个位置的10级和13级覆盖tile的tile编号:

 7.3.2 Tiles and Clipping

一个feature可以完全属于一个tile,或者横跨多个tile,其的位置将按照明确的规则来归属到某个tile或者多个tile。

需要区分以下要素位置:

一个要素完全包含在一个tile中(图7-10)。

一个要素扩展到多个tile(图7-11)。

图7-10中描述的要素被分配到一个tile上。他们没有跨越tile边界。

图7-11中所示的所有要素都具有延伸到多个tile上的几何图形。NDS使用一种剪切机制来描述这些要素的几何形状。 

任何扩展到多于一个tile的要素的几何形状都会在tile的边界处被裁剪,并且要素的各个部分会被分配到相应的tile上。

分割的要素会产生位于相邻tile上的独立tile。tile边界上的点或线在坐标水平上被复制。导航数据标准格式规范地理数据的分区由一个剪切操作产生,可以唯一地分配给一个相邻的数据块。

通过引用公共数据库要素(如命名对象或routing link),得到的要素仍然是相关的。例如,图7-11。

  NDS使用中心点作为其tile的anchor point。tile中的点坐标在存储的时候,只是存储相对于anchor point的offset。在存储link的shapepoint时候,第一个点为相对anchor point的offset,其后的点就是相对前一个点的offset。

7.3.3 Generating Packed Tile IDs

tile在NDS中都有一个标示自己的tile ID,tile id由level number和tile number这2部分组成的一个32bit的整数。生成的规则由下图说明。

 tile编号是根据Morton order创建的。

0级的tile数由一位组成,这是根据tile的西南角经度的最显著位设置的。对于每个较低的级别,tile编号将扩展两位。tile编号由父tile编号的位和tile西南角的纬度和经度的第n位构建,n =级别号,从最显著的位0开始计算。因此,tile编号与tile西南角Morton代码的最有效位(2n+1)相同。

要生成打包的tileID,编译器需要结合tile号和level number。引用的级别数n应该被编码为2^16+n(例如,级别0的65536 = 216)。编码后,编译器应用一个按位或操作来生成打包的tile ID。

7.3.4 Generating IDs According to Morton Order

为了加快对特定数据元素的访问,必须根据Morton order为这些元素生成id。例如,这些元素是:命名对象、POI和POI服务位置。

根据Morton订单生成id时,需要考虑以下几点:

生成过程可能需要考虑级别。

生成过程将生成32位id。

生成过程必须考虑更新,以避免雪崩效应。

生成过程必须生成支持范围查询的id。

生成过程必须生成一组id,使每次更新的更改量最小化。

推荐的过程

1. 为每个数据元素标识一个参考点。

对于具有地理范围的数据元素,典型的参考点要么是边界框的中心,要么是属于该数据元素的最南部点的最西部点。

2. 为每个数据元素标识一个级别。

要素类型或POI类别可以决定使用的level。它也可以是items首次出现的level。对于具有地理范围的项,如果数据元素完全包含在一致的tile中,则使用后面两个上层中的一个是明智的。如果不需要升级,则将所有数据元素默认使用level 13。

3.为每个数据元素附加一个tuple,它包括:

 7.3.6 Using Tile Headers for Selective Data Fetching

对于routing和BMD tiles,NDS提供了表示可用的tile features的块头。标头还包含可用属性的偏移量。应用程序可以使用这些偏移量有选择地获取某个要素的数据,而无需解析前面的要素。如果只需要一个要素的数据,这种方法可以提高性能。

7.4 Tile Content Index

出于地图显示的目的,应用程序必须快速确定哪些更新区域包含给定tile的数据。由于更新区域可能根据国家边界(即不规则的轮廓)来定义,因此这个过程可能比可接受的时间更长。与边界框的比较不够精确,无法防止对数据库的不必要访问。

由于这个原因,NDS提供了可选的tile内容索引,其中包含了一个tile是否存在于给定的更新区域和结构单元中的信息。Tile内容索引表示为高度紧凑的位数组。因此,应用程序将它们保存在主存中是可行的。

 Tile Content Index as a Matrix

 

7.4.1 Building Blocks and Tile Content Indices

tile content indices是可选的不是必要的。

tile内容索引对于以下的结构单元是必要的:Routing, Basic
Map Display, POI, Traffic Information, Orthoimages, Digital Terrain Model, 3D Objects。

注:如果正射影像或数字地形模型结构单元使用墨卡托地图投影而不是WGS 84,那么应用程序需要以不同的方式解释tile内容索引。这是因为tile被放置在不同的空间位置在墨卡托。

Tile内容索引对于以下结构单元是可选的:名称、语音、全文搜索、连接视图、扩展。

不允许共享数据结构单元使用Tile内容索引。

允许使用tile内容索引的结构单元,可以为每个更新区域的每个结构单元的每个级别拥有一个或多个tile内容索引。选择哪一层作为tile内容索引,取决于结构单元。

具有强制性的Tile内容索引(路由、基本地图显示、POI、交通信息、正像图像、数字地形模型、3D对象)的建筑块应在最高填充级别上至少有一个Tile内容索引,或在比最高填充级别更高的级别上至少有一个Tile内容索引。此外,没有需要Tile内容索引的Tile或虚拟Tile的结构单元应该有一个由编译器选择的适当级别的贴图内容索引。推荐使用能够在大小和性能之间提供良好平衡的level。

例:

基于tile的结构单元或使用虚拟tile的结构单元包含13和15级的数据。它允许在以下级别或级别组合上有一个tile内容索引:

没有tile或虚拟tile的结构单元包含13、10、7和4级的数据。tile内容索引的级别为4或更高级别应使用。此外,level 8可以用于tile内容索引。 

对于具有可选的tile内容索引(名称、语音、全文搜索、连接视图或扩展)的构建块,没有关于tile内容索引使用级别的规定适用。

7.4.2 Filling the Tile Content Index of a Junction View Building Block

图7-15演示了在tile内容索引中包含数据的tile的表示。tile内容索引被建模为一个矩阵。包含至少一个连接视图的贴图的矩阵单元被设置为1。

 7.4.3 Multiple Tile Content Indices

一个结构单元可以包含多个tile内容索引。可能在多个级别上有一个tile内容索引。在一个结构单元的特定级别上也可能有多个tile内容索引。

如果一个tile内容索引的矩阵的行或列中有许多相邻的单元格没有被设置(值O),那么可能会创建一个新的TileContentIndex。通过将索引拆分为多个tile内容索引,可以避免索引中多余的位,这是由于相邻单元格没有设置而导致的。分割块内容索引的决定是大小和性能之间的折衷。

示例1:带有岛屿的更新区域包含一个用于基本地图显示(海洋tile)的tile内容索引和一个用于routing(如果没有渡轮链接)的tile内容索引。Routing结构单元中的tile内容索引涵盖了大陆和岛屿。图7-16说明了这样一个tile内容索引,它将tile上的信息组合在Routing结构单元中。第7列和第8列代表带有海洋和部分岛屿的地图tile。由于不存在中转链接,大多数单元格不包含routing数据。用来描述空块的位是多余的。

示例2:带有岛屿的更新区域包含一个用于基本地图显示的tile内容索引(海洋贴图)和两个用于路由的tile内容索引(如果没有渡轮链接)。Routing结构单元中的两个tile含量指标覆盖了大陆和岛屿。图7-17演示了如何为两个tile内容索引建模并避免多余的位。左边的tile内容索引代表了覆盖大陆的地图tile和右下角岛屿的三个tile。右边的小块内容索引代表岛屿上的块。例1中14个多余的部分被省略。

 7.4.4 Mapping Bounding Box to Tile Content Index

图7-18所示为所请求的边界框的map。为了便于说明,这个例子假设tile的大小等于度数在WGS84。

 如果边界框和tile内容索引的交集包含任何被设为1的位,那么边界框中的tile包含tile内容索引所代表的结构单元级别的数据。在图7-18中,请求的包围框的两个tile包含数据。

7.5地图比例尺

地图比例尺允许用户在定义的阶段放大和缩小地图。为了允许灵活缩放,NDS为基本地图显示和路由结构单元中的级别提供了最大比例级别的建议。通过将比例级别分配给结构单元级别,就可以定义结构单元元素在地图上可见的比例级别。建议的最小和最大地图比例尺分母的信息存储在共享数据结构单元中。

要定义地图比例尺范围,编译器必须同时设置最小和最大比例尺分母的值。以下规则适用于最小和最大地图比例尺分母。

地图比例尺分母的值总是大于0。

同一块建筑内连续等级的地图比例尺范围不得有空隙。

如果相同NDS数据库的“基本地图显示”使用相同的等级,则它们也应使用相同的地图比例尺。如果应用程序必须呈现特定大小的要素,那么编译器应该为所有受影响的level和building block设置标志isMandatory = TRUE。

如果不同级别的比例分母重叠,则绘制顺序对应于级别数的升序。例如,首先绘制路网和河流的level 13,然后绘制建筑足迹的level 14。

7.5.1 Assigning Scale Levels to Building Block Levels

 

7.5.2 Scale Sublevels

 地图的比例尺范围可以通过比例尺子层进一步划分为更小的区间。这些间隔使应用程序能够灵活地隐藏位于相同构建块级别上的不同缩放因子的元素。子级别的使用不依赖于所使用的级别的数量。但是,如果数据库的编制少于16级的最大值,则可以使用比例尺子级别来划分分配给其余级别的地图比例尺,以便逐步缩放。

规模子级别的定义是针对客户的。关于规模子级别数量的信息存储在共享元数据中。

利用子比例尺属性将地图的基本显示特征、基本链接和道路几何线划分为比例尺子层。给定水平的子水平值介于分配给该水平的最小和最大比例分母之间。分量表的值应按降序排列。如果一个特征的子尺度属性i在O到<no的范围内。对于比例尺子级别-1>,如果地图比例尺大于子级别[i],渲染引擎应该抑制这个特性。

例:scale子级别属性表示最小1:20000和最大1:40000之间的1:25000、1:30000和1:35000的中间刻度。当绘制比例为1:27000的地图时,应用程序将只读取和显示标记为1:3万或1:35000的特征,以减少渲染地图中的特征密度。

 相关引用学习资料:
Partitioning of Geographic Data

根据经纬度坐标计算NDS标准下的格网ID_路漫漫~Kevin的博客-CSDN博客_nds 地图

导航数据标准NDS结构简介_qixiaoyu718的博客-CSDN博客_nds格式

NDS:一种适于更新的导航电子地图数据存储标准_keykeywu的博客-CSDN博客_nds地图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值