2017-04-06 1 views
11

약 10 초마다 주기적으로 좌표를 보내는 GPS 장치가 약 100 대 있습니다. 고객이 실시간 역 지오 코딩을 사용하여 차량을 위치와 함께 표보기로보고 싶습니다. 나는laravel 대기열을 사용하여 즉석에서 Google 지오 코딩

  1. 가 웹 소켓

    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. 실행 a를 사용하여 TCP IP 메시지를 수신 아래처럼 추가 한 지오 코딩 스크립트 전에 DB의 모든 패킷을 저장하는 큐를 설정 한 큐

    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

두 번째 생각에; 프론트 엔드가 실제 위치를 표시해야하는 경우에만 Google에 API 호출을 수행합니다. (그리고 그냥 좌표를 저장하십시오) – Leentje

답변

0

Google지도 API를 사용하여 비슷한 것을 개발했지만 내 위치 (브라질)에서 정확하지 않았기 때문에 멀리 옮겼습니다.

Google지도의 경우 정확도에 문제가 없다면 대기열을 가동하고 데이터를 처리 할 수 ​​있지만 무료 서비스의 경우 하루에 제한된 금액 (2500 개의 조회 한도가 있음을 알 수 있음)을 확인하거나 필요한 조회를 구입할 수 있습니다. .

모든 기기의 실시간이 필요한 경우 Google지도에서 더 많은 양을 지불해야하며 대기중인 서비스를 사용하게됩니다. 우리는 RabbitMQ 대기열을 사용하여 좌표를 받고 대기열에서 항목을 가져 와서 처리하는 작은 클라이언트/작업자가 있습니다 (다른 API가 관련되어 있음).

나는 어쩌면 당신이 할 수있는, 고객이 오랫동안 해당 화면 앞에 하루 종일 것으로 판단 해달라고 : 그/그녀가/사람이있을 때

  • 는 항상 API는 호출 좌표
  • 실행을 저장 해당 페이지에서
  • 화면의 보이는 영역에서 GPS 좌표에 우선 순위 시스템을 사용하십시오 (앞면에서 보이는지도 경계).
  • 최선의 노력 창에서 낮은 우선 순위 좌표를 실행합니다 (API 가용성, 사용 한도 등을 기준으로 함) 어쩌면 비 우선 순위의 보조 API에서도

Btw 우리는 HereMaps를 사용하고 있습니다. 유료이지만 3 개월 동안 데모/테스트 계정을 만들 수 있습니다.

0

역 지오 코드는 각 좌표가 매우 비효율적이라고 생각합니다. 일부 패키지에서는 좌표를 그룹화하고 요청할 경우 thephpleague/geotools 배치 API를 사용하여이 데이터의 지오 코딩을 역으로 수행하려고합니다.

그리고 Google지도에만 의존하지 않을 것입니다. 좋은 조언은 Google지도가 각 주소를 알지 못하므로 속도 제한 (데이터의 양과 함께)에서 쉽게 종료 할 수 있으므로 대체해야한다고 생각합니다. 많은 지오 코딩 서비스를 지원하는 [geocoder-php/Geocoder] 패키지를 살펴보십시오.

Mabye 사이트 노트 : 나는이 프로젝트를 유지 관리하는 사람들 중 한 사람입니다.