2017-04-06 9 views
11

Mam około 100 urządzeń GPS wysyłających współrzędne co 10 sekund. Mój klient chce w czasie rzeczywistym dokonać geokodowania wstecznego, aby zobaczyć swoje pojazdy wraz z lokalizacją w widoku tabelarycznym. Mam ustawić kolejkę, aby zapisać wszystkie te pakiety w dB przed którym Dodałem skrypt geokodowania jak poniżejGoogle geokodowanie w locie za pomocą kolejki laravel

  1. Odbierz wiadomość TCP IP za pomocą 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. uruchomić kolejka

    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 
        } 
    

Martwię się tylko, czy działa na 1000 urządzeń współbieżnych, jeśli uwzględnię to geokodowanie w kolejce, czy jest na to jakieś lepsze podejście?

+0

Myślę, że możesz ograniczyć liczbę współbieżnych procesów poprzez ustawienie konfiguracyjne administratora 'numprocs = 8'.Nie jestem do końca pewien, czy tego właśnie szukasz. – btl

+0

Widzę na kilka sposobów, abyś mógł to poprawić przynajmniej, ale żeby dać ci kilka wskazówek: 1) możesz sprawdzić, czy praca jest wciąż (czeka) w kolejce do pojazdu i pozbyć się wszelkich oczekujących zleceń dla pojazd, gdy umieszczasz nową pracę w kolejce 2) prawdopodobnie nie chcesz wykonywać połączenia z Google api za każdym razem. Na przykład rozważ, czy współrzędne są takie same, ponieważ w takim przypadku pojazd się nie poruszył i znasz już lokalizację. – Leentje

+3

Po namyśle; Zrobiłbym tylko wywołanie API do google, gdy frontend musi pokazać rzeczywistą lokalizację. (I po prostu zapisz współrzędne) – Leentje

Odpowiedz

0

Opracowaliśmy coś podobnego, początkowo z apletami mapy google, ale przeniosłem się, ponieważ nie było tak dokładne w mojej lokalizacji (Brazylia).

W przypadku map google, jeśli nie zauważysz żadnych problemów z dokładnością, możesz uruchomić kolejkę i przetworzyć dane, ale z ograniczoną ilością dziennie (zwróć uwagę na limit 2500 zapytań), aby uzyskać bezpłatną usługę lub kupić wymagane wyszukiwania .

Jeśli potrzebujesz czasu rzeczywistego na wszystkie urządzenia, będziesz musiał zapłacić za większą objętość w mapach google, a ja skorzystam z usługi kolejkowania. Używamy kolejki RabbitMQ do otrzymywania współrzędnych, a następnie mamy małych klientów/pracowników, którzy pobierają elementy z kolejki i przetwarzają je (w grę wchodzą inne interfejsy API).

nie wierzę klient będzie przez cały dzień przed tym ekranie, więc może można:

  • Zawsze przechowywać współrzędne
  • uruchomić wywołań API tylko wtedy, gdy on/ona/ktoś jest na tej stronie
  • Użyj systemu priorytetów dla współrzędnych GPS w wyświetlanym obszarze ekranu (oglądane granice mapy na frontencie)
  • Uruchamiaj współrzędne o niskim priorytecie w oknie najlepszych starań (w zależności od dostępności interfejsu API, limitu użycia itd.) , może nawet na dodatkowym API dla niepriorytetu

Btw używamy map witryn, to jest wypłacane, ale można utworzyć konto demonstracyjne/testowe przez 3 miesiące.

0

Myślę, że odwrotny geokod dla każdej współrzędnej jest dość nieefektywny. Wolę próbować zgrupować niektóre współrzędne w niektórych pakietach i użyć czegoś podobnego do api wsadowego thephpleague/geotools, aby cofnąć geokodowanie tych danych, jeśli są one wymagane.

I nie polegałbym tylko na mapach google. Uważam, że dobrą radą jest mieć awarię, ponieważ mapy google nie znają każdego adresu i można łatwo zrezygnować z limitu stawki (przy takiej ilości danych). Zajrzyj do pakietu [geocoder-php/Geocoder], który obsługuje wiele usług geokodowania.

Mabye a site note: Jestem jedną z osób, które utrzymują ten projekt.

Powiązane problemy