O5M

https://wiki.openstreetmap.org/wiki/O5m


目錄


<h2 id="1">1.Motivation</h2>
已有兩種主流格式:.osm以及.pbf垂寥。為什么還要另外一種呢昏苏?讓我們仔細(xì)看看這兩種最常見的格式驶兜,并嘗試確定它們的優(yōu)缺點(diǎn)。
<h3 id="1.1">1.1 Conventional formats 傳統(tǒng)格式</h3>

1.1.1 .osm

這種數(shù)據(jù)格式是人類可讀的忆某,因?yàn)樗怯肵ML編寫的衡载。通常允乐,文件中的對(duì)象按類型(節(jié)點(diǎn)篓吁、方式茫因、關(guān)系)依次排序,然后按id排序杖剪。XML格式有一些優(yōu)點(diǎn)和缺點(diǎn)冻押。

Advantages

  • 人類可讀
  • 隨機(jī)訪問
  • 可以用普通文本編輯器輕松編輯(當(dāng)不太大時(shí))
  • 可以使用任何壓縮程序進(jìn)行壓縮(見下面)
  • 扁平層次結(jié)構(gòu),可以作為數(shù)據(jù)流處理盛嘿。
  • 兩個(gè)或多個(gè)文件可以很容易合并洛巢。

Disadvantages

  • 巨大的文件大小
  • 處理的速度慢
  • 寫入速度慢(因?yàn)槲募笮√螅?/li>

1.1.2 .osm.bz2

Advantages

  • 更小的文件大小
  • 一些隨機(jī)訪問
  • 扁平層次結(jié)構(gòu),可以作為數(shù)據(jù)流處理
  • 兩個(gè)或多個(gè)文件可以很容易合并次兆。

Disadvantages

  • 不是人類可讀的
  • 用普通的文本編輯器不容易編輯
  • 處理的速度慢
  • 寫入速度慢(因?yàn)閴嚎s)

1.1.3 .pbf

這種優(yōu)化的格式被引入來(lái)消除一些.osm格式的缺點(diǎn)狼渊。它具有一定的靈活性,例如允許地理區(qū)域集群类垦,因此您可以從較大的文件中選擇區(qū)域的數(shù)據(jù)。(這將意味著打破常規(guī)的id順序城须。)

通常的可以從不同位置下載的.pbf文件蚤认,其對(duì)象的順序與傳統(tǒng)的.osm文件相同。

Advantages

  • 小文件大小
  • 可以比.osm處理的更快
  • 內(nèi)置壓縮消除了外部壓縮的需要

Disadvantages

  • 不是人類可讀的
  • 不容易編輯
  • 目前沒有顯著的隨機(jī)訪問
  • 應(yīng)用程序需要zlib packer函數(shù)庫(kù)糕伐。

<h3 id="1.2">1.2 Why a new Format?</h3>
新格式試圖將兩種格式的優(yōu)點(diǎn)結(jié)合起來(lái)砰琢,主要目標(biāo)是:

  • 小文件大小
  • 快速的處理速度
  • 扁平的層次結(jié)構(gòu),可作為數(shù)據(jù)流處理
  • 兩個(gè)或多個(gè)文件可以很容易合并
  • 用戶可以選擇壓縮方法并壓縮文件

不幸的是良瞧,由于加速數(shù)據(jù)處理陪汽,某些目標(biāo)無(wú)法達(dá)到。我們將不得不忍受一些缺點(diǎn):

  • 不是人類可讀的
  • 不能用公共文本編輯器進(jìn)行編輯

此外褥蚯,目前還沒有在o5m文件中隨機(jī)訪問的機(jī)制挚冤,不過如果需要的話,可以很容易地添加這個(gè)機(jī)制赞庶。
<h2 id="2">2. Format description</h2>
新的.o5m格式的結(jié)構(gòu)類似于傳統(tǒng)的.osm格式:對(duì)象使用嚴(yán)格的順序存儲(chǔ)训挡。首先是所有節(jié)點(diǎn),然后是所有的路線歧强,最后是所有的關(guān)系澜薄。在這三組中,對(duì)象按其id順序升序排列摊册。

每個(gè)數(shù)字都是使用Varint格式打包的肤京,您可能從.pbf文件中知道這種格式。字符串包含在零字節(jié)中茅特,或者重復(fù)時(shí)引用忘分。
<h3 id="2.1">2.1 Basics</h3>
要理解格式按摘,最好知道如何存儲(chǔ)數(shù)字字符串杠河。

2.1.1 Numbers

