web-dev-qa-db-ja.com

Googleマップの埋め込みパラメーターのデコード

コンテキスト

Webサイトに埋め込まれたGoogleマップの場所を抽出できるようにしたいと思います(ランダムな例は このWebサイト の下部にあります)。

<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3128.340699934565!2d-0.46482818466529047!3d38.3642391796565!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0xd62377123a70817%3A0x85e89b65fcf7c648!2sCalle+Cruz+de+Piedra%2C+4%2C+03015+Alicante!5e0!3m2!1ses!2ses!4v1476192292052" width="100%" height="350" frameborder="0" style="border:0" allowfullscreen=""></iframe>

したがって、基本的にはマップのURLから正確な位置を抽出したいと思います。

https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3128.340699934565!2d-0.46482818466529047!3d38.3642391796565!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0xd62377123a70817%3A0x85e89b65fcf7c648!2sCalle+Cruz+de+Piedra%2C+4%2C+03015+Alicante!5e0!3m2!1ses!2ses!4v1476192292052

URLデザイン

ここではGoogleが独自のパラメータ設計を使用しているようです。この ブログエントリ および このStackoverflowの投稿 は、これらのパラメーターをどのように理解できるかを要約したものです。パラメータは(![id][type][value])のように構造化され、タイプは次のとおりです。

m: matrix
f: float
d: double
i: integer
b: boolean
e: enum (as integer)
s: string
u: unsigned int

マトリックスは、複数のデータエントリをカプセル化できます。 g。 !1m3!1i2!1i4!1i17は、ID 1の行列に3つの整数値[2, 4, 17]が含まれていることを意味します。

この知識があれば、パラメーターは次のように構成できます。

!1m18
  !1m12
    !1m3
      !1d3128.340699934565
      !2d-0.46482818466529047
      !3d38.3642391796565
    !2m3
      !1f0
      !2f0
      !3f0
    !3m2
      !1i1024
      !2i768
      !4f13.1
  !3m3
    !1m2
      !1s0xd62377123a70817:0x85e89b65fcf7c648
      !2sCalle Cruz de Piedra, 4, 03015 Alicante
  !5e0
!3m2
  !1ses
  !2ses
!4v1476192292052

簡単なように見えますが、座標はほとんどクリアテキストで表示されます。しかし ブログエントリ が指摘するように、パラメータ

!1d3128.340699934565
!2d-0.46482818466529047
!3d38.3642391796565

ピンポイントの位置ではありませんが、表示されたマップの中心です。それらは似ていますが、時には非常に異なります。座標や住所を変更しても、別のマップにはなりません

パラメータ!1s0xd62377123a70817:0x85e89b65fcf7c648を変更した場合のみ、マップ表示が壊れます。つまり、このパラメータはピンポイントの位置をデコードします。

ただ、どのエンコーディングで?

質問

ブログエントリ (2016年8月以降)では、マップリンクの作成方法が異なります。経度と緯度の座標をbase64でエンコードする別のパラメーターがあります。

zMzfCsDQ3JzM0LjUiUyAxNDXCsDAwJzU2LjYiRQ ----base64---> 37°47'34.5"S 145°00'56.6"E

同様に、この新しいパラメーターの座標はうまくいけばデコードされます。

0xd62377123a70817:0x85e89b65fcf7c648 ----????----> 38.364236,-0.462649

16進エンコーディングのように見えますが、整数(964394229279688727:9649133063979386440)に変換する場合、これは私が知っているシステムの地理座標に対応していません。

では、誰がコードを解読できるでしょうか?助けてくれてありがとう。

18
Manu CJ

この中間体は最終的な答えではなく、続編が続きます))、いくつかの考え

