如何从Google地图网址获取Google商家信息ID(placeId)

时间:2018-02-14 01:05:24

标签: javascript google-maps google-places-api google-places

我正在开发一个网站,用户可以在其中添加其他列表链接。我正在尝试进行设置,以便当用户向Google上的某个地点添加链接时(例如从Google地图中抓取共享链接:https://www.google.com/maps/place/Twin+Elephant+Brewing+Company/@40.7290336,-74.3828372,17z/data=!4m5!3m4!1s0x89c3afa1b597fe49:0x890cb024fe77e7b6!8m2!3d40.7290336!4d-74.3806485),然后我可以使用Google Places API提取其他信息。

但是,Google Places API需要您指定地点ID,我想知道是否有办法从提供的地图网址获取此地址?我知道你可以从这里手动获取它:https://developers.google.com/maps/documentation/javascript/examples/places-placeid-finder但是以某种方式通过地图URL获取地方ID?

谢谢!

2 个答案:

答案 0 :(得分:1)

可能有点晚了,但我想尝试一下......

背景资料:

This answer建议您通过将地点cid(与placeId不同)传递给Places API Web Service来获取地点详细信息。

这会使用未记录的查询参数,因此,使用它需要您自担风险。这可能会在没有警告的情况下随时停止工作!

This article建议您从地图网址中提取cid

然后我发现this code snippet有助于解析Google地图网址中的data属性。

不幸的是,您不能将Places API Web服务与AJAX调用一起使用,因为您将遇到CORS问题,因此您需要使用其他方法。并且您无法使用Google Maps Javascript API的地方资料库,因为它要求您传递placeId并且不接受cid。这就是我必须使用PHP从Web服务中获取结果的原因。

要运行以下代码,您还需要jQuery,或者您需要替换$.ajax(...)函数,并且需要在Web服务请求中使用您自己的API密钥替换<your_api_key>(PHP码)。

所以我们走了......这是Javascript:

function mapsUrlToPlaceDetails(url) {

    var re = /data=(.*)/;

    var data = url.match(re);

    var str = data[1];

    var parts = str.split('!').filter(function (s) {
            return s.length > 0;
        }),
        root = [], // Root elemet
        curr = root, // Current array element being appended to
        m_stack = [root,], // Stack of "m" elements
        m_count = [parts.length,]; // Number of elements to put under each level

    parts.forEach(function (el) {

        var m = /^(\d+)(\w)(.*)$/.exec(el),
            idx = m[1],
            kind = m[2],
            value = m[3];

        // Decrement all the m_counts
        for (var i = 0; i < m_count.length; i++) {
            m_count[i]--;
        }

        if (kind === 'm') { // Add a new array to capture coming values
            var new_arr = [];
            m_count.push(value);
            curr.push(new_arr);
            m_stack.push(new_arr);
            curr = new_arr;
        } else {
            if (kind == 'b') { // Assuming these are boolean
                curr.push(value == '1');
            } else if (kind == 'd' || kind == 'f') { // Float or double
                curr.push(parseFloat(value));
            } else if (kind == 'i' || kind == 'u' || kind == 'e') { // Integer, unsigned or enum as int
                curr.push(parseInt(value));
            } else { // Store anything else as a string
                curr.push(value);
            }
        }

        // Pop off all the arrays that have their values already
        while (m_count[m_count.length - 1] === 0) {
            m_stack.pop();
            m_count.pop();
            curr = m_stack[m_stack.length - 1];
        }
    });

    var enc = root[0][0][0];

    // Find the CID with a regex
    re = /:0x(.*)/;
    var cMatch = enc.match(re);

    // We have the place CID as hexadecimal, we convert it to decimal in our PHP script
    var cid = cMatch[1];

    var serviceData = false;

    // Query our PHP page with our CID
    $.ajax({
        type: 'GET',
        url: 'get_place_details.php',
        data: {
            cid: cid
        },
        success: function (data) {

            if (data) {

                serviceData = data;
            }
        },
        async: false,
        contentType: "application/json",
        dataType: 'json',
    });

    return serviceData;
}

var url = 'https://www.google.com/maps/place/Twin+Elephant+Brewing+Company/@40.7290336,-74.3828372,17z/data=!4m5!3m4!1s0x89c3afa1b597fe49:0x890cb024fe77e7b6!8m2!3d40.7290336!4d-74.3806485';

console.log(mapsUrlToPlaceDetails(url));

以下是get_place_details.php页面:

<?php
header('Content-Type: application/json');

// Get the hexadecimal CID
$hexString = $_GET['cid'];

// Convert it to decimal
$decString = bchexdec($hexString);

// Query the web service
$url = 'https://maps.googleapis.com/maps/api/place/details/json?cid=' . $decString . '&key=<your_api_key>';
$json = file_get_contents($url);

// Print results
print $json;

// Convert hexadecimal CID to decimal
function bchexdec($hex) {

  $len = strlen($hex);
  for ($i = 1; $i <= $len; $i++)
    $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));

  return $dec;
}