為了存儲(chǔ)不同長(zhǎng)度的數(shù)字,我們放棄了每個(gè)字節(jié)的位7(最重要的位),并使用這個(gè)位作為長(zhǎng)度指示符饥侵。這個(gè)指示符——當(dāng)設(shè)置為1時(shí)——告訴我們下一個(gè)字節(jié)屬于相同的數(shù)字。這樣一個(gè)長(zhǎng)數(shù)字的第一個(gè)字節(jié)包含最不重要的7位拢锹,最后一個(gè)字節(jié)是最重要的7位谎碍。例如:

  • 0x05 = 5
  • 0x7f = 127
  • 0xc3 0x02 = 323

( ==11000011== 00000010

指示符 64 32 16 8 4 2 1 14次方 …… …… …… 1024 512 256 128
1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0

因此256+64+2+1 = 323
)

  • 0x80 0x80 0x01 = 16384

如果一個(gè)數(shù)字存儲(chǔ)為“有符號(hào)型”,我們將需要1位符號(hào)位累盗。為此寒矿,將最小有效字節(jié)的最小值作為符號(hào)位。0表示正若债,1表示負(fù)符相。當(dāng)然,我們不需要數(shù)字-0蠢琳,所以我們可以把負(fù)數(shù)的范圍改為1啊终。例如:

  • 0x08 = +4
  • 0x80 0x01 = +64

( ==11000011== 00000010

指示符 32 16 8 4 2 1 符號(hào)位 13次方 …… …… …… 512 256 128 64
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

因此 1*64 = + 64
)

  • 0x03 = -2
  • 0x05 = -3
  • 0x81 0x01 = -65

要正確地解釋一個(gè)存儲(chǔ)的數(shù)字,我們必須知道它是否存儲(chǔ)為一個(gè)有符號(hào)或者無(wú)符號(hào)的數(shù)字傲须。出于這個(gè)原因蓝牲,我們希望用于存儲(chǔ)OSM信息的格式必須非常準(zhǔn)確地定義。

如你所見泰讽,小數(shù)字比大數(shù)字需要的空間更少例衍。我們的數(shù)據(jù)格式會(huì)盡量避免大數(shù)字。為了達(dá)到這個(gè)目的已卸,我們使用了.pbf格式中的一個(gè)技巧:即delta編碼佛玄。

特別是當(dāng)數(shù)字之間的差別很小的時(shí)候,我們只存儲(chǔ)這些數(shù)字之間的差異累澡。例如梦抢,假設(shè)我們要存儲(chǔ)幾個(gè)節(jié)點(diǎn)的id,比如123000,123050,123055愧哟。這些被存儲(chǔ)為三個(gè)有符號(hào)整數(shù)值:+123000惑申,+50,+5翅雏。

所描述的數(shù)字格式只支持整數(shù)圈驼。為了存儲(chǔ)小數(shù),我們使用定點(diǎn)表示望几。緯度和經(jīng)度被存儲(chǔ)為以100納米為單位的數(shù)值绩脆,即小數(shù)點(diǎn)右移7位。注意,在增量編碼精度值時(shí)靴迫,創(chuàng)建或讀取.o5m文件的應(yīng)用程序使用32位有符號(hào)整數(shù)值而不是64位惕味。出于這個(gè)原因,即使在你期望的情況下玉锌,你也不會(huì)得到任何超出32位有符號(hào)整數(shù)范圍的delta值 -
例如名挥,如果delta數(shù)為358度(179減去 -179)。這些358度的存儲(chǔ)值為正值(714.967.296或0x2a9d8900)主守,因?yàn)樵?2位算術(shù)中禀倔,1.790.000.000 + 714.967.296會(huì)溢出,結(jié)果是-1.790.000.000参淫,這正是我們想要的值救湖。在64位算法中,我們將存儲(chǔ)一個(gè)負(fù)值(-3.580.000.000或0xffffffff2a9d8900)涎才。很明顯鞋既,我們只需要這個(gè)值的最后32位,這正是存儲(chǔ)在32位算術(shù)中的值耍铜。

2.1.2 Strings

字符串沒有打包邑闺,它們按原樣存儲(chǔ)(編碼為UTF-8)。一般來(lái)說(shuō)棕兼,字符串是成對(duì)存儲(chǔ)的陡舅。為了標(biāo)記開始、結(jié)束和字符串對(duì)的兩個(gè)元素之間的位置程储,我們使用零字節(jié)。如果沒有一對(duì)臂寝,但只有一個(gè)字符串章鲤,第二個(gè)元素將被省略。用戶名是用他們的用戶ID打包成一個(gè)字符串咆贬。例如:

  • "oneway"/"yes"被編碼為0x00 0x6f 0x6e 0x65 0x77 0x61 0x79 0x00 0x79 0x65 0x73 0x00
  • "1inner"(inner前是數(shù)字1败徊,編碼為0x31,在關(guān)系中掏缎,數(shù)字“1”表示引用的對(duì)象的類型皱蹦,“0”表示節(jié)點(diǎn),“1”表示路線眷蜈,“2”表示關(guān)系)被編碼為0x00 0x31 0x69 0x6e 0x6e 0x65 0x72 0x00
  • uid=1020沪哺,“John”被編碼為0x00 0xfc 0x07 0x00 0x4a 0x6f 0x68 0x4e 0x00。(用戶id被編碼為unsigned Varint酌儒,并打包到該字符串對(duì)的第一個(gè)字符傳中辜妓。將id編碼為Varint有助于節(jié)省幾個(gè)字節(jié)的空間。

Varint編碼 :0xfc 0x07 = 1111 1100 0000 0111 = 4+8+ 16+32+64 +128+256+512 = 1020

UTF-8編碼:0x4a 0x6f 0x68 0x4e ->John
)

