Подтвердить что ты не робот

Геокодирование Google "на лету" с использованием очереди laravel

У меня около 100 устройств GPS, периодически отправляющих координаты каждые 10 секунд. Мой клиент хочет обратное геокодирование в реальном времени, чтобы увидеть его транспортные средства вместе с местоположением на табличном виде. Я установил очередь для сохранения всех этих пакетов в db до того, где я добавил геокодирование script, как показано ниже

  • Получение IP-сообщения TCP с помощью 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,
                                                                                )
                             )));   
    

    }

  • Запуск очереди

    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 параллельных устройств, если я включу это геокодирование в очередь, есть ли для этого лучший подход?

4b9b3361

Ответ 1

Мы разработали нечто похожее, первоначально с картами google api, но я отошел, потому что это было не так точно в моем местоположении (Бразилия).

Для карт Google, если вы не заметили каких-либо проблем с точностью, вы можете запустить очередь и обработать данные, но с ограниченной суммой в день (обратите внимание на ограничение 2500 запросов, на которые я верю) для бесплатного обслуживания или покупки необходимых запросов.

Если вам нужны в режиме реального времени все устройства, вам нужно будет заплатить за большой объем на картах google, и я буду использовать для него службу очередей. Мы используем RabbitMQ Queue для получения координат, а затем у нас есть маленькие клиенты/работники, которые получают элементы из очереди и обрабатывают их (есть другие задействованные API).

Я не верю, что ваш клиент будет весь день впереди этого экрана, так что, возможно, вы можете:

  • Всегда сохранять координаты
  • Запускать вызовы API только тогда, когда он/она/кто-то находится на этой странице
  • Используйте систему приоритета для координат GPS в просматриваемой области экрана (просматриваемые границы карты на фронте)
  • Выполнять низкоприоритетные координаты в окне лучших усилий (на основе доступности API, ограничения использования и т.д.), возможно, даже для вторичного API для неприоритетных

Кстати, мы используем HereMaps, он выплачивается, но вы можете создать демонстрационную/тестовую учетную запись в течение 3 месяцев.

Ответ 2

Я думаю, что обратная геокодировка каждой координаты довольно неэффективна. Я предпочел бы сгруппировать некоторые координаты в некоторых пакетах и ​​использовать что-то вроде thephpleague/geotools пакетный api, чтобы отменить геокодирование этих данных, если они запрашиваются.

И я бы не полагался только на карты Google. Я считаю, что хороший совет - иметь резервную копию, потому что карты Google не знают каждого адреса, и вы можете легко выйти из ограничения скорости (с таким количеством данных). Посмотрите на пакет [ geocoder-php/Geocoder], который поддерживает многие службы геокодирования.

Mabye примечание к сайту: я один из тех, кто поддерживает этот проект.