Google Maps MySQL запрос, чтобы найти автобус - PullRequest
1 голос
/ 08 октября 2011

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

У меня есть все автобусные маршруты моего города в базу данных с широтой / долготой:

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

Мой запрос на поиск ближайших автобусов к пункту назначения широта / долгота следующий:

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/ Только на испанском языке, извините! (обратная связь приветствуется)

EDIT:

Я пришел с запросом, который выясняет комбинации шин

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 Ответ

1 голос
/ 08 октября 2011

На самом деле не ответ, но, возможно, что-то для начала.

Я думаю, вам следует подумать о добавлении новой таблицы 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 для получения информации и примера кода.

Хотя это не так просто!удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...