输入起点和终点的地理位置(纬度和经度),并从数据库(mysql)中查询输入的起始点和终点之间有多少个地方?

3
我很困惑,也很疲惫地在搜索如何实现上述技巧。我有一个数据库表,包括六个字段:id、起点纬度、起点经度、终点纬度、终点经度和用户名。现在我想在数据库中查询,例如:
SELECT * FROM LOCATIONS(表名)WHERE USERS BETWEEN STARTING POINT(输入的起点纬度和输入的起点经度)AND ENDING POINT(输入的终点纬度和输入的终点经度);
例如:用户XXX输入了起点(InputedStartlatitude = 18.9647 和InputedStartlongitude = 72.8258)是孟买,终点(InputedEndlatitude = 18.9647 和 InputedEndlongitude = 72.8258)是德里。现在他想要搜索在这条输入的路线(行驶方向)上有多少个用户,使用Inutedlatitudes和Inputedlongitudes进行搜索。搜索查询将被发送到mysql数据库,并从存储的起点和终点纬度和经度中进行比较,这些起点和终点位于孟买到德里之间。

我找到了一种解决方法,就是向数据库提出以下查询: ```SELECT * FROM LOCATIONS WHERE StartLatitude >= InputedStartlatitude AND StartLongitude >= InputedStartlongitude AND EndLatitude <= InputedEndlatitude AND EndLongitude <= InputedEndlongitude;```
SELECT * FROM lOCATIONS(tablename) WHERE (InputStartLatitude >= StartLatitude and IntartLongitude >= StartLong) and (InputEndLatitude <= EndLatitude and InuteEndLongitude <= EndLongitude);

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

enter image description here

起始和结束坐标以红色显示。起点是:Porbandar,终点是:孟买。现在问题在于,当我尝试搜索Porbandar到Mumbai之间的城市时,由于我的查询,实际上在驾驶方向上并不是所有城市都出现。我在查询中只调用了那些经度和纬度大于起始经度和纬度且小于终点经度和纬度的城市。但是在这里,孟买的经度和纬度几乎比所有城市都要小。那么我该如何制作正确的搜索查询?
希望我已经很好地解释了上述情况。

任何回复都对我非常有帮助。
我正在使用php-mysql作为后端和Android作为客户端。