要做到這一點(diǎn),每個(gè)字符串都需要花費(fèi)大量的空間籍滴。幸運(yùn)的是酪夷,OSM中的大多數(shù)字符串都成對(duì)出現(xiàn),并不斷重復(fù)孽惰。以"highway"/"residential""building"/"yes"為例晚岭。這允許我們?cè)谌魏螘r(shí)候重用以前遇到的一對(duì)字符串時(shí)使用引用。

To refer to a string pair which has already been defined in the way shown above, we count the string pair definitions from the present location in the file back to that definition which matches our string pair.
為了引用已經(jīng)在上面所示的方式定義的字符串對(duì)勋功,我們將字符串對(duì)定義從文件當(dāng)前位置返回到與我們的字符串對(duì)匹配的定義坦报。使用相同的方法將該計(jì)數(shù)存儲(chǔ)為無(wú)符號(hào)的數(shù)字,該方法在前面的章節(jié)中已經(jīng)描述過酝润。

為了限制解碼器程序必須分配的最大內(nèi)存數(shù)量燎竖,我們可以引用的不同的字符串對(duì)的數(shù)量是有限制的,并且它們的長(zhǎng)度是有限制的:

  • 字符串參考數(shù)量的最大值:15000(選擇15,000的限制是因?yàn)閺?6384和以上要销,此時(shí)將需要三字節(jié)而不是兩字節(jié)來(lái)存儲(chǔ)引用值构回。)。
  • 在參考表中存儲(chǔ)的字符串的最大長(zhǎng)度:總共250個(gè)字符疏咐。(之所以選擇250個(gè)字符纤掸,是因?yàn)楹苌儆凶址^這個(gè)最大值。在內(nèi)部浑塞,字符串表需要有252個(gè)字符的行大小借跪,因?yàn)榻K端也必須存儲(chǔ)。當(dāng)通過索引訪問表時(shí)酌壕,建議定義256個(gè)字符的行大小掏愁。)

當(dāng)讀取一個(gè).o5m編碼的文件時(shí),我們使用一個(gè)有15000行卵牍,250+2個(gè)字符的引用表(出于性能考慮:使用256個(gè)字符)果港。我們遇到的每個(gè)字符串對(duì)都被復(fù)制到表中,只有一個(gè)例外:字符串對(duì)的長(zhǎng)度超過250個(gè)字符糊昙,但不會(huì)被復(fù)制到表中辛掠。

如果表中沒有空間容納新的字符串對(duì),那么最老的字符串對(duì)將被覆蓋释牺。該表作為FIRO(先進(jìn)萝衩,隨機(jī)輸出)。地址以1開頭没咙,表示“最新存儲(chǔ)字符串”猩谊。地址2表示“第二個(gè)最新存儲(chǔ)字符串”,等等祭刚。

注意预柒,字符串通常存儲(chǔ)為字符串對(duì)队塘,即使定義為單個(gè)字符串。

下面是一個(gè)如何存儲(chǔ)幾個(gè)字符串的示例:

  • "oneway"/"yes"
  • "atm"/"no"
  • "oneway"/"yes"
  • uid=1020,"John"
  • "atm"/"no"
  • "oneway"/"yes"
  • uid=1020,"John"

它們的編碼如下:

  • 0x00 0x6f 0x6e 0x65 0x77 0x61 0x79 0x00 0x79 0x65 0x73 0x00
  • 0x00 0x61 0x74 0x6d 0x00 0x6e 0x6f 0x00
  • 0x02 (倒回2個(gè)的引用)
  • 0x00 0xfc 0x07 0x00 0x4a 0x6f 0x68 0x4e 0x00 (Varint + UTF8)
  • 0x02 (倒回2個(gè)的引用,Varint+UTF8的不算)
  • 0x03
  • 0x01 (倒回1個(gè)Varint+UTF8的引用)

<h3 id="2.2">2.2 File</h3>

