запрос mysql на картах Google для поиска шины

#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 вы найдете много примеров. Теперь вы можете предпочесть находить решения только с одним изменением, это намного проще.