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



我得到了 5550 条不同路由的记录,我需要为每个记录做一个 foreach 循环并获取 API 数据。所以我在拉拉维尔和古兹尔做了一个函数:

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);
    }
}
但是当我这样做时,我得到 1 条路线的

200 个距离,然后在 200 行之后,我得到下一个路线的下一个距离。如何停止并等待 api 完成,保存它,然后开始下一行。我需要数据来创建机器学习价格计算器。

对我来说,以

这种方式工作:我创建了一个函数,使用 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 条记录的时间可能很长,所以你可以对数组进行分块。

希望这能帮助你

最新更新