【发布时间】:2013-05-18 20:50:36
【问题描述】:
我正在构建一个网络应用程序(只是为了好玩 xD),您可以在其中告诉它您在哪里以及您想去哪里,然后您可以搜索您可能乘坐的巴士列表。
我的数据库是这样的:
buses
---------------------------------
id | bus_number | bus_description
routes
-----------------------
id | bus_id | lat | lng
您可能会注意到,路线表存储了公共汽车遵循的路线点,如果找到任何搜索结果,我将用折线显示这些点。 问题是我如何编写一些 SQL,给定这 2 个参数(用户在哪里,他想去哪里)并找到并显示正确的总线?
我从 Google Maps 文档中找到了这个 select 语句,这很好(而且效果很好!)因为它可以告诉我给定的 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;
但我需要它与给定 Lat/Lng 的 2 一起工作,这样我就可以知道用户必须在哪里乘坐公共汽车,以及在哪里下车。
谢谢!!
(哦,我忘了,有一个 preview,只是普通的 html,没有任何工作,但如果你想看看我打算如何设计这个应用程序,这很有用。顺便说一句,它是西班牙语,你可以进去english google translated)
更新:以下是路线表上的一些示例数据:
+----+-------+------------+------------+
| 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 值,关键是一条公交路线会有很多,数百个点来描述完整的路线。
【问题讨论】:
-
我不明白这一点。公共汽车是从 A 到 B 还是从 A..B ?您可以在此处转储一些数据。
-
巴士从 A..B 出发,所以路线表会是这样的:
id|bus_id|lat|lng ---------------------- 1, 1, -43.341,-33.2321 2, 1, -43.342,-33.2322 3, 1, -43.343,-33.2323 4, 1, -43.344,-33.2324 -
(好吧,我不知道 cmets 的“代码”格式是如何工作的)
-
好的,你找到了相对于用户最近的公交车站,以及相对于目的地最近的公交车站,然后检查 A 站是否与 B 站在同一条路线上(尝试匹配它们),类似的。
-
是的,这正是我所需要的。我想我可以选择第一个 lat/lng 值,然后选择第二个 lat/lng,然后比较或交叉一些表格。
标签: php mysql google-maps