3

我很困惑,也很累,无法找到上面的把戏。实际上,我有一个数据库表,其中包含六个字段 id、Sratlatitude、Startlongitude、EndLatitude、EndLongitude 和用户名。现在我想在数据库中查询

SELECT * FROM LOCATIONS(table name) WHERE USERS BETWEEN STARTING POINT(InputedStartlatitude and InputedStartlongitude) AND ENDING POINT(InputedEndlatitude and InputedEndlongitude);
例如:USERXXX 输入起点(InputedStartlatitude = 18.9647 和 InputedStartlongitude = 72.8258)= 孟买和终点(InputedEndlatitude = 18.9647 和 InputedEndlongitude = 72.8258)= 德里。现在他想使用 Inutedlatitudes 和 Inputedlongitudes 来搜索这条输入路线(行驶方向)之间有多少用户。搜索查询将触发到 mysql 数据库,并从存储的孟买到德里之间的开始和结束纬度和经度进行比较。

我为此找到了一种解决方案,例如对数据库进行查询:

SELECT * FROM lOCATIONS(tablename) WHERE (InputStartLatitude >= StartLatitude and IntartLongitude >= StartLong) and (InputEndLatitude <= EndLatitude and InuteEndLongitude <= EndLongitude);

但是我在上面的查询中遇到了一些问题。下面是一些地方的坐标。请看:

在此处输入图像描述

开始和结束坐标为红色。起点是:Porbandar,终点是:Mumbai。现在的问题是,我面临的问题是,当我尝试搜索 Porbandar 到 Mumbai 之间的城市时,由于我的查询,并非所有城市都实际位于行驶方向。我在我的查询中只调用了那些城市,它们是如何大于开始经纬度和小于结束经纬度的。但这里孟买的纬度和经度几乎低于所有城市。那么我怎样才能进行正确的搜索查询呢?
希望我已经很好地解释了上述情况。

任何回应都会对我很有帮助。
我在客户端使用 php-mysql 作为后端和 android。

4

1 回答 1

4

您的问题可能是如果您的起始值高于结束值,则您的搜索表达式无法正常工作。在将边界值与表格字段进行比较之前,您必须对其进行排序。

这是一个始终有效的查询 - 无论您的起始位置是结束位置的东边还是西边(北边或南边)。为方便起见,我使用 MySQL 的BETWEEN运算符而不是>=and <=,但此查询的主要细节是边界值使用LEASTandGREATEST运算符进行排序:

SELECT * 
  FROM `locationtable` 
  WHERE  ( `lat` BETWEEN LEAST(InputStartLatitude, InputEndLatitude) AND GREATEST(InputStartLatitude, InputEndLatitude) )  
  AND    ( `long` BETWEEN LEAST(InputStartLongitude, InputEndLongitude) AND GREATEST(InputStartLongitude, InputEndLongitude) )
;

希望这就是你要找的。

编辑:

在您现在指定了“之间”的真正含义之后,很明显您首先必须考虑一种算法来解决您的任务 - 早在您考虑该算法的实现之前(在 MySQL 或其他地方)。

这是我将如何解决您的难题的快速草图:

  1. 为请求的行程以及所有提供的行程获取 Google 行车路线。
  2. 这些行车路线包含“步数”(请参阅​​ Maps API),这些步数基本上是计算行程所经过的纬度/经度点列表。您必须将所有提供的游乐设施的行车路线存储在您的数据库中,因为您将一次又一次地需要它们来检查每个新请求的游乐设施。
  3. 现在的基本魔法是,查找请求的骑行的步骤是否是数据库中任何提供的骑行的步骤的子集。不幸的是,这几乎永远不会是这种情况,因为请求骑行的第一英里和最后一英里总是非常特定于请求者的位置(例如,从他家到下一条高速公路的道路)。所以你必须在这里实现一些容忍度。你可以通过多种方法做到这一点。让我举两个例子:

    a) 您可以尝试查找所请求的行程与任何提供的行程有哪些共同步骤,而不是检查请求的行程是否完全包含在任何提供的行程中(这从未发生过如上所述的情况)。从结果中取最长的一个(步数最多)。这个最长的可以“按原样”提供给请求者 - 这是他请求的最佳可用解决方案。找到共同的子部分可以通过以下方式完成:1.)在请求和任何提供的游乐设施的行驶方向上寻找第一个共同的纬度/经度步长坐标,以及 2.)从那里计算在两个游乐设施中相同的所有进一步步骤. 由于您必须将请求的游乐设施与所有提供的游乐设施相匹配,因此找到第一个公共纬度/经度坐标的过程确实非常昂贵!

    b) 另一种容错算法(更简单且更便宜)将首先丢弃从仅涵盖短距离的所有驾驶方向(乘车请求和乘车提议)的开始和结束的所有步骤。这些步骤很可能是往返于下一条高速公路的本地驾驶。然后,您可以直接匹配缩短的列表,而无需进一步容忍。如果(缩短的)请求完全包含在任何(缩短的)报价中,则该报价是成功的。这样做非常便宜。如果你创建了一个聪明的数据表示,你甚至可以在 MySQL 中做到这一点。例如,您可以在缩短的列表中创建所有纬度/经度对的字符串表示形式,并检查数据库中包含作为完整子字符串请求的乘车的提供的乘车(使用 MySQL 的LIKE '%string%'模式匹配)。

我希望这能对您的问题有所了解,并使您走上正轨。

于 2012-11-02T10:51:53.707 回答