Я создаю веб-приложение (только для развлечения 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 от желаемого адресата пользователя и для каждого храните в массив:
2) найдите наименьшее расстояние для каждого bus_id, оставив меньший массив из одной точки на bus_id (не совсем точно, лучший подход к этому, но, возможно, второй запрос с использованием расстояния, отсортированный по возрастанию, предел 1)
3) пройдите по этому массиву, ищите все точки в таблице маршрутов, которые находятся на расстоянии X от начальной точки пользователя, и которые тестируют bus_id. поместите их во второй массив
4) повторите шаг 2 в массиве конечных точек
5) теперь должно быть только одно очко для каждого bus_id в каждом массиве, так что вы можете нарисовать свои полилинии для каждой шины_ид, появляющейся в обоих наборах (если у вас очень удобная транзитная система может быть более одного)