如何从PHP中获取Google Maps Api Search中的结果名称

时间:2015-05-21 13:47:27

标签: php google-maps

我有一个这样的网址,搜索某个位置的内容:

https://maps.google.com/maps?q=dentist+Austin+Texas&hl=en&mrt=yf=l

我需要前两个结果列表,如(“Dentist Mr.Example1”,“Dentist Ex.2”)。

观看此问题:What parameters should I use in a Google Maps URL to go to a lat-lon?,我认为网址是正确的。

看着这一个:Get latitude and longitude automatically using php, API 我尝试了这两个选项:

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response_a = json_decode($data);

还有这个:

 $content= file_get_contents($url);
preg_match_all("|<span class=\"pp-place-title\">(.*?)</span></span>|",$content,$result);

在这两种情况下,我都没有任何结果。 提前谢谢!

1 个答案:

答案 0 :(得分:2)

  

我有一个这样的网址,搜索某个位置的内容:

     

https://maps.google.com/maps?q=dentist+Austin+Texas&hl=en&mrt=yf=l

     

我需要前两个结果列表(“牙医。”   Mr.Example1“,”Dentist Ex.2“)。

这是 Google Maps API请求

你走了:

$searchTerm = 'dentist+austin+texas';

$url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' . $searchTerm;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);

$array = json_decode($response, true);

// var_dump($array);

// Output

$array = $array['results'];

foreach($array as $index => $component)
{
    echo '#' . $index . ' ' . $component['formatted_address'] . '<br>';

    // show only the first 2 items (#0 & #1)
    if($index === 1) {
        break;
    }
}

一些注意事项:

  • 您的搜索字词是“牙医Austin textas”,当它是网址的一部分时,它会成为“牙医+奥斯汀+德州”。
  • searchTerm附加到API网址。
  • 此网址用于cURL请求。
  • 原始回复是$ response。
  • 通过将json_decode()的第二个参数设置为true,将其转换为$数组。
  • 您可以使用var_dump()数组来查看键。或者只需在浏览器中调用此网址:https://maps.googleapis.com/maps/api/geocode/json?address=dentist+austin+texas
  • 对于显示部分:这是一个简单的数组迭代。您可以通过将值重新分配给$ array来摆脱顶级“结果”数组。
  • 输出是编号的牙医列表

参考:https://developers.google.com/maps/documentation/geocoding/

  

这几乎是完美的,但我想得到电话号码和排名(评论的星星)。

最初的问题是使用Google Maps API列出奥斯汀牙医的第一个结果,tx。

此附加要求会更改要使用的API / Web服务,以便检索丰富的数据。您想要更多关于地址的details。 数据元素“phone_number”和“rating”是Google Places Webservice (Place Details)的一部分。您需要将密钥添加到请求网址(&key=API_KEY)才能访问此服务。

https://developers.google.com/places/webservice/details#PlaceDetailsRequests

这是地方明细要求

1)从第一个请求中提取“place_id”。

2)通过后续请求,您可以通过“Place Details”webservice检索有关每个地点的详细信息。

示例:这里我使用placeid作为第一个条目:

新代码:

<?php

// Google GeoCode API
$address = 'dentist+austin+texas';

$array = getGoogleGeoCode($address);
$array = $array['results'];

//var_dump($array);

foreach($array as $index => $component)
{
    echo '#' . $index . ' ' . $component['formatted_address'] . ', ' ;

    // subsequent request for "Place Details"
    $details = getGooglePlaceDetails($component['place_id']);
    $details = $details['result'];
    //var_dump($details);

    echo 'Phone: ' . $details['formatted_phone_number']. ', ' ;

    // rating contains the place's rating, from 1.0 to 5.0, based on aggregated user reviews.
    if(isset($details['rating'])) {
        echo 'Rating: ' . $details['rating'];
    }

    // show only the first two entries
    /*if($index === 1) {
        break;
    }*/

    echo '<br>';
}

function getGooglePlaceDetails($placeid)
{
    // your google API key
    $key = 'AIzaSyCj9yH5x6_5_Om8ebAO2pBlaqJZB-TIViY';
    $url = 'https://maps.googleapis.com/maps/api/place/details/json?placeid=' . $placeid . '&key=' . $key;

    return curlRequest($url);
}

function getGoogleGeoCode($address)
{
    $url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' . $address;

    return curlRequest($url);
}

function curlRequest($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

结果:

enter image description here

  • 数组元素rating并不总是存在,因为它是基于评论的。只需使用var_dump($details);查看其中的内容并选择您需要的内容。
  • 要删除列表,请删除break语句周围的注释。