18

特定のクエリの利用可能なすべての詳細を取得するターゲットであるGooglePlacesAPIアプリケーションを開発しています。しかし、私が知っているように、Google Places APIは一度に20件の結果しか返しません。しかし、利用可能なすべての場所の詳細が必要です。

検索キーワードで複数回検索すると、常に同じ結果が得られます。ですから、同じキーワードで検索するたびに異なる結果を得る方法があることを知りたいのです。

 <?php 
        $placeSearchURL = 'https://maps.googleapis.com/maps/api/place/textsearch/json?query=' . $query . '&sensor=true' . '&key=' . API_KEY;

        $placeSearchJSON = file_get_contents($placeSearchURL);
        $dataArray = json_decode($placeSearchJSON);
        $references = array();
        $detailsOfPlaces = array();

        if (isset($dataArray->status)) {
            switch ($dataArray->status) {
                case 'OK' :
                    foreach( $dataArray->results as $details) {
                        $references[] = $details->reference;
                    }
                    break;
                default:
                    echo "Something wrong";
            }
        }

        foreach ($references as $reference) {
            $placeDetailsURL = 'https://maps.googleapis.com/maps/api/place/details/json?reference=' . $reference . '&sensor=true&key=' . API_KEY;
            $placeDetails =file_get_contents($placeDetailsURL);
            $placeDetailsAsArray = json_decode($placeDetails);

            switch ($dataArray->status) {
                case 'OK' :
                    $detailsOfPlace['business_name'] = isset($placeDetailsAsArray->result->name) ? $placeDetailsAsArray->result->name : '';
                    $detailsOfPlace['address'] = isset($placeDetailsAsArray->result->formatted_address) ? $placeDetailsAsArray->result->formatted_address : '';                      

                    $detailsOfPlaces[] = $detailsOfPlace;
                    break;
                default:
                    echo "Something went wrong";
            }
        }

これは私のコードです。クエリごとに20件の結果を返します。クエリごとに60の結果を得るには、どのような調整を行う必要があるか教えてください。

ありがとう

4

2 に答える 2

16

Google Places APIは、最大20件の結果の3ページに分割して利用できる場合、検索ごとに最大60件の結果を返すことができます。20を超える結果が利用可能な場合は、新しい検索リクエストnext_page_tokenのパラメータにを渡すことで、追加の結果にアクセスできます。pagetoken

追加結果の詳細については、ドキュメントの[場所の検索]ページの[追加結果へのアクセス]セクションを参照してください。

場所の場所のみが必要な場合は、Places APIレーダー検索を使用して、最大200の場所の場所を返すことができます。

編集: あなたの例では、地名と住所にアクセスするために各場所の詳細リクエストを送信する必要はありません。この情報は最初の応答で返され、次の例のようにアクセスできます。

foreach($dataArray->results as $place) {
  echo '<p><b>' . $place->name . '</b>, ' . $place->formatted_address . '</p>';
}

近くの検索リクエストで追加のページが利用可能かどうかを確認できますnext_page_token。これは以下のように確認できます。

if (isset($dataArray->next_page_token)) {
  //get next page
}

が返された場合は、新しい検索リクエストのパラメータにを渡すか、元のリクエストの最後に追加することで、next_page_token結果の次のページを取得できます。以下は、新しいリクエストを使用した例です。next_page_tokenpagetoken

$placeSearchURL = 'https://maps.googleapis.com/maps/api/place/textsearch/json?nextpage=' . $dataArray->next_page_token . '&sensor=true' . '&key=' . API_KEY;

ドキュメントに記載されているように:

結果の各ページを順番に表示する必要があります。1回のクエリの結果として、2ページ以上の検索結果を表示しないでください。

next_page_tokenしたがって、aが発行されてから有効になるまでに短い遅延があります。

于 2012-12-11T06:58:33.003 に答える
8

クリスグリーンが彼の答えで言うように、あなたは20以上の結果を得るためにページ付けを使わなければならないでしょう。また、Chris Greenも住所を取得すると述べているので、各場所の参照を再度呼び出す必要はありません。さらに情報が必要になると想定しているので、Chrisの応答で言うことを実装する2つの関数を作成しました。テストされていないので、いくつかのエラーがあるかもしれませんが、あなたは感じを得ることができます。

<?php

    function getAllReferences($query, $maxResults= 60, $nextToken = false) {
        $references = array();
        $nextStr = "";
        if ($nextToken)
            $nextStr = "nextpage=$nextToken";
        $placeSearchURL = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=$query&sensor=true&key=".API_KEY."&$nextStr";
        $placeSearchJSON = file_get_contents($placeSearchURL);
        $dataArray = json_decode($placeSearchJSON);
        if (isset($dataArray->status) &&$dataArray->status == "OK") {
            foreach( $dataArray->results as $details) {
                array_push($references, $details->reference);
            }
            if (!empty($dataArray->next_page_token) && count($references) < $maxResults ) {
                $nextArray = getAllReferences($query, $maxResults-20 , $dataArray->next_page_token);
                $references = array_merge($references, $nextArray);

            }
            return $references;
        }
    }

    function getPlaceFromReference($reference) {
        $placeDetailsURL = 'https://maps.googleapis.com/maps/api/place/details/json?reference=' . $reference . '&sensor=true&key='.API_KEY;
        $placeDetailsContent =file_get_contents($placeDetailsURL);
        $placeDetails = json_decode($placeDetailsContent);
        if ($placeDetails->status == "OK")
            return $placeDetails;
        else return false;
    }

    $references = getAllReferences("test");
    if (count($references) == 0)
        echo "no results";
    else {
        foreach ($references as $reference) {
            $placeDetails = getPlaceFromReference($reference);
            print_r($placeDetails);
        }
    }
于 2012-12-19T13:37:25.687 に答える