#mysql #google-maps
#mysql #google-карты
Вопрос:
Я работаю над проектом для службы автобусных консультаций с использованием Google Maps. Вы перетаскиваете значок в то место, где вы находитесь и куда хотите поехать, и приложение сообщит, на какой автобус сесть, это работает прямо сейчас, но я хочу составить комбинации автобусов, чтобы добраться до места, если нет прямого автобуса.
У меня есть все маршруты автобусов моего города в базе данных с lat / lng:
id | bus_id | lat | lng
-------------------------------------
1 | 12 | -23.232 | 23.328
2 | 12 | -23.233 | 23.327
3 | 12 | -23.234 | 23.326
4 | 12 | -23.235 | 23.325
Мой запрос на поиск ближайших автобусов к месту отправления и назначения lat / lng таков:
SELECT
id, number
FROM buses
WHERE id IN
(
SELECT bus_id
FROM coord
WHERE
POW((lat - '.$points["direction"]["lat"].'), 2) POW((lng - '.$points["direction"]["lng"].'), 2) < POW(('.$distance.' / 111.12), 2)
)
AND id IN
(
SELECT bus_id
FROM coord
WHERE
POW((lat - '.$points["person"]["lat"].'), 2) POW((lng - '.$points["person"]["lng"].'), 2) < POW(('.$distance.' / 111.12), 2)
)
Как я могу проверить комбинации шин, если для этих точек отправления / назначения нет прямой шины?
Спасибо!!
Кстати, проверьте: http://www.mapabondi.com.ar / Только на испанском, извините! (обратная связь приветствуется)
Редактировать:
Я придумал запрос, который определяет комбинации шин
SELECT
o.bus_id,
d.bus_id,
o.lat,
o.lng,
d.lat,
d.lng,
ROUND(GeoDistKM(o.lat,o.lng,d.lat,d.lng)) AS distance
FROM coord o
JOIN coord d
WHERE o.bus_id IN (
SELECT bus_id
FROM coord
WHERE
POW((lat - -31.528361), 2) POW((lng - -68.583527), 2) < POW((1 / 111.12), 2)
)
AND d.bus_id IN (
SELECT bus_id
FROM coord
WHERE
POW((lat - -31.571516), 2) POW((lng - -68.521385), 2) < POW((1 / 111.12), 2)
)
GROUP BY d.bus_id,o.bus_id
HAVING distance < 1
ORDER BY distance ASC
Моя единственная проблема сейчас связана с производительностью, этот запрос выполняется очень медленно… Есть ли шанс, что это может улучшиться с помощью хранимой процедуры или функции?
Ответ №1:
На самом деле это не ответ, но, возможно, что-то, что поможет вам начать.
Я думаю, вам следует рассмотреть возможность добавления новой таблицы bus_stops
bus_id bus_stop_name lat lon
12 stadium -23.145 23.315
12 halembra -23.234 23.326
...
14 halembra -23.234 23.326
14 dali -23.242 23.345
Тогда найти соответствие будет проще:
- найдите начальные и конечные ближайшие автобусные остановки по евклидову расстоянию
- найдите путь к общим автобусным остановкам, используя таблицу bus_stops
- эта проблема формализована в теории графов и называется обходом графа, см. Этот Запрос Google для получения информации и примера кода.
Однако это непросто! удачи.
Комментарии:
1. Спасибо за ваш комментарий Лоран, мой друг предположил, что я мог бы: 1) Найти все автобусы рядом с начальной точкой 2) Найти все автобусы рядом с конечной точкой 3) Как узнать, какие автобусы из этих двух списков имеют точки рядом между ними. Есть идеи, возможно ли это в одном или двух запросах?
2. Ваша проблема — одна из старейших в теории информации. Это называется «обход графика» и может потребовать много итераций. В Google с помощью ключевого слова with sql вы найдете много примеров. Теперь вы можете предпочесть находить решения только с одним изменением, это намного проще.