使用Mysql Mysiam表选择增量中最常访问的位置

时间:2014-05-21 19:45:01

标签: mysql sql database select geolocation

我是mysql中地理位置处理的新手。我正在尝试确定最常访问的位置。数据库是mysql,表使用Mysiam Engine,我在该位置有一些地理索引。这是表头。

| id | user_id | datetime |位置|

该位置由lat和long的几何点表示,我可以从GPS读数中获得。由于GPS测量中的误差和噪声,从任何点开始的20米半径仍被认为是相同的点。所以,我想基于一个点和一个半径找到最常访问的区域。我虽然使用MBR,但我不清楚如何进行选择语句

SELECT location FROM locations WHERE user_id = 2 AND  ...;

1 个答案:

答案 0 :(得分:0)

如果您愿意接受20米边长(不是半径20米)的 square ,这是一个相对简单的解决方案。算法:

  1. 将GPS数据分为纬度和长坐标(如果数据为整数格式,则使用模MOD和整数除DIV运算,或SUBSTRING VARCHAR)。

  2. 在GPS纬度和长坐标中找到相当于20米的值。请将此值0.5*length_unit

  3. 调用
  4. 在两个方向上设置点距离为length_unit的2D网格。将任何纬度和长坐标舍入到下一个网格点(将两个坐标除以length_unit,然后使用普通的ROUND函数。此时,您到达了一个包含| id | user_id | datetime | location |列的表格,其中location中的条目是标准化的,即舍入为网格点。

  5. 最后,您可以使用" normal"分组功能以获得结果。


  6. 这是一个可能的实现,可以给你一个想法(然而,这个想法是未经测试的,可能不会像这样工作):

    SELECT lat*length_unit, long*length_unit, COUNT(*) AS number_of_visits
    FROM
          (SELECT user_id
                , datetime
                //here you have to figure it out by yourself
                , ROUND(CONVERT(SUBSTRING(location,1,3),INTEGER) / length_unit) AS lat
                , ROUND(CONVERT(SUBSTRING(location,5,3),INTEGER) / length_unit) AS long
                FROM your_table
          )
    WHERE datetime BETWEEN first_date AND second_date
    GROUP BY lat, long
    

    主要工作在以下一行完成,需要由你调整(类似于long):

    ROUND(CONVERT(SUBSTRING(location,1,3),INTEGER) / (2*length_unit)) AS lat
    

    在这里,我假设GPS坐标是长度为7的VARCHAR(类似123'456)。此字符串被拆分为lat / long,然后转换为整数并除以length_unit。你得到一个像34.723这样的数字,它在下一步中被舍入为35.这意味着你在你网格的35点。

    最后,针对每个网格点计算给定时间间隔内的访问者数量,即,对每个用户进行求和(注意,这包括在一个位置多于一次的用户)。

    如果您在实施过程中遇到问题,请发表评论。