以下是您的问题中带有示例网址的输出:

{
   "html_attributions" : [],
   "result" : {
      "address_components" : [
         {
            "long_name" : "13",
            "short_name" : "13",
            "types" : [ "street_number" ]
         },
         {
            "long_name" : "Watchung Avenue",
            "short_name" : "Watchung Ave",
            "types" : [ "route" ]
         },
         {
            "long_name" : "Chatham",
            "short_name" : "Chatham",
            "types" : [ "locality", "political" ]
         },
         {
            "long_name" : "Morris County",
            "short_name" : "Morris County",
            "types" : [ "administrative_area_level_2", "political" ]
         },
         {
            "long_name" : "New Jersey",
            "short_name" : "NJ",
            "types" : [ "administrative_area_level_1", "political" ]
         },
         {
            "long_name" : "United States",
            "short_name" : "US",
            "types" : [ "country", "political" ]
         },
         {
            "long_name" : "07928",
            "short_name" : "07928",
            "types" : [ "postal_code" ]
         }
      ],
      "adr_address" : "\u003cspan class=\"street-address\"\u003e13 Watchung Ave\u003c/span\u003e, \u003cspan class=\"locality\"\u003eChatham\u003c/span\u003e, \u003cspan class=\"region\"\u003eNJ\u003c/span\u003e \u003cspan class=\"postal-code\"\u003e07928\u003c/span\u003e, \u003cspan class=\"country-name\"\u003eUSA\u003c/span\u003e",
      "formatted_address" : "13 Watchung Ave, Chatham, NJ 07928, USA",
      "formatted_phone_number" : "(973) 507-9862",
      "geometry" : {
         "location" : {
            "lat" : 40.7290336,
            "lng" : -74.38064849999999
         },
         "viewport" : {
            "northeast" : {
               "lat" : 40.7305861302915,
               "lng" : -74.37907051970849
            },
            "southwest" : {
               "lat" : 40.7278881697085,
               "lng" : -74.3817684802915
            }
         }
      },
      "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png",
      "id" : "033d042f48225906fe15f77f5b3a3e7b6aeeab89",
      "international_phone_number" : "+1 973-507-9862",
      "name" : "Twin Elephant Brewing Company",
      "opening_hours" : {
         "open_now" : false,
         "periods" : [
            {
               "close" : {
                  "day" : 4,
                  "time" : "2100"
               },
               "open" : {
                  "day" : 4,
                  "time" : "1600"
               }
            },
            {
               "close" : {
                  "day" : 5,
                  "time" : "2200"
               },
               "open" : {
                  "day" : 5,
                  "time" : "1600"
               }
            },
            {
               "close" : {
                  "day" : 6,
                  "time" : "2200"
               },
               "open" : {
                  "day" : 6,
                  "time" : "1200"
               }
            }
         ],
         "weekday_text" : [
            "Monday: Closed",
            "Tuesday: Closed",
            "Wednesday: Closed",
            "Thursday: 4:00 – 9:00 PM",
            "Friday: 4:00 – 10:00 PM",
            "Saturday: 12:00 – 10:00 PM",
            "Sunday: Closed"
         ]
      },
      "photos" : [
         {
            "height" : 2448,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/116322776679362173973/photos\"\u003eJohn Cisco\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAA5OjbmTwkvKGIODbDIq7iqRmY936SHMmM8Lp-ao-tZz9TjysnV1iLo8TU7c3vaOqKEEFp9sjgdQXaryTXmkayEgbRf1R_kHTUMALncnIbJgUUNWUQfVZZZFYwAVSNT3xrEhBoDze6Deo-OY-R4QBsJSGUGhRBTr8UU62fuUe7uQ8GC_eGZVy-0Q",
            "width" : 3264
         },
         {
            "height" : 640,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/108115407768700900550/photos\"\u003eTwin Elephant Brewing Company\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAAkseOCiYmA_QuZtUtpLL32udgqGJHWUxmQPH646Ml16SjCwRv1gS-ynYkWM5n54m36S2uUstVZ0ld4nDlosYblDeQxvq8_KxRrVyKtavY8cQvY9l2cidOWgF7XBYKVzSMEhDO3A3SJPio3XhenCtDgkhUGhTDMYIMOvpFmkQXy4dMYQD19-_VkQ",
            "width" : 480
         },
         {
            "height" : 1080,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/105468313205986835052/photos\"\u003eU. Minocha\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAAFY3e-92GOB5gZ02gRnRisBWhqIr-_bCxDhNff5kYX7XRtcDY-3Q4d1eRN71fouXOJWQH02EUXXmsDaSk9nw91ajUMjdZXdUdgnWsLtWci_QwBmTs604TDtD9IBOUgdsGEhDGUo8VR6VxAz5dn58v2K5EGhTyypm6Z3dw8VRo7ARzeY0B33jpHA",
            "width" : 1920
         },
         {
            "height" : 2988,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/106472583958367361068/photos\"\u003eSteven Grillo\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAA_toJLI4dqBnPcYWU3xcg74OTOguLrFcYuobfrefJKzMI1YvzLC5su3qG5ePhwwCNPhbuf2yRrf1xAwNyb786f9W6SUcPqm1Ixys7kdtLRtq2PCGGR7uJPNy7diIxltAFEhDJ1iv7zV9Wy-L2LmMK6awaGhS8lS-vGVLbyuoBvnLUHMoo7G9P-g",
            "width" : 5312
         },
         {
            "height" : 3024,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/102366024100729755902/photos\"\u003eGiri Sonty\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAAxUDQSpdmVLqwEhkmglkZCgHrgF8pu5fQuEwQqJGdPX-LF4HFfVTW3P-sCORrFZToktnujwI5_qsC6s7lYbdaXt3-zyUZ5Y1cG-Qsf8iyPdfLFKbmqzQYePDyESBbotZKEhDkJqPi01x3SBsMfB9F7ozpGhSuBaRTN8WuFjKLFnhHmQBBhjCpFg",
            "width" : 4032
         },
         {
            "height" : 1920,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/105155780654274802017/photos\"\u003eTim Besecker\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAAnYSYhIWKK5g6iw5YuE3W6rcrcsMjLkkAh7WOwrK7byCBH5mXOVEukvboWIEBR_03igd52Nv2j65HkaOZtqEOt5wIg_-jUxyGUoiYWSgx5lE0Bfr7lfr_hLIL0F1Ih5QgEhC2T7UwbXzWyMntI1hjYwimGhQuwFneOqYQFlkXRVk2djZMH8MukQ",
            "width" : 1536
         },
         {
            "height" : 4048,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/111388773475383063875/photos\"\u003eChris Bryant\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAALgkt5N4lbOd9KKbodX6e85cr53AMmTCHtUcpY4A8GstXaYQ0A3ZxVy3HidMeRsq6ttB335aY3caGghlzlGn6ZKTh3UYqhBIWDEtbAP55Sfmn_ejguBmUwXGvYPXwXnJ0EhAMxT0nVxswsz3t4vKMXNYlGhS61J6w9kwPE78p48JziVu6BuXpOQ",
            "width" : 3036
         },
         {
            "height" : 3904,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/113301757065540994941/photos\"\u003eBrian Davies\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAAwBpwY85PAJA8kMCwHfFa5AjfKhWKt9tWr24dW4c3jg7OKgem6Fiy3ujkgJn3I2qjdnhaQ_doPoh7nOFC3pMyk0lhg3PBrEmlV4I-WV_b-ijbSCyNsc6XSgWCa33lJCrVEhCiuzN8SVwykAsKYnaqr5wyGhRBmlmH4UF3sli--wgW3NFt-JCnaQ",
            "width" : 2928
         },
         {
            "height" : 3006,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/104479106479135628391/photos\"\u003eMark Burgos\u003c/a\u003e"
            ],
            "photo_reference" : "CmRaAAAA_eEr3xWGNj_0Z9ZV7kCtLoShbGyV_Lm7fWPgqzoI-XkZDXEpKN6lyEka5DdbHPa_UKCZFJc2NHqcCHcO2wqohW5kOgev6KJBPowo-dwzweebBOHqjHYOIDTzCuNI-e3JEhDlQWANhY1vjamISDqmerQDGhSyKw-BY2sF2z2PJVP5Ebxn4XyUOw",
            "width" : 4442
         },
         {
            "height" : 2160,
            "html_attributions" : [
               "\u003ca href=\"https://maps.google.com/maps/contrib/101684835260872241844/photos\"\u003eJohn Worobetz\u003c/a\u003e"
            ],
            "photo_reference" : "CmRZAAAAaxND_m7EEmb_H-AcjE11kV9TSpDNmqSp_yb9rvoeMfXli-YpkNl40ynUbFbIdBlvzQABml_g8QyVRVjO1xX_22tLDGC2BjRYjUVU2jSQ3lh8vpBQXpVS-QqgsRiKs5MjEhDPSv331G9tFTL4i9ZRxrTtGhQiu6Y77QuIF-yDjC5K7l03RHX0RQ",
            "width" : 2880
         }
      ],
      "place_id" : "ChIJSf6XtaGvw4kRtud3_iSwDIk",
      "rating" : 4.6,
      "reference" : "CmRSAAAA81Dn88T7QUFqgafk6p_RmBF2QwxF4ciZ1RiAl2FX_FnH_6V8xhBut-wwn55PA5RqzR1lnASt8IU220bIcnhK-X5LaOZfiRA-Ev4xqFIwD_5Bih40Zp0_r90rujcd0aDtEhBmmicu6C2zft-mfZaKRM44GhS9vO5jT0yZ21uPyvkNkU47rrHSUQ",
      "reviews" : [
         {
            "author_name" : "Chris Hall",
            "author_url" : "https://www.google.com/maps/contrib/105472690796059859093/reviews",
            "language" : "en",
            "profile_photo_url" : "https://lh6.googleusercontent.com/-c2FE0ic_69g/AAAAAAAAAAI/AAAAAAAAAJE/JkiTdWGipz8/s128-c0x00000000-cc-rp-mo-ba2/photo.jpg",
            "rating" : 5,
            "relative_time_description" : "a month ago",
            "text" : "Great local brewery with a great selection of beers. The outdoor, indoor decor gives it a great vibe and is a happening place for families and friends of all (legal) ages. I wold definitely recommend the flight tasters. Only one downfall, they're always out of growlers, so I never get to take my favorite taster home. Great spot overall!",
            "time" : 1522938350
         },
         {
            "author_name" : "U. Minocha",
            "author_url" : "https://www.google.com/maps/contrib/105468313205986835052/reviews",
            "language" : "en",
            "profile_photo_url" : "https://lh5.googleusercontent.com/-DvbLy6Lfe1Y/AAAAAAAAAAI/AAAAAAAAcok/XtWUnfo600c/s128-c0x00000000-cc-rp-mo-ba5/photo.jpg",
            "rating" : 4,
            "relative_time_description" : "2 months ago",
            "text" : "Place is hard to find and parking is limited but worth it. They have 3 oz 5-beer flights, 8 and 16 oz pours. Good beers - different styles; not a mono-style place. Place was packed at 3:30 pm on Sat afternoon  (imagine that) but the lines move quick and staff is friendly. Great rustic decor.",
            "time" : 1518901110
         },
         {
            "author_name" : "Chris D'Anna",
            "author_url" : "https://www.google.com/maps/contrib/109252609008737722129/reviews",
            "language" : "en",
            "profile_photo_url" : "https://lh6.googleusercontent.com/-XoBlrw7wJN4/AAAAAAAAAAI/AAAAAAAAFhk/ksUvusFcOk8/s128-c0x00000000-cc-rp-mo-ba3/photo.jpg",
            "rating" : 5,
            "relative_time_description" : "3 weeks ago",
            "text" : "Great fast service and very knowledgeable. And the beer was delicious. My favorite part is they offer many for takeout growler. I will definitely be back very soon.",
            "time" : 1524017924
         },
         {
            "author_name" : "Eric Larsen Larsen",
            "author_url" : "https://www.google.com/maps/contrib/104887350051046383743/reviews",
            "language" : "en",
            "profile_photo_url" : "https://lh3.googleusercontent.com/-EH-6GOaD73U/AAAAAAAAAAI/AAAAAAAAAAA/AIcfdXA8ntBCFqZ6ozlr3xDuN5In7Gemmg/s128-c0x00000000-cc-rp-mo/photo.jpg",
            "rating" : 5,
            "relative_time_description" : "a week ago",
            "text" : "I have been stopping in for 9 months now. Awesome employees. Great Beer and descent selection. My favorite to date Weepel and Lil Shimmy",
            "time" : 1525543191
         },
         {
            "author_name" : "Pete Antoniewicz",
            "author_url" : "https://www.google.com/maps/contrib/108718838193824181246/reviews",
            "language" : "en",
            "profile_photo_url" : "https://lh4.googleusercontent.com/-59_xOCRQPDI/AAAAAAAAAAI/AAAAAAAAAAA/l-PiY85YX5g/s128-c0x00000000-cc-rp-mo-ba5/photo.jpg",
            "rating" : 3,
            "relative_time_description" : "2 months ago",
            "text" : "Nice place, beers ok.  A little crowded though there was a big birthday party taking up a lot of room.  Garbage cans right by the entrance.  Hopefully working out the kinks.  A great addition to the area.",
            "time" : 1520108642
         }
      ],
      "scope" : "GOOGLE",
      "types" : [ "food", "point_of_interest", "establishment" ],
      "url" : "https://maps.google.com/?cid=9875461755851237302",
      "utc_offset" : -240,
      "vicinity" : "13 Watchung Avenue, Chatham",
      "website" : "http://www.twinelephant.com/"
   },
   "status" : "OK"
}

希望这会有所帮助:使用风险自负!

答案 1 :(得分:0)

你无法从URL获取place_id,你提到的placeid finder实际上是一个使用GM Javascript API的自动完成服务来获取它们的应用程序。

解决方法是从URL获取坐标(您可以这样做)然后使用自动填充服务或地理编码器来获取place_id(来自从URL获取的坐标)