web-dev-qa-db-fra.com

Décodage des paramètres intégrés de Google Maps

Le contexte

Je voudrais pouvoir extraire l'emplacement de Google Maps intégré dans un site Web (exemple aléatoire trouvé au bas de ce site 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>

Donc, fondamentalement, je veux extraire l'emplacement précis de l'URL de Maps:

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

La conception d'URL

Google semble utiliser ici une conception de paramètres propriétaire. Cette entrée de blog et cette publication Stackoverflow a fait un bon travail résumant comment ces paramètres peuvent être compris. Les paramètres sont structurés comme (![id][type][value]), avec les types:

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

Les matrices peuvent encapsuler plusieurs entrées de données, e. g. !1m3!1i2!1i4!1i17 signifie que la matrice avec l'ID 1 contient les trois valeurs entières [2, 4, 17].

Avec cette connaissance, les paramètres peuvent être structurés comme ceci:

!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

Maintenant, cela semble facile, nous voyons les coordonnées presque en texte clair. Mais comme le souligne l'entrée de blog , les paramètres

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

ne sont pas la position du point précis, mais le centre de la carte affichée. Ils sont similaires, mais parfois très différents. Changer les coordonnées et/ou l'adresse ne donnera pas une carte différente.

Uniquement lors de la modification du paramètre !1s0xd62377123a70817:0x85e89b65fcf7c648, l'affichage de la carte se brisera, ce qui signifie que ce paramètre décode l'emplacement du point précis.

Juste, dans quel encodage?

La question

Dans l'entrée de blog (à partir d'août 2016), le lien Maps est construit différemment. Il existe un autre paramètre qui code les coordonnées de longitude et de latitude en base64:

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

De manière similaire, les coordonnées de ce nouveau paramètre devraient, espérons-le, décoder:

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

Il ressemble à un codage hexadécimal, mais lors de la conversion en entier (964394229279688727:9649133063979386440), cela ne correspond pas aux coordonnées géographiques d'un système que je connais.

Alors, qui peut déchiffrer le code? Toute aide appréciée.

18
Manu CJ

Cet intermédiaire n'est pas la réponse finale, et la suite suit)), juste quelques réflexions

Méthode non documentée. (avec tfid à la place placeid)
Service Web API Places
Aucune garantie à l'avenir:

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

La demande documentée est:

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

Besoin d'une clé API pour cette demande Configuration des clés API

Réponse de Google: (JSON - analyse légère)

{
   "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"
}

Configuration des clés API

Si votre application cliente n'utilise pas OAuth 2.0, elle doit inclure une clé d'API lorsqu'elle appelle une API activée dans un projet Google Cloud Platform. L'application transmet cette clé à toutes les demandes d'API en tant que un paramètre key = API_key. Pour créer la clé API de votre application:

  1. Accédez à API Console .
  2. Dans la liste des projets, sélectionnez un projet ou créez-en un nouveau.
  3. Si la page API et services n'est pas déjà ouverte, ouvrez le menu de gauche et sélectionnez API et services .
  4. Sur la gauche, choisissez Identifiants.
  5. Cliquez sur Créer des informations d'identification , puis sélectionnez Clé API .

Remarque: En plus de lire les instructions sur cette page, assurez-vous de lire Meilleures pratiques pour une utilisation sécurisée des clés API .


(brouillon) non supprimé pour l'historique

pour test uniquement! solution temporaire:

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"","

Réponse dans l'invite de commande:, ["0xd62377123a70817: 0x85e89b65fcf7c648", null, null, [null, null, 38.364235799999996, -0.4626489]

CURL là si nécessaire

recherche à poursuivre ....


Je pense que cela (0xd62377123a70817: 0x85e89b65fcf7c648) est l'ID de l'objet de la carte dans la base de données GoogleMap. Cliquez sur URL1.

Par exemple

si vous voulez des coordonnées géographiques, cliquez sur URL2 s'il vous plaît et ensuite si besoin créez un lien comme EMBED pas de problème, résultat ci-dessous:

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" 

c'est FTID (0xd62377123a70817: 0x85e89b65fcf7c648)
Le paramètre ftid est un identifiant unique pour certains objets de la carte, tout comme fid et cid. Les emplacements qui doivent figurer sur la carte mais ne font pas partie de la base de données locale sont identifiés par le paramètre ftid. Il n'est pas possible de revendiquer ce type d'objets Maps via Google Adresses.

API Google Places et d'autres fonctionnent avec place-id

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

(place -> place-id)
https://developers.google.com/maps/documentation/javascript/examples/places-placeid-Finder
et inversé (place-id-> lieu) https://developers.google.com/maps/documentation/javascript/examples/geocoding-place-id

MAINTENANT:

place-id à location - ok
https://developers.google.com/maps/documentation/geocoding/intro?hl=en#ReverseGeocoding

FTID à location -? question ouverte ... pour rapide et automatique

sur 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

pour le travail sur l'océan Atlantique aussi:
https://google.com/maps?ftid=0xadd28c30ec90d79%3A0x44652457c0696504

et deux mots sur l'API Google Maps Embed:

<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 Block avec cette syntaxe: 1 Digital - ID ou place dans le bloc courant? 2 Numérique - valeur = taille du nouveau bloc

!<ID>m<value>

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

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

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

J'espère que ça aide!

10
Akubik

La réponse d'Akubik m'a mis sur la bonne voie. Le paramètre que je décris est, malgré sa coordonnée param1:param2- regardez, un identifiant.

Je n'ai pas pu savoir ce que param1 l'est, mais lorsqu'un lieu (par exemple, un magasin) est sélectionné, param2 est l'ID client Google Maps (CID) en encodage hexadécimal. Dans mon exemple, ce n'est pas le cas. Mais, en utilisant un autre exemple du monde réel, le paramètre:

!1s0x6ad63fbf56e24c27:0xe665b3308d32f379

peut être compris comme ça

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

et https://google.com/maps?cid=166018726224799302 mènera à l'endroit marqué.

Comment en extraire les coordonnées? Si vous n'avez que quelques échantillons, vous pouvez le faire à la main. Cliquez sur le lien ci-dessus et après 1-2 secondes, Google Maps actualisera l'URL dans le navigateur. Il contient maintenant les coordonnées exactes du lieu (oui, cette fois les coordonnées exactes, pas le centre de la fenêtre) dans le !3d et !4d paramètre.

Si vous avez de nombreux échantillons et/ou souhaitez automatiser le processus, vous devez utiliser l'API Google Maps (vérifiez par exemple ceci link ).

Ce qui manque: Comment comprendre le paramètre, sinon un lieu, mais une adresse a été choisie? Pour un exemple, voir le lien dans ma question d'origine.

5
Manu CJ