Поиск по местоположению на Google Картах, PHP и MySQL

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

Мой db выглядит примерно так:

buses --------------------------------- id | bus_number | bus_description routes ----------------------- id | bus_id | lat | lng 

таблица маршрутов, как вы можете заметить, сохраняет точки маршрута, по которым идет автобус, точки, которые я буду показывать с помощью полилинии, если будут найдены какие-либо результаты поиска. Вопрос в том, как я могу написать некоторый SQL, учитывая эти 2 параметра (где пользователь и куда он хочет пойти), и найти и показать правильные автобусы?

Я нашел этот оператор select из документов Google Maps, который хорош (и отлично работает!), Потому что он может сказать мне, если данный Lat / Lng находится в радиусе (в данном случае 25 миль) другого:

 SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

Но мне нужно это для работы с 2 данными Lat / Lng, поэтому я могу сказать, где пользователь должен взять автобус и куда спуститься.

Благодаря!!

(О, я забыл, есть предварительный просмотр , просто html и ничего не работает, но полезно, если вы хотите посмотреть, как я планирую это приложение. Btw это на испанском языке, здесь вы переходите на английский язык google )

Обновление: вот несколько примеров данных в таблице маршрутов:

 +----+-------+------------+------------+ | id | bus_id| lat | lng | +----+-------+------------+------------+ | 1 | 1 | -31,527273 | -68,521408 | | 2 | 1 | -32,890182 | -68,844048 | | 3 | 1 | -31,527273 | -68,521408 | | 4 | 1 | -32,890182 | -68,844048 | | 5 | 1 | -31,527273 | -68,521408 | | 6 | 2 | -32,890182 | -68,844048 | | 7 | 2 | -31,527273 | -68,521408 | | 8 | 2 | -32,890182 | -68,844048 | | 9 | 2 | -31,527273 | -68,521408 | | 10| 2 | -32,890182 | -68,844048 | +----+-------+------------+------------+ 

Просто игнорируйте повторяющиеся значения lat, lng, дело в том, что для маршрута автобуса будет много, сотни точек, чтобы описать полный маршрут.

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

 $lat = -31,52; $lon = -68,52; $multiplier = 112.12; // use 69.0467669 if you want miles $distance = 10; // kilometers or miles if 69.0467669 $query = "SELECT *, (SQRT(POW((lat - $lat), 2) + POW((lng - $lng), 2)) * $multiplier) AS distance FROM routes WHERE POW((lat - $lat), 2) + POW((lng - $lng), 2) < POW(($distance / $multiplier), 2) ORDER BY distance ASC"; 

Результат … ближайший в радиусе 10 миль …

введите описание изображения здесь

самый дальний, но в пределах 10 миль …

введите описание изображения здесь

Теперь повторите то же самое для destination , а затем выполните поиск в таблице для автобусов по этому маршруту. Также проверьте эту ссылку … http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

Я думаю, вам нужно будет сделать что-то вроде:

1) найдите таблицу маршрутов для всех точек на расстоянии X от желаемого адресата пользователя и для каждого храните в массив:

  • bus_id
  • расстояние между этой строкой маршрута и пользователем
  • идентификатор строки маршрута

2) найдите наименьшее расстояние для каждого bus_id, оставив меньший массив из одной точки на bus_id (не совсем точно, лучший подход к этому, но, возможно, второй запрос с использованием расстояния, отсортированный по возрастанию, предел 1)

3) пройдите по этому массиву, ищите все точки в таблице маршрутов, которые находятся на расстоянии X от начальной точки пользователя, и которые тестируют bus_id. поместите их во второй массив

4) повторите шаг 2 в массиве конечных точек

5) теперь должно быть только одно очко для каждого bus_id в каждом массиве, так что вы можете нарисовать свои полилинии для каждой шины_ид, появляющейся в обоих наборах (если у вас очень удобная транзитная система может быть более одного)