2
欢迎来到SO。这是一个非常有趣的问题。您能澄清一下BETWEEN的含义吗?您是否正在寻找位于起点和终点之间的大圆路线路径内30公里范围内的地点?您是否正在寻找位于由起点和终点定义的纬度-经度边界框内的地点?您的起点和终点是否足够接近,以使通过纬度-经度的线性插值确定的路径是足够的近似(在印度可能是真实的,但在挪威不是)?请澄清您的问题。 - O. Jones
2
“between”是什么意思?这些位置都在球形正方形`latStart<=latX<=latEnd && longStart<=longX<=longEnd'内吗?还是您想找到数据库中Google地图驾驶路线从起点到终点会经过/穿过的所有位置? - Jpsy
谢谢Ollie Jones和Jpsy,我正在更新我的问题,请回来查看,希望这次你们能够理解得很好。 - Himanshu Dhakecha
抱歉,Himanshu,但是你的编辑并没有让它更清晰。我的理解是,你的数据库为每个用户保存地理位置四元组(StartLat、StartLong、EndLat、EndLong),用户可以即时输入另一个四元组数据(InputStartLat、InputStartLong、InputEndLat、InputEndLong),从中你将计算Google Maps驾车路线。但你仍然未能定义你所理解的“之间”是什么意思。数据库四元组必须具有什么数学或算法特性才能被认为是在输入四元组点之间? - Jpsy
"BETWEEN" 意思并不是任何特殊的单词,只是把它当作英语中的一个词。我想告诉你的是:当用户... - Himanshu Dhakecha
“BETWEEN” 意味着它不是任何特殊的单词,但请将其视为英语,因为我只想告诉您这个:当用户输入起始和结束纬度和经度并查询数据库结果时,应该像这样:InputStartLat,InputStartLong<=======城市列表======>InputEndLat,InputEndLong。这里的“<=======城市列表 =====>”是指在用户输入的坐标之间的起始纬度、起始经度和结束纬度、结束经度之间的城市。希望您现在能理解。 - Himanshu Dhakecha
1个回答

4
你的问题可能是,如果起始值高于结束值,则搜索表达式不正确。在将它们与表字段进行比较之前,您必须对边界值进行排序。
以下查询将始终有效-无论您的起始位置是东还是西(以及南或北)。为了方便起见,我使用了MySQL的BETWEEN运算符而不是>=和<=,但此查询的主要细节是使用LEAST和GREATEST运算符对边界值进行排序:
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. 获取所请求的行程以及所有提供的行程的谷歌驾车路线。
  2. 这些驾车路线包含“步骤”(请参见Maps API),它们基本上是一组纬度/经度点的列表,所有这些点都被计算出的行程所穿过。您需要将所有提供的行程的驾车路线存储在数据库中,因为您需要反复检查每个新请求的行程。
  3. 现在的基本魔法是找到所请求的行程的步骤是否是数据库中任何提供的行程的子集。不幸的是,这几乎永远不会发生,因为所请求的行程的第一英里和最后一英里总是非常特定于请求者的位置(例如,从他家到下一个高速公路的道路)。因此,您必须在这里实现一些容差。您可以通过多种方法来做到这一点。让我给你两个例子:

    a)与其检查所请求的行程是否完全包含在任何提供的行程中(如上所述,从未发生过),不如试图找出所请求的行程与任何提供的行程有哪些步骤相同。从结果中取最长的一个(具有最多步骤),这个最长的可以“按原样”提供给请求者——这是他的请求的最佳可用解决方案。找到共同子部分可以通过以下方式完成:1)查找所请求的行程和任何提供的行程的驾车路线中第一个共同的纬度/经度步骤坐标;2)从那里开始计算在两个行程中都相同的所有进一步的步骤。由于您必须将所请求的行程与所有提供的行程进行匹配,因此找到第一个公共的纬度/经度坐标的过程确实可能非常昂贵!

    b)另一个容错算法(更简单、更便宜)是首先丢弃所有驾驶路线(乘车请求和乘车提供)开头和结尾只覆盖短距离的步骤。这些步骤很可能是从下一个高速公路到达并离开当地驾驶。然后,您可以直接匹配缩短的列表而无需进一步容忍。如果(缩短的)请求完全包含在任何(缩短的)提供中,则该提供是一个命中。这非常便宜。您甚至可以在MySQL中完成这项工作,如果您创建了一个聪明的数据表示。例如,您可以创建缩短列表中所有纬度/经度对的字符串表示,并检查数据库是否包含将请求行程作为完整子字符串的提供行程(使用MySQL的LIKE '%string%'模式匹配)。

我希望这能为您解决问题并使您走上正确的轨道。

非常感谢您,jpsy。实际上我想坦率地告诉您我的需求。我正在制作一个应用程序,其中有两个选项:1.“提供乘车”和2.“需要乘车”。例如,如果用户A选择了“提供乘车”选项,则他必须使用textView输入一些信息,如“从:(StartLat和StartLong)”“到:(EndLat和EndLong)”。这些信息将被存储。 - Himanshu Dhakecha
1
Himanshu,这最终回答了你说“BETWEEN”时真正想从数据库中提取什么的问题。不幸的是,那是一个完全不同的“BETWEEN”,与你之前谈论的不同。我猜你实际上需要将两个谷歌驾驶方向相互匹配。您需要检查所请求的乘车是否是提供的乘车的子集。您还需要允许一些不匹配的余地,因为所请求的乘车的前几公里和后几公里几乎总是偏离任何给定的行程(例如,从最终起点/终点到下一个高速公路的行程)。 - Jpsy
我会尝试两种方法,然后决定哪个更适合我。我也会向您报告哪一个更好,以及我的应用程序运行情况如何。非常感谢您。 - Himanshu Dhakecha
但我仍然没有得到正确的结果...有什么想法吗? - Himanshu Dhakecha
是的,我有点理解,并且已经做了一些实际操作... 我正在存储所有提供的车程的步骤(Google驾驶方向:仅开始纬度,开始经度,结束纬度,结束经度)。现在我困惑于如何在mysql数据库中查询,以检查请求车程的步骤是否是任何提供车程的步骤的子集?如果我走错了,请告诉我... - Himanshu Dhakecha
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接