每一個(gè).o5m文件以字節(jié)0xff開始宜鸯,以字節(jié)0xfe結(jié)束憔古。每個(gè)數(shù)據(jù)集從一個(gè)特定的字節(jié)開始:

  • 0x10:node
  • 0x11:way
  • 0x12:relation
  • 0xdb:bounding box
  • 0xdc:file timestamp
  • 0xe0:頭,應(yīng)該緊跟文件的第一個(gè)0xff淋袖;內(nèi)容為:0x04 0x6f 0x35 0x6d 0x32 ("o5m2"),或者對(duì)于.o5m變更文件是0x04 0x6f 0x35 0x63 0x32 ("o5c2")
  • 0xee:Sync
  • 0xef:Jump
  • oxff:(不是數(shù)據(jù)集)在文件內(nèi)容的某處:重置鸿市。

每個(gè)數(shù)據(jù)集的第二個(gè)字節(jié),如果需要即碗,因?yàn)橹荡笥?27焰情,則下面的字節(jié)包含長(zhǎng)度信息,編碼為無(wú)符號(hào)數(shù)(見上文)剥懒。如果解碼程序不理解一個(gè)特定的數(shù)據(jù)集内舟,它將跳過它的內(nèi)容。長(zhǎng)度信息不包括長(zhǎng)度字節(jié)本身初橘,也不包括數(shù)據(jù)集的開始字節(jié)验游。

注意,在從0xf00xff的范圍內(nèi)沒有長(zhǎng)度信息保檐,因此程序必須跳過一個(gè)字節(jié)耕蝉。

<h3 id="2.3">2.3 Node</h3>

每個(gè)節(jié)點(diǎn)數(shù)據(jù)集從0x10開始,然后是數(shù)據(jù)集長(zhǎng)度數(shù)據(jù)夜只。數(shù)據(jù)字段:

ox10 數(shù)據(jù)集長(zhǎng)度 數(shù)據(jù)
  • id (有符號(hào)垒在,增量編碼)

  • 0x00 或版本信息:

    • 版本 (無(wú)符號(hào))

    • 時(shí)間戳(自1970年以來(lái)的秒,有符號(hào)扔亥,增量編碼)

    • 作者信息 - 僅當(dāng)時(shí)間戳不為0時(shí):

      • 變更集(有符號(hào)场躯,增量編碼)
      • uid,user (字符串對(duì))
  • 經(jīng)度(有符號(hào)旅挤,增量編碼)

  • 緯度(有符號(hào)踢关,增量編碼)

  • 標(biāo)簽:

    • key, val (字符串對(duì))
    • key, val (字符串對(duì))
    • ...

例如:

  • 0x10 - 節(jié)點(diǎn)

  • 0x21 - 此節(jié)點(diǎn)的以下數(shù)據(jù)的長(zhǎng)度:33字節(jié)

  • 0xce 0xad 0x0f - id: 0+125799 = 125799

  • 0x05 - version:5

  • 0xe4 0x8e 0xa7 0xca 0x09 - 時(shí)間戳: 2010-09-30T19:23:30Z

  • 0x94 0xfe 0xd2 0x05 - 變更集:0+5922698 = 5922698

  • 0x00 - 字符串對(duì):

    • 0x85 0xe3 0x02 0x00 - uid: 45445
    • 0x55 0x53 0x63 0x68 0x61 0x00 - user:"UScha"
  • 0x86 0x87 0xe6 0x53 - 經(jīng)度: 0+8.7867843 = 8.7867843

  • 0xcc 0xe2 0x94 0xfa 0x03 - 緯度: 0+53.0749606 = 53.0749606

  • 0x10 – 節(jié)點(diǎn)

  • 0x0d - 此節(jié)點(diǎn)的以下數(shù)據(jù)的長(zhǎng)度:13字節(jié)

  • 0x02 – id: 125799+1 = 125800

  • 0x0a – 版本號(hào): 10

  • 0xd2 0x1f – 時(shí)間戳(增量編碼): 2010-09-30T19:23:30Z+2025s=2010-09-30T19:57:15Z

  • 0xe2 0x04 – 變更集(增量編碼): 5922698+305 = 5923003

  • 0x01 – 字符串對(duì): 引用 前1

    • uid: 45445
    • user: "UScha"
  • 0x89 0xae 0x03 – 經(jīng)度(增量編碼): 8.7867843-27525 = 8.7840318

  • 0xe5 0xd8 0x03 - 緯度(增量編碼):53.0749606-0.0030259 = 53.0719347

這個(gè)例子的OSM XML格式文件如下:

<node id="125799" lat="53.0749606" lon="8.7867843" version="5" changeset="5922698" user="UScha" uid="45445" timestamp="2010-09-30T19:23:30Z"/>
<node id="125799" lat="53.0749606" lon="8.7867843" version="5" changeset="5922698" user="UScha" uid="45445" timestamp="2010-09-30T19:23:30Z"/>

