找出大于100K位置之间的距离

时间:2016-06-22 21:02:56

标签: php mysql geolocation bigdata

我有两个包含位置的MySQL表,@using Microsoft.AspNetCore.Identity @using Core.Extensions @{ ViewData["Title"] = "Overview"; } <h4 class="mt-0 mb-5">Welcome back @User.Identity.FullName()</h4> table1(见下文)。有&gt;每个表中有100K行。我想使用他们的地理位置找到这两个表中每个位置之间的距离。

这是MySQL查询,用于查找单个地理位置之间的距离,例如(-37.22,88.88)和table2中的所有位置。

table1

鉴于这也是一个大数据,我不知道从哪里开始。想法?

1 个答案:

答案 0 :(得分:1)

  • 如果您想要优化旅行或靠近位置,您应该选择空间功能http://dev.mysql.com/doc/refman/5.7/en/spatial-extensions.html

  • 但看起来你想要每一个计算,所以是的,你需要做10亿次操作。

    • 我觉得时间在这里真的不是问题。因为一旦你拥有它,你就可以使用它。如果新地点到达,只计算与该地点的距离。
    • 但你必须优化。查询的最高成本部分是计算SIN()COS(),因此请为具有这些值的每一行创建aditional字段。所以你必须只做一次而不是每行100k次
    • 最后运行循环,以便以块为单位创建数据。

修改

阅读完最后评论后。你需要一个空间索引。与在数据库中搜索一个ID的方式相同,空间索引将优化您附近的搜索。

你也可以进行盒子搜索。不是搜索整个宇宙,而是在点周围创建一个框并在该框内搜索。使用普通浮动索引,你可以做这样的事情

  SELECT t1.name, t2.name,  mysql.Distancefunction(t1,t2) as distance
  from t1
  cross join t2
  WHERE t2.x between (t1.x - 0.001) and (t1.x + 0.001)   -- use x float index
    and t2.y between (t1.y - 0.001) and (t1.y + 0.001)   -- use y float index
    and mysql.Distancefunction(t1,t2) < 100 km           -- use spatial index

您可以使用delta 0.001。如果得到太多结果,则使用0.0001。如果您得到的结果很少,那么仅对没有100个邻居的那些位置执行0.01的第二步。