2017-04-06 28 views
11

我有大约100个GPS设备每10秒周期性发送一次坐标。我的客户希望实时反向地理编码,以便在表格视图中查看他的车辆以及位置。我已成立了一个队列,我已经添加地理编码脚本之前在数据库中的所有这些数据包保存像下面使用laravel队列即时Google地理编码

  1. 使用的WebSocket

    public function onMessage(ConnectionInterface $conn, $msg) { 
    //get the message 
    // send the dispatch job to save it in db 
    $this->dispatch(new SavePacketsToDb($key_1, json_encode(
                 array(
                  'company_id' => $key_1, 
                  'vehicle_id' => $company->vehicle_id, 
                  'tracker_id' => $company->tracker_id, 
                  'lat' => $lat, 
                  'lng' => $lng, 
                  'imei' => $imei, 
                  'datetime' => $datetime, 
                          ) 
             ))); 
    

    }

  2. 运行接收TCP IP报文队列

    public function handle(){ 
         $lat=$obj->lat; 
         $lng=$obj->lng; 
    
    
    
    $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" . $lat . "," . $lng . "&key=mykey"; 
           $json = file_get_contents($url); 
           $data = json_decode($json); 
           $status = $data->status; 
           $address = ''; 
           if ($status == "OK") { 
            // echo "from geocode address"; 
            echo $address = $data->results[0]->formatted_address; 
           } 
           else{ 
            $address=NULL; 
           } 
    
        //save to db 
        } 
    

我只是担心,如果它适用于1000个并发设备,如果我在队列中包含此地理编码,是否有更好的方法呢?

+0

我想你可以通过管理员的配置设置'numprocs = 8'来限制并发进程的数量。不完全确定这是你想要的。 – btl

+0

我看到几种方法可以改善这一点至少,但给你几个指针: 1)你可以检查一个工作是否仍然(等待)在车辆队列中,并摆脱任何未完成的工作当你在队列中放置一个新工作时的车辆 2)你可能不想每次都打一次电话给google api。例如,考虑检查坐标是否仍然相同,因为如果是这种情况,车辆没有移动并且您已经知道位置。 – Leentje

+3

关于第二个想法;当前端需要显示实际位置时,我只会对谷歌进行API调用。 (而刚刚保存的坐标) – Leentje

回答

0

我们开发了类似的东西,最初与谷歌地图API,但我搬走了,因为它不是那么准确在我的位置(巴西)。

对于谷歌地图,如果您没有注意到任何准确性问题,您可以运行一个队列并处理数据,但每天有限的数量(请注意2500次查找限制我相信)免费服务或购买所需的查询。

如果你需要实时的所有设备,你将需要支付更大的谷歌地图的音量,我会使用它的排队服务。我们使用RabbitMQ队列来接收坐标,然后我们有小的客户/工作人员从队列中获取物品并处理它们(还有其他API参与)。

我不相信你的客户会整天在屏幕前,所以也许你可以:

  • 始终存储的坐标
  • 运行API只要求时,他/她/某人在该页面中
  • 在屏幕的查看区域中使用GPS坐标的优先级系统(查看地图边界)
  • 在尽力而为窗口上运行低优先级坐标(基于API可用性,使用限制等) ,甚至可能在非优先级的辅助API上

顺便说一句,我们使用HereMaps,它的支付,但你可以创建一个演示/测试帐户3个月。

0

我认为反向地理编码的每个坐标是相当低效的。我宁愿尝试在某些软件包中对一些坐标进行分组,并使用类似thephpleague/geotools批处理API的方式对这些数据进行地理编码(如果需要的话)。

而且我不会只依赖谷歌地图。我认为一个好的建议是有一个后备,因为谷歌地图不知道每个地址,你可以在速率限制(用这样的数据量)简单地退出。看看支持许多地理编码服务的[geocoder-php/Geocoder]软件包。

Mabye a site note:我是维护这个项目的人之一。