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

Как самому подсчитать расстояние в километрах по координатам долготы и широты?

Приходит запрос с клиента с его данными gps(android,ios) и делаю запрос в mysql чтобы выбрать ближайший к нему необходимый мне объект(там хранится как раз объект долгота широта)
$arrayToSort[$i]['pos'] =(abs($value[0] - $userPos[0]) + abs($value[1] - $userPos[1]));

То есть от долготы объекта отнимаю по модулю долготу юзере и тоже самое с широтой
и так итераций для каждого из объектов
затем
usort($ArrReadyToSort, "cmp");
сортирую и беру нулевой элемент, в данном случае по результату сортировки это ближайший, так вот
в итоге самый ближайший это ассоциативный массив с коэфициентом
$arrayToSort[$i]['pos'] =(abs($value[0] - $userPos[0]) + abs($value[1] - $userPos[1]));

этого действия
и два других элемента это точки пользователя и точки вот этого ближайшего объекта, нужно либо как то коэфициент перевести в километры( в идеале) либо curl в google api и получить расстояние отдав точки либо на клиент вернуть и с него сделать зарпос в api(что ваще не быстро)
поэтому вопрос в том как имея ближайший объект к пользователю, точки пользователя и объекта и коэфициент выше найти расстояние в км/м/хоть в чем то
  • Вопрос задан
  • 13229 просмотров
Подписаться 9 Оценить Комментировать
Решения вопроса 5
Mrrl
@Mrrl
Заводчик кардиганов
Формула "гаверсинуса":
const double R=6371;  // Earth's radius
double sin1=sin((lat1-lat2)/2);
double sin2=sin((lon1-lon2)/2);
return 2*R*asin(sqrt(sin1*sin1+sin2*sin2*cos(lat1)*cos(lat2)));

где lat1,lat2 - широты, а lon1,lon2 - долготы точек, выраженные в радианах.
Стоит ли ради этого подключать библиотеку?
Ответ написан
Adamos
@Adamos
Вам просто нужно выбрать ближайший объект - так зачем вам точное расстояние?
Посчитайте гипотенузу по разницам широт и долгот - у менее удаленного объекта она будет меньше. И все, никаких библиотек и, тем более, дерганья сторонних сервисов.
Ответ написан
@Getman_s
Разработчик с опытом более 30 лет
Хорошим вариантом вариантом было бы использовать базу PostgreSQL c расширением PostGIS. Там все вычисления можно делать прямо в запросах SQL. Также можете поискать информацию о "mysql spatial extentions".
Ответ написан
Alexiuscrow
@Alexiuscrow
SQL запрос для нахождения ближайших точек с отображением дистанции до каждой. Под MySQL.
SELECT
  id, (
    3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
  ) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

За подробностями сюда: gis.stackexchange.com/questions/31628/find-points-...
Ответ написан
Комментировать
вчера на хабре видел хорошую подборку библиотек, там аккурат есть хорошая библиотека PHPGeo
PHPGeo — простая библиотека для измерения расстояния между двумя координатами с высокой точностью. Она использует формулу Гаверсинуса и Винсента для вычисления расстояния. Вы можете интегрировать ее с любым приложением, связанным с картами или местоположениями.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Delphin2016
Программист Embarcadero (Delphi)
Доброго времени суток, уважаемые! )
У меня вот похожая задачка, но не могу сообразить как применить данную формулу в MySQL.
Мне нужно по списку координат вычислить общее пройденное расстояние желательно в км, или метрах за заданный отрезок времени..

SELECT SUM (Тут я так понимаю нужно вставить перевод Широты и Долготы в км или метры поля `Latitude` , `Longitude` хранятся в типе Float)
FROM `data`
WHERE `ID_Dev` = 1 and
`DateTime` BETWEEN '2021-05-04 08:00:00' AND '2021-05-04 20:00:00'

Кто то может мне помочь сформировать MySQL запрос чтобы эта формула обработала координаты и выдала общее суммарное расстояние?
Ответ написан
Ваш ответ на вопрос

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

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