【问题标题】:Input starting and ending Geo locations(lat and long) and search from database(mysql) how many places between inputed starting and ending location?输入起始和结束地理位置(纬度和经度)并从数据库(mysql)中搜索输入的起始位置和结束位置之间的位置?
【发布时间】:2012-10-20 22:28:51
【问题描述】:

我很困惑,也很累,无法找到上面的技巧。实际上,我有一个数据库表,其中包含六个字段 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 and 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。

【问题讨论】:

  • 欢迎来到 SO。这是一个非常有趣的问题。你能澄清BETWEEN的意思吗?您是否正在寻找位于起点和终点之间的大圆路线路径 30 公里范围内的地点?您是否正在寻找位于由起点和终点定义的经纬度边界框内的位置?您的起点和终点是否足够接近,以至于由 lat-long 的线性插值确定的路径是一个足够的近似值(在印度可能是这样,但在挪威却不是)?请澄清您的问题。
  • “之间”是什么意思?这些位置是否都在 `latStart
  • 谢谢 Ollie Jones 和 Jpsy,我正在更新我的问题,请回来查看,希望这次你能理解。
  • 对不起Himanshu,但您的编辑并没有使它更清晰。我的理解是,您的数据库为每个用户保存四倍的地理位置(StartLat、StartLong、EndLat、EndLong),并且用户可以动态输入另一个四倍的数据(InputStartLat、InputStartLong、InputEndLat、InputEndLong),您可以从中输入将计算谷歌地图行车路线。但是您仍然无法通过“介于”来定义您所理解的内容。必须将 db-quadruple 哪些数学或算法属性视为在 input-quadruple 的点“之间”?
  • "BETWEEN" 表示它不是任何特殊词,但将其视为英语我想告诉您:当用户时

标签: php android mysql google-maps gps


【解决方案1】:

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

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

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%' 模式匹配)。

我希望这能阐明您的问题并使您走上正轨。

【讨论】:

  • 非常感谢 jpsy。其实我想要我坦率地说你。我正在制作一个应用程序,其中有两个选项 1.“Give Ride”和 2.“Need Ride”。例如,USER-A 选择了“Give Ride”选项,然后他必须使用 textView 输入一些信息,例如“FROM:(StartLat and StartLong)”“TO:(EndLat and EndLong)”。将存储此信息。
  • 现在 USER-B 选择其他选项“Need Ride”。他必须输入与“FROM:(InputStartLat and InputStartLong)”“TO:(InputEndLat and InputEndLong)”之前相同的信息。现在 App 将开始搜索为 USER-B 寻找匹配的路线。如果 USER-A 的路线与 USER-B 的路线匹配,则搜索结果将显示为选择选项 1.“Give Ride”的用户的姓名。
  • 在这个应用程序中,我需要一些指导方针,我应该使用数据库(mysql)或不使用任何 api,如驾驶方向?什么应该流动,我应该为这个应用程序使用什么?提前感谢一些指导方针对我很有帮助。
  • Himanshu,这终于回答了当您说“BETWEEN”时您真正想从数据库中提取什么的问题。不幸的是,这与您之前所说的完全不同。我猜你实际上必须将两个谷歌行车路线相互匹配。您必须检查请求的行程是否是所提供行程的子集。您还需要为不匹配留出一些余量,因为请求的行程的最初和最后几公里几乎总是会偏离任何给定的报价(例如,从最终起点/目的地到下一条高速公路的行程)。
  • 总而言之,这远远超出了一个简单的数据库请求。但首先你真的必须了解你的问题。我有一种感觉,你还没有真正迈出那一步。我将修改我的答案,至少为您的问题概述一个算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 2018-02-15
相关资源
最近更新 更多