@puadi

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

Есть поставленные точки в боте телеграмм ( при регистрации, клиент указывает адрес оказания услуги) пользователь отправляет свою локацию и выбирает радиус поиска, бот должен показать точки соответствующие заданному радиусу.
Везде уже искал, никак не могу найти ответ, может кто подскажет? Язык php
  • Вопрос задан
  • 224 просмотра
Решения вопроса 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, чтобы показать необходимые точки, обычным вычитанием. будет грубо, но иногда этого хватает для задачи.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы