Поиск местоположения на Google Maps, PHP и MySQL - PullRequest
3 голосов
/ 04 апреля 2011

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

Мой БД примерно такой:

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 данными широты / долготы, чтобы я мог сказать, где пользователь должен сесть на автобус и где спуститься.

Спасибо !!

(О, я забыл, есть предварительный просмотр , просто обычный HTML и ничего не работает, но полезно, если вы хотите посмотреть, как я планирую, чтобы это приложение выглядело. Кстати, оно на испанском, здесь вы идете в английский перевод 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, дело в том, что у автобусного маршрута будет много, сотни точек для описания всего маршрута.

Ответы [ 2 ]

9 голосов
/ 04 апреля 2011

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

$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 миль ...

enter image description here

дальше всего, но в пределах 10 миль...

enter image description here

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

0 голосов
/ 04 апреля 2011

Я думаю, вам придется сделать что-то вроде:

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

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

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

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

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

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

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