注意,可以通過減少數(shù)據(jù)集的長(zhǎng)度(數(shù)據(jù)集的第二字節(jié))來(lái)縮短數(shù)據(jù)集谦铃。解碼程序必須處理這樣的剪切數(shù)據(jù)集耘成,并接受它們不包含鍵/val對(duì)榔昔、緯度/經(jīng)度驹闰,甚至不包含作者信息。如果數(shù)據(jù)集以這樣的方式被剪切撒会,只剩下它的正文(id和可能的版本和作者信息)嘹朗,程序應(yīng)該執(zhí)行一個(gè)delete操作,并使用這個(gè)id刪除對(duì)象(參見下面诵肛,section .o5c)屹培。

<h3 id="2.4">2.4 Way</h3>
數(shù)據(jù)集從0x11開始默穴,然后是數(shù)據(jù)集長(zhǎng)度數(shù)據(jù)。數(shù)據(jù)字段:

  • id (有符號(hào)褪秀,增量編碼)

  • 0x00 或版本信息:

    • 版本 (無(wú)符號(hào))

    • 時(shí)間戳(自1970年以來(lái)的秒蓄诽,有符號(hào),增量編碼)

    • 作者信息 - 僅當(dāng)時(shí)間戳不為0時(shí):

      • 變更集(有符號(hào)媒吗,增量編碼)
      • uid仑氛,user(字符串對(duì))
  • 引用部分的長(zhǎng)度(無(wú)符號(hào))

  • 節(jié)點(diǎn)引用部分(如果長(zhǎng)度>0)

    • 引用節(jié)點(diǎn)的id(有符號(hào),delta編碼)
    • 引用節(jié)點(diǎn)的id(有符號(hào)闸英,delta編碼)
    • ...
  • 標(biāo)簽:

    • key, val (字符串對(duì))
    • key, val (字符串對(duì))
    • ...

例如:

  • 0x11 - 路線
  • 0x20 - 此路線的以下數(shù)據(jù)長(zhǎng)度:32字節(jié)
  • 0xec 0x9b 0xe8 0x03 – id: 0+3999478 = 3999478
  • 0x00 -沒有版本和作者信息
  • 0x07 -節(jié)點(diǎn)引用區(qū)域的長(zhǎng)度: 7字節(jié)
    • 0xce 0xb9 0xfe 0x13 - 引用節(jié)點(diǎn):0+20958823 = 20958823
    • 0xce 0xeb 0x01 – 引用節(jié)點(diǎn)(增量編碼): 20958823+15079=20973902
  • 0x00 - 字符串對(duì)
    • 0x68 0x69 0x67 0x68 0x77 0x61 0x79 0x00 - key:"highway"
    • 0x73 0x65 0x63 0x6f 0x6e 0x64 0x61 0x72 0x79 0x00 - val: "secondary"

OSM XML格式的例子:

<way id="3999478">
  <nd ref="20958823"/>
  <nd ref="20973902"/>
<tag k="highway" v="secondary" />
</way>

<h3 id="2.5">2.5 Relation</h3>
每個(gè)關(guān)系數(shù)據(jù)集從0x12開始锯岖,然后是數(shù)據(jù)集長(zhǎng)度數(shù)據(jù)。數(shù)據(jù)字段:

  • id (有符號(hào)甫何,增量編碼)

  • 0x00 或版本信息:

    • 版本 (無(wú)符號(hào))

    • 時(shí)間戳(自1970年以來(lái)的秒出吹,有符號(hào),增量編碼)

    • 作者信息 - 僅當(dāng)時(shí)間戳不為0時(shí):

      • 變更集(有符號(hào)辙喂,增量編碼)
      • uid捶牢,user(字符串對(duì))
  • 引用部分的長(zhǎng)度(無(wú)符號(hào))

  • 引用部分(如果長(zhǎng)度>0)

    • 引用信息:
      • 被引用對(duì)象的id(有符號(hào),delta編碼)
      • 對(duì)象類型(“0”..“2”)與角色連接(單個(gè)字符串)
    • 引用信息:
      • 被引用對(duì)象的id(有符號(hào)加派,delta編碼)
      • 對(duì)象類型(“0”..“2”)與角色連接(單個(gè)字符串)
    • ...
  • 標(biāo)簽:

    • key, val (字符串對(duì))
    • key, val (字符串對(duì))
    • ...

