Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为带有纬度和经度的表查找25个最近的地址_Mysql_Gis_Latitude Longitude_Distance - Fatal编程技术网

Mysql 为带有纬度和经度的表查找25个最近的地址

Mysql 为带有纬度和经度的表查找25个最近的地址,mysql,gis,latitude-longitude,distance,Mysql,Gis,Latitude Longitude,Distance,我正在尝试创建一个新表,其中包含另一个表中每个地址的列表,它是10个最近的地址。每个记录都有纬度和经度。显然,在所有记录上运行all比数百万条记录所需的工作量要大得多 然而,我突然想到,如果我使用纬度、经度对表格进行检索/索引,那么它将自动按距离排序,并且我可以通过ID+/-25单步遍历每个记录 然而,这仍然留给我一个问题;查询两个记录之间的距离(每个记录都有纬度/经度)是什么样子的?如果我是你,我会有关于纬度和经度的索引。然后我会从表中选择COUNT*,其中table.lation在query

我正在尝试创建一个新表,其中包含另一个表中每个地址的列表,它是10个最近的地址。每个记录都有纬度和经度。显然,在所有记录上运行all比数百万条记录所需的工作量要大得多

然而,我突然想到,如果我使用纬度、经度对表格进行检索/索引,那么它将自动按距离排序,并且我可以通过ID+/-25单步遍历每个记录


然而,这仍然留给我一个问题;查询两个记录之间的距离(每个记录都有纬度/经度)是什么样子的?

如果我是你,我会有关于纬度和经度的索引。然后我会从表中选择COUNT*,其中table.lation在query_lat-x和query_lat+x之间,table.lation在query_long-y和query_long+y之间;,每次精炼x和y,直到计数下降到大约100条记录。也许我会将最终的x和y值存储到查询地址的记录中,这样下次就不必进行太多查询了。然后,我将对所有列运行查询,而不仅仅是COUNT*,以获得实际的纬度和经度,并可能使用堆队列获得25个最短距离

这里真正困难的是经度和距离之间的关系也取决于纬度;他们不是独立的。我不确定将球坐标变换放入查询中是否是一个好主意


您使用纬度/经度作为id的技巧不会起作用,因为它不会正确排序。例如,这种排序会告诉您休斯顿比奥斯汀离圣安东尼奥更近。

为什么要创建一个包含一亿条记录的新表,而不是在需要时查询与给定地址最近的十条记录?对地址表的更改将导致派生表的大量重新计算。由于该表是一个建筑/地址表,lat/long排序似乎对每个地址都有大致的了解。我想知道我要找的基本距离,比如说两个街区,或者说150-200米,这会有帮助吗?换言之,在150-200米范围内找到最近的距离?我概述的方法应该会有帮助,它会筛选出数据库中的大部分条目,然后只获取四分之一英里范围内的条目。对于一个城市来说,经度随纬度的变化应该不会太大,但在两极附近的城市可能会导致一些奇怪的结果。按纬度排序然后按经度排序仍然不起作用。例如,如果你有一个街道几乎与指南针方向对齐的区域,那么东西方向的街道上的所有位置,无论有多远,都会比南北方向不到一个街区的位置更近。是的,当我今晚回家思考时,我有点意识到了这一点。这将使确定“最坏情况”成为每个城市每个街区的最大问题。顺便说一句,我可以在地址上做的一件事是识别/提取街道,这样我就可以使用lat/long,然后使用where street=大街那么,在您的查询中,query_lat是一个msql距离函数吗?对于X和Y,我是否可以在lat和long中使用一些值来指定/限制100码?query_lat和query_long是您感兴趣的起点的纬度和经度,即from地址。x和y是沿各自轴与起点的距离。因此,查询将获取以感兴趣的地址为中心的矩形中的每个地址。同样,我们的想法是尽可能多地排除距离不够近的位置。虽然可以在查询中使用公式计算每条记录的距离,但由于sqrt调用,该查询可能会非常慢。如果必须在SQL中执行所有操作,可以将其用作预筛选子查询,然后仅在该位置子集上计算距离。