文書化されていないメソッド。 (代わりにtfidを使用placeid
Places API Webサービス
今後は保証なし:

https://maps.googleapis.com/maps/api/place/details/json?key=YOUR_API_KEY&ftid=0xd62377123a70817:0x85e89b65fcf7c648&

文書化されたリクエストは次のとおりです。

https://maps.googleapis.com/maps/api/place/details/json?key=YOUR_API_KEY&placeid=ChIJFwinI3E3Yg0RSMb3_GWb6IU

このリクエストにはAPIキーが必要 APIキーの設定

Googleからの回答:(JSON-軽い解析)

{
   "html_attributions" : [],
   "result" : {
      "address_components" : [
         {
            "long_name" : "4",
            "short_name" : "4",
            "types" : [ "street_number" ]
         },
         {
            "long_name" : "Calle Cruz de Piedra",
            "short_name" : "Calle Cruz de Piedra",
            "types" : [ "route" ]
         },
         {
            "long_name" : "Alacant",
            "short_name" : "Alacant",
            "types" : [ "locality", "political" ]
         },
         {
            "long_name" : "Alicante",
            "short_name" : "A",
            "types" : [ "administrative_area_level_2", "political" ]
         },
         {
            "long_name" : "Comunidad Valenciana",
            "short_name" : "Comunidad Valenciana",
            "types" : [ "administrative_area_level_1", "political" ]
         },
         {
            "long_name" : "Spain",
            "short_name" : "ES",
            "types" : [ "country", "political" ]
         },
         {
            "long_name" : "03015",
            "short_name" : "03015",
            "types" : [ "postal_code" ]
         }
      ],
      "adr_address" : "\u003cspan class=\"street-address\"\u003eCalle Cruz de Piedra, 4\u003c/span\u003e, \u003cspan class=\"postal-code\"\u003e03015\u003c/span\u003e \u003cspan class=\"locality\"\u003eAlacant\u003c/span\u003e, \u003cspan class=\"region\"\u003eAlicante\u003c/span\u003e, \u003cspan class=\"country-name\"\u003eSpain\u003c/span\u003e",
      "formatted_address" : "Calle Cruz de Piedra, 4, 03015 Alacant, Alicante, Spain",
      "geometry" : {
         "location" : {
            "lat" : 38.3642358,
            "lng" : -0.4626489
         },
         "viewport" : {
            "northeast" : {
               "lat" : 38.3655847802915,
               "lng" : -0.4612999197084979
            },
            "southwest" : {
               "lat" : 38.3628868197085,
               "lng" : -0.463997880291502
            }
         }
      },
      "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png",
      "id" : "ce1aa5a252b86d559268866a6a4858db9bba3dff",
      "name" : "Calle Cruz de Piedra, 4",
      "place_id" : "ChIJFwinI3E3Yg0RSMb3_GWb6IU",
      "reference" : "CmRbAAAAn6NLYXEs-ttLvUlgjnh5aDHt-LR_hXe6JmUN8fzv6MJ7Q50xt_zUU_WlTc3aL_BQc70-1YjEb6Soluro5rA8cIFJG_w08RSr_JWo_SFEFc1Ncme_dKVKsPX6Q0LtO8gWEhACTzabAMLQfM5xt1_BNsywGhSZr0WRGlutqeuRgs-IY41ndk3yoQ",
      "scope" : "GOOGLE",
      "types" : [ "street_address" ],
      "url" : "https://maps.google.com/?q=Calle+Cruz+de+Piedra,+4,+03015+Alacant,+Alicante,+Spain&ftid=0xd62377123a70817:0x85e89b65fcf7c648",
      "utc_offset" : 60,
      "vicinity" : "Alacant"
   },
   "status" : "OK"
}

APIキーの設定

クライアントアプリケーションがOAuth 2.0を使用しない場合、Google Cloud Platformプロジェクト内で有効になっているAPIを呼び出すときに、APIキーを含める必要があります。アプリケーションは、このキーをすべてのAPIリクエストに次のように渡します。 key = API_keyパラメータ。アプリケーションのAPIキーを作成するには:

  1. API Console に移動します。
  2. プロジェクトリストからプロジェクトを選択するか、新しいプロジェクトを作成します。
  3. APIとサービスのページがまだ開いていない場合は、左側のメニューを開き、APIとサービスを選択します。
  4. 左側で、Credentials。を選択します。
  5. 資格情報の作成をクリックし、APIキーを選択します。

注:このページの説明に加えて、必ず APIキーを安全に使用するためのベストプラクティス も読んでください。


(draft)履歴は削除されません

テストのみ!一時的な解決策:

curl "https://www.google.com/maps/place/data=!4m2!3m1!1s0xd62377123a70817:0x85e89b65fcf7c648" -s -b -L -H "user-agent: Googlebot/2.1 (+http://www.google.com/bot.html)" | FIND """0xd62377123a70817:0x85e89b65fcf7c648"","

コマンドプロンプトに回答:、["0xd62377123a70817:0x85e89b65fcf7c648"、null、null、[null、null、38.364235799999996、-0.4626489]

CURLがある 必要な場合

続行する検索...


これ(0xd62377123a70817:0x85e89b65fcf7c648)はGoogleMapデータベースのマップオブジェクトのIDだと思います。 URL1をクリックすると。

地理座標が必要な場合は、URL2をクリックしてください。次に、EMBEDとしてリンクを作成する必要がある場合は、問題ありません。以下の結果になります。

src="https://www.google.com/maps/embed?pb=
!1m18
    !1m12
        !1m3
            !1d782.0856626047412
            !2d-0.46311117079625247
            !3d38.36419405026406
        !2m3
            !1f0
            !2f0
        !3f0
        !3m2
            !1i1024
            !2i768
        !4f13.1
    !3m3
        !1m2
            !1s0x0%3A0x0
            !2zMzjCsDIxJzUxLjEiTiAwwrAyNyc0NS4yIlc
    !5e0
!3m2
   !1ses
   !2ses
!4v1509474812934" 

fTID(0xd62377123a70817:0x85e89b65fcf7c648)
ftidパラメータは、fidおよびcidと同様に、特定のマップオブジェクトの一意の識別子です。マップ上に存在する必要があるがローカルデータベースの一部ではない場所は、ftidパラメータによって識別されます。プレイスを通じてこれらのタイプのマップオブジェクトを要求することはできません。

API Google Places と他のユーザーは place-id

(Calle Cruz de Piedra、4 03015 Alicante)place-id = ChIJFwinI3E3Yg0RSMb3_GWb6IU

(場所->場所ID)
https://developers.google.com/maps/documentation/javascript/examples/places-placeid-Finder
and Reverse(place-id-> place) https://developers.google.com/maps/documentation/javascript/examples/geocoding-place-id

今:

place-idからlocation-了解
https://developers.google.com/maps/documentation/geocoding/intro?hl=en#ReverseGeocoding

FTIDlocation-?質問を開く...高速かつ自動

google経由の方法:

https://google.com/maps?ftid=0xd62377123a70817:0x85e89b65fcf7c648

https://www.google.com/maps/place/Calle+Cruz+de+Piedra,+4,+03015+Alicante,+%D0%98%D1%81%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F/@38.3642358,-0.4648376,17z/data=!3m1!4b1!4m5!3m4!1s0xd62377123a70817:0x85e89b65fcf7c648!8m2!3d38.3642358!4d-0.4626489

大西洋の仕事でも:
https://google.com/maps?ftid=0xadd28c30ec90d79%3A0x44652457c0696504

google Maps Embed APIについての2つの言葉:

<iframe 
src="https://www.google.com/maps/embed?pb=
!1m3
!3m2
!1m1
!1s0xd62377123a70817%3A0x85e89b65fcf7c648"
width="400" height="400" frameborder="0" style="border:0" allowfullscreen>
</iframe>

m createこの構文のブロック:1デジタル-IDまたは現在のブロックに配置しますか? 2デジタル-値=新しいブロックのサイズ

!<ID>m<value>

!1m3
!3m2
!1m1
!1s0xd62377123a70817%3A0x85e89b65fcf7c648

{}
{,,{}}
{,,{{}}}
{,,{{1s}}}

!1:{}
!1:{!3:{}}
!1:{!3:{!1:{}}}
!1:{!3:{!1:{1s}}}

これが役に立てば幸いです!

10
Akubik

Akubikの答えは私を軌道に乗せました。私が説明するパラメータは、その座標のようなparam1:param2- lookにもかかわらず、識別子です。

param1を特定できませんでしたが、場所(店舗など)を選択した場合、param2は16進エンコードのGoogleマップのお客様ID(CID)です。私の例では、そうではありません。しかし、別の実際の例を使用すると、パラメーターは次のようになります。

!1s0x6ad63fbf56e24c27:0xe665b3308d32f379

このように理解できる

0xe665b3308d32f379  ---hex-to-dec--->  16601872622479930233

および https://google.com/maps?cid=166018726224799302 はマークされた場所につながります。

それから座標を抽出する方法は?サンプル数が少ない場合は、手作業で行うことができます。上のリンクをクリックすると、1〜2秒後に、GoogleマップがブラウザでURLを更新します。これで、!3dパラメータと!4dパラメータに、場所の正確な座標(今回は、ビューポートの中心ではなく正確な座標)が含まれます。

多くのサンプルがある場合やプロセスを自動化したい場合は、Google Maps APIを使用する必要があります(たとえば、これをチェックしてください link )。

不足しているもの:場所ではなく住所が選択されている場合のパラメーターの理解方法例については、私の元の質問のリンクを参照してください。

5
Manu CJ