例如:

  • 0x12 - 關(guān)系
  • 0x28 - 該關(guān)系的以下數(shù)據(jù)長(zhǎng)度:40個(gè)字節(jié)叫确。
  • 0x90 0x2e - id: 0+2952 = 2952
  • 0x00 - 無(wú)版本號(hào)和作者信息
  • 0x11 - 引用部分的長(zhǎng)度:17字節(jié)
    • 引用信息:
      • 0xf4 0x98 0x83 0x0b - id: 0+11560506 = 11560506
      • 0x00 - string pair:
        • 0x31 - 類型:路線
        • 0x69 0x6e 0x6e 0x65 0x72 0x00 - 角色:"inner"
    • 引用信息:
      • 0xca 0x93 0xd3 0x0d - id(增量編碼): 11560506+14312677=25873183
      • 0x01 - string pair:引用 前1
        • 類型:路線
        • 角色:"inner"
  • 0x00 - 字符串對(duì):
    • 0x74 0x79 0x70 0x65 0x00 - key:"type"
    • 0x6d 0x75 0x6c 0x74 0x69 0x70 0x6f 0x6c 0x79 0x67 0x6f 0x6e 0x00 - val:"multipolygon"

OSM XML格式的例子:

<relation id="2952">
  <member type="way" ref="11560506" role="inner"/>
  <member type="way" ref="25873183" role="inner"/>
  <tag k="type" v="multipolygon" />
</relation>

<h3 id="2.6">2.6 File Timestamp</h3>
這是一個(gè)可選的數(shù)據(jù)集。它以0xdc開始芍锦,然后是文件的時(shí)間戳竹勉。該單位從1970年1月1日開始的秒數(shù):

  • 文件時(shí)間戳 (有符號(hào)型)

如果該數(shù)據(jù)集用于文件,那么它必須存儲(chǔ)在任何OSM對(duì)象之前娄琉,即在任何節(jié)點(diǎn)次乓、路線或關(guān)系之前。

<h3 id="2.7">2.7 Bounding Box</h3>
這個(gè)(可選的)數(shù)據(jù)集從0xdb開始孽水,然后是數(shù)據(jù)集長(zhǎng)度邊界框坐標(biāo)票腰。

  • 西南角
    • x1(經(jīng)度,有符號(hào))
    • y1(緯度,有符號(hào))
  • 東北角
    • x1(經(jīng)度,有符號(hào))
    • y1(緯度,有符號(hào))

類似于文件時(shí)間戳(見上面),必須在任何OSM對(duì)象之前(即在任何節(jié)點(diǎn)女气、路線或關(guān)系之前)存儲(chǔ)該文件杏慰。

<h3 id="2.8">2.8 Reset</h3>
重置字節(jié)0xff告訴編碼器重新設(shè)置計(jì)數(shù)器。此時(shí)炼鞠,每個(gè)增量編碼將從0開始缘滥,沒有使用字符串引用,這將在重置字節(jié)之前引用文件內(nèi)容谒主。

這個(gè)機(jī)制是它允許.o5m文件通過不同的線程并行處理朝扼。通常,至少開始的路線和關(guān)系部分將由重置字節(jié)開始霎肯。

注意擎颖,0xff不啟動(dòng)數(shù)據(jù)集;因此榛斯,沒有長(zhǎng)度信息會(huì)跟隨0xff

<h3 id="2.9">2.9 Sync</h3>
如果您需要將OSM數(shù)據(jù)作為流處理搂捧,您將需要一些您可以同步的位置驮俗。這些同步點(diǎn)在解析32位零的數(shù)據(jù)流時(shí)可以找到它們。每個(gè)同步數(shù)據(jù)集必須有一個(gè)重置字節(jié)允跑。否則意述,如果使用增量編碼,您將無(wú)法解碼隨后存儲(chǔ)的OSM數(shù)據(jù)集吮蛹。語(yǔ)法如下:

  • 0xee 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xff

如果開發(fā)一個(gè)不使用這個(gè)同步機(jī)制的解析器程序荤崇,您不需要關(guān)心同步數(shù)據(jù)集,因?yàn)檫@些數(shù)據(jù)集將被識(shí)別為“未知數(shù)據(jù)集”潮针,因此被忽略术荤。

<h3 id="2.10">2.10 Jump</h3>
要獲得隨機(jī)訪問,而不僅僅是訪問其中一個(gè)節(jié)的開頭(節(jié)點(diǎn)的開始每篷,路線的開始瓣戚,關(guān)系的開始),你可以定義額外的跳轉(zhuǎn)點(diǎn)作為跳轉(zhuǎn)數(shù)據(jù)集焦读。這些跳轉(zhuǎn)點(diǎn)允許您快速地在文件中向前和向后移動(dòng)子库。

跳轉(zhuǎn)數(shù)據(jù)集以0xef開始,然后是數(shù)據(jù)集長(zhǎng)度數(shù)據(jù)矗晃。數(shù)據(jù)字段:

  • 到下一個(gè)跳轉(zhuǎn)數(shù)據(jù)集的距離(從0xef0xef字節(jié)仑嗅,無(wú)符號(hào))
  • 到上一個(gè)跳轉(zhuǎn)數(shù)據(jù)集的距離(從0xef0xef字節(jié),無(wú)符號(hào))
  • 未使用的內(nèi)存空間的一些字節(jié)(如果稍后輸入距離张症,并且在寫入Jump數(shù)據(jù)集時(shí)這些值的空間未知)必須設(shè)置為0xff仓技。

