我是mysql中地理位置处理的新手。我正在尝试确定最常访问的位置。数据库是mysql,表使用Mysiam Engine,我在该位置有一些地理索引。这是表头。
| id | user_id | datetime |位置|
该位置由lat和long的几何点表示,我可以从GPS读数中获得。由于GPS测量中的误差和噪声,从任何点开始的20米半径仍被认为是相同的点。所以,我想基于一个点和一个半径找到最常访问的区域。我虽然使用MBR,但我不清楚如何进行选择语句
SELECT location FROM locations WHERE user_id = 2 AND ...;
答案 0 :(得分:0)
如果您愿意接受20米边长(不是半径20米)的 square ,这是一个相对简单的解决方案。算法:
将GPS数据分为纬度和长坐标(如果数据为整数格式,则使用模MOD
和整数除DIV
运算,或SUBSTRING
VARCHAR
)。
在GPS纬度和长坐标中找到相当于20米的值。请将此值0.5*length_unit
。
在两个方向上设置点距离为length_unit
的2D网格。将任何纬度和长坐标舍入到下一个网格点(将两个坐标除以length_unit
,然后使用普通的ROUND
函数。此时,您到达了一个包含| id | user_id | datetime | location |
列的表格,其中location
中的条目是标准化的,即舍入为网格点。
最后,您可以使用" normal"分组功能以获得结果。
这是一个可能的实现,可以给你一个想法(然而,这个想法是未经测试的,可能不会像这样工作):
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点。
最后,针对每个网格点计算给定时间间隔内的访问者数量,即,对每个用户进行求和(注意,这包括在一个位置多于一次的用户)。
如果您在实施过程中遇到问题,请发表评论。