Edited at

GoogleマップURLのパラメータブロック構文

More than 1 year has passed since last update.


概要

ブラウザ版GoogelaマップのURLには'!'で区切られた謎パラメータ群が付いてくることがよくあります。

例えばこんなのです:


https://www.google.com/maps/place/%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB%E5%90%88%E5%90%8C%E4%BC%9A%E7%A4%BE/@35.660411,139.7287178,19z/data=!3m2!4b1!5s0x60188b77a7f6fcf5:0x60c9ffa23520351!4m5!3m4!1s0x60188b770913970d:0xccc3467fcb15b353!8m2!3d35.660411!4d139.729265


このURLの"data="以降がこの記事で対象にするパラメータブロック部分です。


!3m2!4b1!5s0x60188b77a7f6fcf5:0x60c9ffa23520351!4m5!3m4!1s0x60188b770913970d:0xccc3467fcb15b353!8m2!3d35.660411!4d139.729265


いったいこのURLは何を言っているのか、気になる人には非常に気になり、気にならない人には本当にどうでもいい事柄かと思いますが、私気になりますので調べました。

この呪文に行きあたって心が折れた人の支えになれれば幸いです。


注意

この記事ではパラメータブロックの構文のみに注目しています。

パラメータブロックが指し示す意味や動作については言及しませんので、悪しからずご了承ください。

また、記載内容は私が勝手に推測したものです。間違っている可能性もあることに留意してください。


正体

インデックス、型、値で構成される要素の配列を表現しています。配列は入れ子構造を取ることができます。

最上位にルート配列が存在します。

上記の例ですと、

!3m2!4b1!5s0x60188b77a7f6fcf5:0x60c9ffa23520351!4m5!3m4!1s0x60188b770913970d:0xccc3467fcb15b353!8m2!3d35.660411!4d139.729265

これは次のように展開されます:

!3m2

!4b1
!5s0x60188b77a7f6fcf5:0x60c9ffa23520351
!4m5
!3m4
!1s0x60188b770913970d:0xccc3467fcb15b353
!8m2
!3d35.660411
!4d139.729265

長い行も短い行もありますが、すべて1行1要素で記述してあります。

要素は全てインデックスと型と値を持ち、型に応じて値の記述フォーマットが変わってきます。


要素

要素は全て次の構文で構成されます。例外は確認していません。

! + インデックス(整数) + 型(英字1文字) + 値(文字列)

各部の連結部にスペースなどを含むことは許されません。

インデックスは正の整数のみが許されるものと思われます。0以下の値は確認していません。

型の大文字小文字は区別されます。確認されている例ではすべて英小文字です。


要素
インデックス

!3m2
3
m(配列)
2(続く2要素が配列に含まれる)

!4b1
4
b(論理値)
1(true)

!5s0x6018...
5
s(文字列)
0x6018...

!4m5
4
m(配列)
5(続く5要素が配列に含まれる)

!3m4
3
m(配列)
4(続く4要素が配列に含まれる)

!1s0x6018...
1
s(文字列)
0x6018...

!8m2
8
m(配列)
2(続く2要素が配列に含まれる)

!3d35.660411
3
d(実数)
35.660411

!4d139.729265
4
d(実数)
139.729265


インデックス

配列の添字とは異なります。構文的には重複が許され、インデックスの重複するすべての要素が有効です。

ただし解釈する側で取捨される状況はあり得ます。

列挙型の要素が同じインデックスで並ぶ例はよく見られます。

インデックスの数値が連続する必要はなく、数値の大小関係に従った並び順も(おそらく)求められません。


型と値

一覧を次に示します:



備考

m
配列要素数(0以上の整数)
値は後に続く要素数を示す
子配列の要素数も含むことに注意

b
真偽値
(0=偽,1=真,それ以外もたぶん真)

i
整数

d
実数

e
列挙値(整数)

u
符号なし整数?
見かけたことがあるような気がする

h
16進数
見かけたことがあるような気がする。
"0x"のような接頭詞は付かなかったような気がする

s
文字列
原則的にはURIエンコードされている
たまに'+'をスペースにデコードしない受け手の処理系があるので注意
(その場合は%20でエンコードする)

z
文字列?
たまにある。sとの違いは不明


配列

'm'で示される配列要素の注意点を挙げます。


要素数の解釈

要素数は子配列の要素数も含みます。

!1m3!2m2!3i0!4i0!5i0!6i0!7i0 というパラメータブロックがあった場合、

次の解釈は間違いです:

!1m4

!2m2 //1m4の要素1
!3i0
!4i0
!5i0 //1m4の要素2
!6i0 //1m4の要素3
!7i0 //1m4の要素4

正しい解釈は次の通りです:

!1m4

!2m2
!3i0
!4i0
!5i0 //ここまでの4要素が!1m4の下に付く
!6i0
!7i0

正しく生成されたパラメータブロックであれば、ネストした配列要素数の帳尻は合うはずです。


要素数0の配列

あり得ます。実例も確認されています。

!1m0!2m2!3i0!4i0 というパラメータブロックはルール通りに次のように解釈されます:

!1m0

!2m2
!3i0
!4i0


所感

ほんとに誰得な情報ですが、これと格闘する羽目になった場合にパーサーを書くのは結構楽しい作業になります。お勧めです。