use*_*230 18 php google-places-api
我正在开发一个google places API应用程序,我的目标是获取特定查询的所有可用详细信息.但据我所知,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";
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的代码.它为每个查询返回20个结果.任何人都可以告诉我我应该做什么调整,以获得每个查询60个结果.
谢谢
Chr*_*een 16
Google Places API每次搜索最多可返回60个结果(如果可用),最多可分为三页,最多可显示20个结果.如果有超过20个结果可用,您可以通过传递next_page_token给pagetoken新搜索请求的参数来访问其他结果.
有关添加结果的详细信息,请参阅文档中"地方搜索"页面的" 访问添加结果"部分.
如果您只需要地点位置,则可以使用Places API雷达搜索返回最多200个地点位置.
编辑: 在您的示例中,您无需为每个地点发送详细信息请求以访问地名和地址.此信息在初始响应中返回,可以像下面的示例一样访问:
foreach($dataArray->results as $place) {
echo '<p><b>' . $place->name . '</b>, ' . $place->formatted_address . '</p>';
}
Run Code Online (Sandbox Code Playgroud)
您可以查看是否有可用于附近搜索请求的其他页面next_page_token.这可以像下面这样检查:
if (isset($dataArray->next_page_token)) {
//get next page
}
Run Code Online (Sandbox Code Playgroud)
如果next_page_token返回,您可以通过传递next_page_token给pagetoken新搜索请求的参数或将其附加到原始请求的末尾来获取下一页结果.以下是使用新请求的示例:
$placeSearchURL = 'https://maps.googleapis.com/maps/api/place/textsearch/json?nextpage=' . $dataArray->next_page_token . '&sensor=true' . '&key=' . API_KEY;
Run Code Online (Sandbox Code Playgroud)
正如文件所述:
必须依次显示每页结果.搜索结果的两页或多页不应作为单个查询的结果显示.
因此,在next_page_token发布a 和何时生效之间会有短暂的延迟.
正如克里斯格林在他的回答中所说,你将不得不使用分页来获得超过20个结果.此外,克里斯格林也声明采取你不需要再次调用每个地方的参考的地址.我假设你需要更多的信息所以我只是创建了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);
}
}
Run Code Online (Sandbox Code Playgroud)