文章1

本文介绍了四个关键表格在地理数据组织中的作用:SelectionMetadataTable用于定义查询标准,SelectionGraphTable描述查询流程,NamedObjectTable存储地理名称及其关系,NVCTable构建Next-Valid-Character树以支持高效查询。通过这些表格,数据提供者能定制化地定义和管理地理信息,便于用户进行复杂查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Navigation Data Standard - Format Specification


用到的4table表格。前2table的内容由数据提供者来定义。并不是全球统一为一个。

下面举的例子为样本数据中的内容。

 1,SelectionMetadataTable由数据提供者定义,每个region有一个这个表。描述了selection criterion的含义。nameobjectClassselectionCriteria的区别在于,nameobjectClass为一般性的行政区域划分,面向name对象的一个属性。而selectionCriteria更贴近用户感觉的定义,与name对象的属性无关,属于面向用户的定义。比如citycity district2个不同的nameobjectClass(分别为 ORDER_8=9,ORDER_9=10),但是用户在查询的时候总是把这2个行政区混合放在一起查询,所以会把citycity district合并为一个selectionCriteriaplace=1)。

  包含一个SelectionDefinitionBlob

 nameobjectClassDefiniton[17];016定义了nameobjectClass

 selectionCriteriaDefinition[11];如下:一个selectionCriteria可以对应多个nameobjectClass

 

selectionCriterion

Name

Name object class

0

Country

0

1

Place

9,10

2

Street

11

3

Cross road

12

4

House number

13

5

Postal code

17

6

Suburb

10

7

Poi name

1

8

Poi phone number

1

9

City

9

10

Province/special city

2,3,4,5,6,7,8

 

2,SelectionGraphTable一个查询的流程走向,如:country->province->city->street。由数据提供者来定义。

Namedobjectid  总是对应一个region name,比如“上海市”

SelectionGraphDefinition。相关的查询图

一共有7selectionGraphEdge

Edgeid

SelectionCriteria

ChildSelectionGraphEdgeid

0

0(country)

1,2

1

10(province)

3,4

2

8(poi phone number)

 

3

1(place)

5,6

4

5(postal code)

5

5

2(street)

 

6

7(poi name)

 

 解释下就是:edgeid为0,表示在coutry下面查询到edgeid为1和2的信息(对应到 province和 poi phone number)

                         edgeid为1,表示可以在province下面查询到edgeid为3和4的信息(对应为place 和 postal code)

                           。。。。。。。。。

3,  NamedObjectTable

每一条记录对应一个name,每条记录包含3个字段:

NameObjectId nameObjectId;   类型为int32,从0开始编号,tablekey值,外面需要引用到name的时都是通过这个id来关联上。

NameObject   ndsData;       名字具体内容,包含名字本身的字符串(多个名字),和关联这个名字的其他namedObjectId及之间的关系,可以关联多个其他名字。

 

NamedObject
{
 NamedObjectClassnamedObjectClass;  
 NamedObjectAttributesattr;  
 varuint16numRelations;  
 NamedObjectRelationnamedObjectRelation[numRelations];  
 SizeOfNameStringListnumNames;  
 NamedObjectString(numNames)namedObjectString[numNames];  
 boolhasAttributes;  
 SimpleAttributeListattributeList if hasAttributes == true;  
};


 

namename之间的关系分为6种:

CAPITAL_RELATION:

The source named object is a city named object (region category). The target named object is an administrative region named object. The relation says that the source named object is the capital of the target named object.

CONTAINED_IN:

The source named object is a road, a POI, a crossroad, a region or a house named object. The target named object is a region named object. The relation describes

·  the political containment of a region, road, crossroad or house named object in a region named object. OR

·  the geographical full containment of a region, road, crossroad or house named object in a region named object. OR

·  The geographical partial containment of a region, road, crossroad or house named object in a region named object.

ACCESS_AT_ROAD:

The source named object is a house named object. The target named object is a ROAD named object class. This relation type defines the relation of a house named object being accessed at a road named object.

CROSSROAD_TO_ROAD:

The source named object is a crossroad named object. The target named object is a ROAD named object class. This relation type defines the relation of a crossroad named object to a road named object.

todo: can we replace this relation by a NVC tree?

ROAD_TO_HOUSE:

The source named object is a ROAD named object. The target named object is a HOUSE named object class. This relation type defines the relation of a road named object to a house named object.

todo: do we need an additional direct relation to house number ranges?

PARENT_NVC:

The source named object does not have its own nvc tree but "uses" an nvc tree of a parent. E.g. a build up area does not have its own nvc tree but uses nvc tree of a related city. Parent's named object id must be used when searching for the nvc tree in the NvcTreeTable.

 

 

4,NVCTable。(Next-valid-character

每条记录为一棵tree。包含的字段

   Namedobjectid   对应的nameid

  Nvcsubtreeid     同一个nameid下面可能包含好几个tree,对应同一nameidtreeid才是唯一,当一个nameid下面弄得太多,可以把tree分成多个nvc tree,每一个tree由一个treeid来区分。treeid0treeroot tree

  SelectionCriterion nameid下面哪个criterion类型的查找,比如Namedobjectid对应的名字为“上海市”,SelectionCriterion设置为2(Street),表示tree由上海市下面的道路构建的。

TreeBlob        一棵树的内容。

 

TreeBlob的存储:

   NumNodes          一共包含的节点个数

   TreeNode[NumNodes] 对应的所有节点的数组

一个treenode包含对应的stringString分为2种方式存储,当string对应的只是一个单一的字符时,一个uint8就可以存储下来。当string对应的是多个字符,这时候就需要用utf8string来存储。建tree时候,当一个字符的下一个字符只有一个的时候,可以把这2个字符合并成一个node,依次类推,就可以得到一个node包含多个字符。

Treenode分为3种类型:

Inner内部节点,只是存储了childnode的个数。可以推导出childnode在数组的位置。

Ref关联到同一个nameid下的另一个Nvcsubtreeid当一个tree nodechild node太多时,可以把child node做成一棵单独的tree,它会关联到同一个nameid,但是treeid不同。如上面提到的,对应一个nameidtreeid0的表示root tree

Leaf叶子节点,表示查找到底部了,直接对应一个或多个nameid。对于一棵full nvc来说,leaf总是对应一个nameid。而对于一个combined nvc(考虑到treesize不能太大),当到达一个leaf node时,可能会对应多个nameid,这时候需要应用程序自己完成下一步的比较操作。

SHORT_LEAF, 当叶子节点只对应一个nameid的时候,使用这个结构来存储,这样可以节省存储空间。


Treenode如何关联到对应的childnode,举例如下:

  223,上海市

345,江西省

556,江苏省

437,广东省

997,广西省

  Tree的形状:

 

                  Name Building Block - lz - Arcadia 的博客            [“” child=3]

                    /                   |                       \

1 ("上" 223)        2 ["江" child=2]             3["广" child=2]

                                   /          \                              /              \

                   4("西" 345 )     5 ("苏" 556)       6("东" 437)   7("西" 997)

 

   nvcTree用数组按breadth-first(也叫level-order)的顺序依次存储所有的nodesibling node按照unicode的大小来排序。它的顺序为先存root节点,他总是一个字符为空的inner node(只有root treeroot node才有可能包含string,其他subtreerootnode总是空字符)。然后存储其所有的child node,再存储第一个child node的所有的child node,依次类推。直到存储完所有的node。每个inner node都包含了其child个数。这样的话对于一个inner nodechild node的范围为:在他前面所有的inner nodechild 个数之和 + 1为这个node的第一个child node的下标。

如:对应node3(“广” child=2),它前面所有的inner nodechild总数为5,那么,它的childnode的起始下标为6,个数为2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值