每個(gè)跳轉(zhuǎn)數(shù)據(jù)集必須接著一個(gè)重置字節(jié)。
否則俗他,如果使用增量編碼脖捻,您將無(wú)法解碼隨后存儲(chǔ)的OSM數(shù)據(jù)集。例如:

  • 0xef 0x07 0x80 0x04 0x40 0xff 0xff 0xff 0xff 0xff – 512 向前, 64 向后

如果開發(fā)一個(gè)不使用這個(gè)跳轉(zhuǎn)機(jī)制的解析器程序兆衅,您不需要關(guān)心跳轉(zhuǎn)數(shù)據(jù)集地沮,因?yàn)檫@些數(shù)據(jù)集將被識(shí)別為“未知數(shù)據(jù)集”,因此被忽略羡亩。

<h2 id="3">3.File Size Comparison</h2>
OSM數(shù)據(jù)文件的大小取決于所使用的格式摩疑。來(lái)自geofabrik.de的2011- 5 -12德國(guó)文件被用作這種比較的基礎(chǔ)。壓縮算法.gz和.7z是用默認(rèn)參數(shù)(中等壓縮強(qiáng)度)完成的夕春。pbf使用內(nèi)部的zlib壓縮未荒。

OSM File Format and Compression Type Size in Bytes Relative Size Reading Time (slow computer)
germany.osm 15,519,707,799 100.0 % 604 s
germany.osm.bz2 1,442,403,577 9.3 %
germany.o5m 1,469,972,938 9.5 % 36 s
germany.o5m.gz 949,544,868 6.1 %
germany.o5m.7z 851,845,615 5.5 %
germany.pbf 948,980,117 6.1 % 90 s

如果您丟棄元數(shù)據(jù)(時(shí)間戳专挪、用戶名等)及志,文件大小將減少:

OSM File Format and Compression Type Size in Bytes Relative Size Reading Time (slow computer)
germany.osm (excl. meta data) 7,937,414,195 51.1 %
germany.o5m (excl. meta data) 1,046,676,637 6.7 %
germany.o5m.gz (excl. meta data) 730,187,675 4.7 %
germany.o5m.7z (excl. meta data) 647,320,555 4.2 %
germany.pbf (excl. meta data) 697,041,975 4.5 %

<h2 id="4">4.Further Information</h2>

<h3 id="4.1">4.1 Why that strange Name片排?</h3>
之所以選擇o5m,是因?yàn)樗雌饋?lái)有點(diǎn)像osm速侈。數(shù)字5代表“比率寡。osm小5倍”。同時(shí)倚搬,我們知道因子是10冶共,而不是5。但是每界,o10m的聲音會(huì)有多傻呢?

<h3 id="4.2">4.2 .5c as OSM Change Format</h3>
你很容易使用.o5m格式來(lái)存儲(chǔ)OSM更改文件捅僵。文件的數(shù)據(jù)結(jié)構(gòu)沒有區(qū)別,只有一個(gè)例外:文件頭包含“o5c2”而不是“o5m2”眨层。對(duì)于文件名庙楚,建議使用擴(kuò)展名.o5c代替.o5m。

我們?nèi)绾翁幚?lt;create> , <modify>和<delete> 這些在.osc格式中是眾所周知的標(biāo)簽?zāi)?好吧趴樱,這些標(biāo)簽并沒有真正的目的——除非你想用它們來(lái)進(jìn)行貌似可信的檢查馒闷。創(chuàng)建修改產(chǎn)生相同的操作結(jié)果:所引用對(duì)象的新版本將被存儲(chǔ);所以我們簡(jiǎn)單地把對(duì)象的版本與最新的更改文件一起存儲(chǔ)并保存。刪除是一個(gè)特殊的操作叁征,我們將不得不定義自己的.o5c對(duì)象類型纳账。 但是,要?jiǎng)h除一個(gè)對(duì)象捺疼,我們只需要它的id就可以了疏虫。 因此我們決定,如果文件中沒有任何內(nèi)容存儲(chǔ)在對(duì)象中(除了它的id)(也可能是它的版本或作者信息)啤呼,這意味著這個(gè)id引用的對(duì)象將被刪除议薪。

<h3 id="4.3">4.3 Future Extensions</h3>
如果由于新的OSM api,數(shù)據(jù)格式需要額外的需求媳友,我們會(huì)怎么做?這不應(yīng)該是個(gè)問題斯议。有239個(gè)o5m數(shù)據(jù)集id(范圍0x01到0xdf);目前,只有3個(gè)在使用:0x10用于節(jié)點(diǎn)醇锚,0x11用于路線哼御,0x12用于關(guān)系。Varint數(shù)格式和字符串格式也可以用于任何目的焊唬。

<h3 id="4.4">4.4 Is there an Example Implementation?</h3>

文件格式已被完全描述恋昼,因此您可以使用任何您喜歡的編程語(yǔ)言從零開始實(shí)施.o5m讀寫器。 不過赶促,看一下.o5m閱讀器示例代碼(用C語(yǔ)言編寫)或osmconvert液肌,osmfilter等的源代碼可能是有用的。

<h2 id="5">5. Software supporting .o5m</h2>

數(shù)據(jù)格式非常新鸥滨,所以這個(gè)列表非常短嗦哆。

<h3 id="5.1"> 5.1 Programs already support .o5m</h3>

  • osmconvert - .osm,.osc,.osh,.pbf, .05m, .o5c格式之間的轉(zhuǎn)換谤祖,應(yīng)用更改文件和邊界多邊形,創(chuàng)建diffs老速。
  • osmfilter - 篩選OSM對(duì)象和標(biāo)記粥喜,考慮層次依賴性。
  • osmupdate - 通過互聯(lián)網(wǎng)下載更新OSM數(shù)據(jù)文件橘券。
  • navit map tool - 將OSM數(shù)據(jù)導(dǎo)入到navit额湘。
  • osm2po - OSM數(shù)據(jù)導(dǎo)入osm2po路由引擎。
  • osm2pgsql - 將OSM數(shù)據(jù)導(dǎo)入到PostgreSQL數(shù)據(jù)庫(kù)中旁舰。
  • o5mreader - 以O(shè)5M格式解析OpenStreetMap數(shù)據(jù)的C庫(kù)锋华。
  • mkgmap - 為Garmin設(shè)備繪制來(lái)自O(shè)penStreetMap的地圖
  • splitter – 瓷磚為mkgmap分配器
  • o5m4j - 由Java寫的o5m數(shù)據(jù)閱讀器
  • OSMemory - Java庫(kù)驗(yàn)證器
  • phyghtmap - 生成等高線.osm,.pbf和.o5m來(lái)自NASA SRTM和類似的數(shù)據(jù)。

<h3 id="5.2"> 5.2 Toolchains using .o5m</h3>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末箭窜,一起剝皮案震驚了整個(gè)濱河市供置,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绽快,老刑警劉巖芥丧,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坊罢,居然都是意外死亡续担,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門活孩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)物遇,“玉大人,你說(shuō)我怎么就攤上這事憾儒⊙耍” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵起趾,是天一觀的道長(zhǎng)诗舰。 經(jīng)常有香客問我,道長(zhǎng)训裆,這世上最難降的妖魔是什么眶根? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮边琉,結(jié)果婚禮上属百,老公的妹妹穿的比我還像新娘。我一直安慰自己变姨,他們只是感情好族扰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般渔呵。 火紅的嫁衣襯著肌膚如雪怒竿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天厘肮,我揣著相機(jī)與錄音,去河邊找鬼睦番。 笑死类茂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的托嚣。 我是一名探鬼主播巩检,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼示启!你這毒婦竟也來(lái)了兢哭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤夫嗓,失蹤者是張志新(化名)和其女友劉穎迟螺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舍咖,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矩父,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了排霉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窍株。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖攻柠,靈堂內(nèi)的尸體忽然破棺而出球订,到底是詐尸還是另有隱情,我是刑警寧澤瑰钮,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布冒滩,位于F島的核電站,受9級(jí)特大地震影響浪谴,放射性物質(zhì)發(fā)生泄漏旦部。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一较店、第九天 我趴在偏房一處隱蔽的房頂上張望士八。 院中可真熱鬧,春花似錦梁呈、人聲如沸婚度。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝗茁。三九已至醋虏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哮翘,已是汗流浹背颈嚼。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饭寺,地道東北人阻课。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艰匙,于是被迫代替她去往敵國(guó)和親限煞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 11,007評(píng)論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理员凝,服務(wù)發(fā)現(xiàn)署驻,斷路器,智...
    卡卡羅2017閱讀 134,707評(píng)論 18 139
  • 我怎么會(huì)取了一個(gè)這么無(wú)聊的名字健霹?今天周四后天就要考試了旺上,還是梳理一下思路吧! 目前糖埋,我的論文還需要更熟悉抚官。 然后我...
    丑桔不上火閱讀 296評(píng)論 0 0
  • 初來(lái)乍到的時(shí)候聽說(shuō)這里的學(xué)生基礎(chǔ)很差,我在想應(yīng)該不會(huì)差到哪吧阶捆,當(dāng)上課簡(jiǎn)單不能再簡(jiǎn)單的知識(shí)還是無(wú)法理解的時(shí)候凌节,當(dāng)學(xué)生...
    午夜的月光閱讀 174評(píng)論 0 0