Задать вопрос
@puadi

Как выбрать точки заданные в геолокации по определенному радиусу в боте телеграм?

Есть поставленные точки в боте телеграмм ( при регистрации, клиент указывает адрес оказания услуги) пользователь отправляет свою локацию и выбирает радиус поиска, бот должен показать точки соответствующие заданному радиусу.
Везде уже искал, никак не могу найти ответ, может кто подскажет? Язык php
  • Вопрос задан
  • 229 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
kawabanga
@kawabanga
В зависимости от кол-ва точек. Если у вас их там мало, и нет проблем просчитать, то используйте функцию расчета расстояния. К примеру примеру, у меня представлена для POINT значений функция, перепишите себе под lat long.
И далее через foreach проверяете необходимые условия.
static function distance($point1, $point2, $unit = 2 ) {
 
        if (!$point2) return null;
        if (!$point1) return null;

        $point1 = explode(',', $point1);
        $lon1 = $point1[0];
        $lat1 = $point1[1];

        $point2 = explode(',', $point2);
        $lon2 = $point2[0];
        $lat2 = $point2[1];

        if ($lon1 == 0 || $lon2 == 0) {
            return null;
        }

        $theta = $lon1 - $lon2;
        $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
        $dist = acos($dist);
        $dist = rad2deg($dist); 
        $miles = $dist * 60 * 1.1515;

        switch ($unit) {
            case(self::UNIT_KM) :
                $out = $miles * 1.609344;
                break;
            case(self::UNIT_MI) :
                $out = $miles;
                break;
            case(self::UNIT_NA) :
                $out = $miles * 0.8684;
                break;
        }
        return $out;
    }


Если же у вас через базу, то гуглите gis функции для вашей базы. там еще элементарнее, вплоть до радиуса.

Так же можете грубо обрезать lat/lng, чтобы показать необходимые точки, обычным вычитанием. будет грубо, но иногда этого хватает для задачи.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