在谷歌地图,PHP& MySQL的

时间:2011-04-03 23:06:42

标签: php mysql google-maps

我正在建立一个网络应用程序(只是为了好玩的xD),你可以告诉它你在哪里以及你想去哪里,然后你可以搜索你可能带的公共汽车列表。

我的数据库是这样的:

buses
---------------------------------
id | bus_number | bus_description

routes
-----------------------
id | bus_id | lat | lng
正如您所注意到的,

路线表存储了公交车所遵循的路线点,如果找到任何搜索结果,我将使用折线显示点。 问题是我如何编写一些SQL,给出这2个参数(用户所在的位置,以及他想去的地方)并找到并显示正确的总线?

我从谷歌地图文档中找到了这个选择语句,这很好(并且效果很好!)因为它可以告诉我一个给定的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个给定的Lat / Lng,所以我可以告诉用户必须在哪里乘坐公共汽车,以及在哪里下车。

谢谢!

(哦,我忘记了,有一个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值,重点是总线路线将有多个,数百个点来描述完整路线。

2 个答案:

答案 0 :(得分:9)

好的,让我们开始吧,使用下面的查询,您可以在特定半径(英里)内获得最近的公交车站。查询将返回定义半径内的每个点。

$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

答案 1 :(得分:0)

我认为你必须做类似的事情:

1)在路线表中搜索所需用户目的地的X距离内的所有点,并为每个点存储到数组中:

  • bus_id
  • 该路线行与之间的距离 用户
  • 路线行ID

2)找到每个bus_id的最小距离,为每个bus_id留下一个较小的单点数组(不确定最好的方法,但可能是使用距离的第二个查询,按升序排序,限制1)

3)遍历此数组,搜索路由表中距离用户起始点 AND 的X距离内的所有点,这些点已经过测试的bus_id 。将这些放在第二个数组中

4)在终点阵列上重复步骤2

5)现在每个阵列中的每个bus_id应该只有一个点,因此您可以为两个集合中出现的每个bus_id绘制折线(如果您有一个非常用户友好的传输系统,则可能有多个)< / p>