我需要从Google地图加载距离数据并将其保存到我的数据库中

时间:2017-10-17 13:51:49

标签: php laravel api guzzle

我有5550条不同路线的记录,我需要为每条记录做一个foreach循环并获取API数据。 所以我在Laravel中用Guzzle做了一个函数:

public function getDirectionDistance($origins, $distinations)
{
    $client = new Client();
    $res = $client->get("https://maps.googleapis.com/maps/api/distancematrix/json?origins=$origins&destinations=$distinations&key=ччч")->getBody()->getContents();
    $obj =  json_decode($res, true);
    $distance =  $obj['rows'][0]['elements'][0]['distance']['text'];
    $clean = $string = str_replace(' km', '', $distance);
    return $clean;

}

我在商店方法中使用它

public function store()
{
    $route = $this->route->with('from','to')->get();
    $maps = new Maps();

    foreach ($route as $item){

        $direction = new Direction();
        $from = $item->from->name;
        $to = $item->to->name;
        $direction->route_id = $item->id;
        $direction->distance = $maps->getMapsApi("$from,israel","$to,israel");
        $direction->save();
        sleep(3);

    }

}

但是当我这样做时,我获得200条路线的1个距离,然后在200行之后我获得下一条路线的下一个距离。如何停止并等待api完成,保存然后开始下一行。我需要数据来创建机器学习价格计算器。

1 个答案:

答案 0 :(得分:0)

对我来说这样工作: 我创建了一个用CURL调用谷歌的函数:

public function calculateDistance($origins, $destination){
     $staticDistanceModel = New StaticDistance();
     $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $origins . "&destinations=" . $destination . "&mode=driving&language=it-IT&key=xyz";
            $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($response, true);
            if (isset($response_a['rows'][0]['elements'][0]['distance']['value'])) {
               $m = $response_a['rows'][0]['elements'][0]['distance']['value'];
            }else{
               $m = 0;
            }

            $staticDistanceModel->insertStatic($origins, $destination, $m);
        }
    }

我模型中的函数类似于:

public function insertStatic($origins, $destination, $m){
        $arrayInsert = array('origins'=>$origins, 'destination'=>$destination,'distance'=>$m);
        Self::create($arrayInsert);
    }

在我的控制器中,我有这样的forEach():

foreach ($array as $object) {
   $calculator = $this->calculateDistance($object->origins, $object->destination);
}

但要小心,因为谷歌限制请求,5500条记录的时间可能很长,所以你可以大块数组。

希望这可以帮到你