微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用laravel / php基于经度/纬度接近度对对象进行分组

我有一组用户.用户数可能是50或者可能是2000.每个用户都应该有一个我从Google Geo api检索到的长/ lat.

我需要查询所有内容,并按接近度和特定计数对它们进行分组.假设计数为12,我在该组中有120个用户.我想根据他们与其他人的距离(长/纬)来对人进行分组.因此,我最近接近10组人.

我目前有谷歌地理编码api设置,并希望使用它.

TIA.

– 更新
我已经谷歌搜索了一段时间,似乎我正在寻找一个空间查询,通过接近返回组.

解决方法:

请记住,随着您添加的每个用户,此问题呈指数级增长,因为距离计算量与用户数量的平方相关(实际上是N *(N-1)距离…因此,2000用户群将会意味着每次通过近400万次距离计算.在确定所需资源的大小时,请记住这一点

您是否希望根据直线(实际上是大圆圈)距离或基于步行/行驶距离对它们进行分组?

如果是前者,如果你能够容忍一小部分误差并希望假设地球是一个球体,那么大圆距离可以用简单的数学近似.来自GCMAP.com:

Earth’s hypothetical shape is called the geoid and is approximated by
an ellipsoid or an oblate sphereoid. A simpler model is to use a
sphere, which is pretty close and makes the math MUCH easier. Assuming
a sphere of radius 6371.2 km, convert longitude and latitude to
radians (multiply by pi/180) and then use the following formula:

theta = lon2 - lon1
dist = acos(sin(lat1) × sin(lat2) + cos(lat1) × cos(lat2) × cos(theta))
if (dist < 0) dist = dist + pi
dist = dist × 6371.2

The resulting distance is in kilometers.

现在,如果您需要精确的计算并且愿意花费大量复杂数学所需的cpu周期,您可以使用vincenty的公式,它使用地球的WGS-84参考椭球模型,用于导航,映射等等.更多信息HERE

对于算法本身,您需要使用每次计算的结果构建一个to-from矩阵.每行和每列代表每个节点.您可以考虑两种简化:

>距离不依赖于旅行方向,所以$dist [n] [m] == $dist [m] [n](无需计算整个矩阵,只需计算一半)
>从节点到自身的距离始终为0,因此无需计算,但由于您打算按距离进行分组,以避免用户与自身分组,您可能需要始终强制$dist [m] [ m]到一个任意定义的和异常大的常数(例如,$dist [m] [m] = 22000(英里).只要你的所有用户在这个星球上就可以工作)

完成所有计算后,使用数组排序方法找到每个节点最近的X节点,然后就可以了
(您可能希望也可能不希望阻止用户被分组到多个组,但这只是业务逻辑)

实际代码在此时提供的有点太多而没有首先看到你的一些进展,但这基本上是你需要做的算法.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