簡體   English   中英

如何從 Google 地圖 URL 獲取 Google Place ID (placeId)

[英]How to get a Google Place ID (placeId) from a Google Maps URL

我正在一個網站上工作,用戶可以在該網站上為列表添加其他鏈接。 我正在嘗試進行設置,以便當用戶在 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 ) I can then use the Google Places API to pull in additional info.

但是,Google Places API 需要您指定地點 ID,我想知道是否有辦法從提供的地圖 URL 中獲取此 ID? 我知道您可以從這里手動獲取它: https://developers.google.com/maps/documentation/javascript/examples/places-placeid-finder但是否可以通過地圖 URL 以某種方式獲取 Place ID?

謝謝!

可能有點晚了,但我想嘗試一下......

背景資料:

這個答案表明你可以通過將地方cid (與placeId )傳遞給Places API Web服務來獲取地點詳細信息。

這樣就可以使用未記錄的查詢參數,因此使用它需要您自擔風險 這可能會在沒有警告的情況下隨時停止工作!

本文建議您可以從地圖URL中提取cid

然后,我找到了此代碼段 ,可幫助解析Google Maps URL中的data屬性。

遺憾的是,您不能將Places API Web服務與AJAX調用一起使用,因為您將遇到CORS問題,因此您需要使用其他方法。 並且您無法使用Google Maps Javascript API的Places庫,因為它要求您傳遞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"
}

希望這有助於再次: 使用風險自負!

您無法從URL獲取place_id,您提到的placeid finder實際上是一個使用GM Javascript API的自動完成服務來獲取它們的應用程序。

解決方法是從URL獲取坐標(您可以這樣做)然后使用自動完成服務或地理編碼器來獲取place_id(來自從URL獲得的坐標)

盡管已經 3 年了,但我想分享我的解決方案。

對我來說最好的是使用已經指定地點的谷歌地圖網址。 它需要2個步驟。

  1. 從 '/maps/place/' 和 '@' 之間的 url 字符串中提取地名。
  2. 使用 google place textsearch 搜索提取的地名。 按照此處的說明將其放入“查詢”中,您將獲得該地點的詳細信息,包括 place_id
curl -X POST 'https://ruriazzfree.vercel.app/api/scrape/gplace' \
     -H 'Content-Type: application/json' \
     -d '{"gmap_link": "https://goo.gl/maps/DMMAakiA6nZrq9TE7"}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM