Найти тему
Clan.rocks

Расстояние до разных точек на php

Оглавление

Чтобы выбрать наиболее подходящий магазин/автосалон/ногтевой мало иметь их список местоположений. Надо знать насколько далеко они от тебя.

Попробуем узнать это у API google.map.

У нас есть список ногтевых салонов в Екатеринбурге. Как узнать какой ближе всего?

Для этого у нас есть отличная библиотека Distance Matrix:

https://developers.google.com/maps/documentation/distance-matrix/intro

Подключаем библиотеку в консоли разработчика Google и пробуем её использовать.

А где мы?

Чтобы получить расстояние нам нужно знать изначальную точку, самый простой вариант получить гео-точку получить её из js.

navigator.geolocation.getCurrentPosition(function(location) {
console.log(location.coords.latitude);
console.log(location.coords.longitude);
var corodinate_origin = location.coords.latitude + "," + location.coords.longitude;
});

Сейчас мы можем узнать расстояние от нас до ногтевых салонов Екатеринбурга.

Distance matrix API

Для этого нам нужно отправить запрос по следующему адресу:

https://maps.googleapis.com/maps/api/distancematrix/json?origins=corodinate_origin&destinations=КООРДИНАТЫ_ТОЧЕК_НАЗНАЧЕНИЯ&mode=ВИД_ТРАНСПОРТА&key=YOUR_API_KEY

КООРДИНАТЫ_ТОЧЕК_НАЗНАЧЕНИЯ могут быть как в формате долгота,широта так и в формате place_id, так и формате обычного адреса. Каждый координат точек должны быть разделены "|".

ВИД_ТРАНСПОРТА существуют следующие варианты транспорта:

driving (по умолчанию) указывает расчет расстояния с использованием автомобиля.

walking запрашивает расчет расстояния для пешеходного движения по пешеходным дорожкам и тротуарам (если доступно).

bicycling запрашивает расчет расстояния для езды на велосипеде по велосипедным дорожкам и предпочитаемым улицам (при наличии).

transit запрашивает расчет расстояния по маршрутам общественного транспорта (при наличии). Это значение может быть указано только в том случае, если у вас идентификатор клиента Премиум-плана API Карт Google.

Текущее местоположение

Конечно, данный функционал при помощи js, но для реализации данной функции мы прибегнем к php, чтобы передать на php координаты, полученные в js будем проверять наличие свойства origin в get-запросе и если свойства нет, то js запрашивает координаты и добавляет их в get-запрос:

let oGet = searchToObject(); //преобразуем строку поиска location.search в объект
if(!('origin' in oGet)) get_location(oGet);//если свойства нет запускаем функцию поиска координат
function get_location(oGet){
navigator.geolocation.getCurrentPosition(function(geolocation) {
//при получении координат добавляем свойство origin в объект
oGet['origin'] = geolocation.coords.latitude + ',' + geolocation.coords.longitude;
//преобразовываем объект в get-запрос
var queryString = Object.keys(oGet).map(key => key + '=' + oGet[key]).join('&');
//переходим по запросу
window.location.href = '?' + queryString;
});
}

Теперь мы можем работать в php.

Расчет расстояний

Добавим в класс Place функцию расчета расстояния:

function get_ditanceMatrix($origin, $arDistance){
$arGet=[];
$arGet['language']=$this->language;
$arGet['key'] = $this->key;
$arGet['units'] = 'metric';
$arGet['mode'] = 'walking';
$arGet['origins'] = $origin;
$arGet['destinations'] = implode('|', $arDistance);
$url= 'https://maps.googleapis.com/maps/api/distancematrix/';
return $this->query($url,$arGet);
}

Возьмём список имеющихся в нашей базе точек ногтевых салонов, в цикле возьмем координаты и отправим запрос на вычисления.

$origin = $_GET['origin'];
$arCoordsDestinations = [];
foreach($arPlacesas as $arPLace){
$arCoordsDestinations[] = implode(',',$arPLace['geometry']['location']);
}
$arDistances = $cPlace->get_ditanceMatrix($origin, $arCoordsDestinations);

В итоге мы получаем массив с расстоянием и временем до точек назначения.

Последовательность в массиве соответствует последовательности отправленных точек. Присвоим полученные значения нашим точкам:

$n_el = 0;
foreach($arDistances['rows'] as $row){
foreach($row['elements'] as $element){
$arPlaces[$n_el]['distance'] = $element;
$n_el++;
}
}

Отсортируем получившийся массив по степени удалённости:

usort($arPlaces, function($a, $b){
return ($a['distance']['distance']['value'] - $b['distance']['distance']['value']);
});

Теперь мы знаем самый близкий ногтевой салон.