LoginSignup
10
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-27

概要

ブラウザ版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

所感

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

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5