我有一个数据库的用户提交的纬度/经度点,并试图分组‘关闭’点在一起."Close"是相对的,但目前看起来大约有500英尺.

起初,我似乎只能按小数点前3位具有相同纬度/经度的行进行分组(大致是300x300个框,了解到它随着您离开赤道而变化).

然而,这种方法似乎相当缺乏."紧密程度"不能与每个小数位代表的距离有显著差异.它没有考虑到两个位置在小数点后第三位(或任意位)可能有不同的数字,但仍然在该位置表示的距离(33.123933.1240)内.

我还仔细考虑了点A和点C都"靠近"点B(但不是彼此)的情况--它们应该组合在一起吗?如果是这样的话,当点D‘靠近’点C(并且没有其他点)时会发生什么--它是否也应该被分组.当然,我必须确定所需的行为,但两者将如何实现呢?

Can anyone point me in the right direction as to how this can be done and what different methods/approaches can be used?

我觉得我错过了一些明显的东西.

目前,数据是由PHP应用程序使用的MySQL数据库;但是,如果其他存储方法是实现这一点的关键部分,我对它们持开放态度.这里.

推荐答案

有很多方法可以确定两点之间的距离,但在二维图形上绘制点时,可能需要Euclidean distance.如果(x1, y1)代表第一个点,(x2, y2)代表第二个点,则距离为

d = sqrt( (x2-x1)^2 + (y2-y1)^2 )

关于分组,你可能想使用某种二维平均值来确定事物之间的"接近程度".例如,如果你有三个点,(x1, y1)(x2, y2)(x3, y3),你可以通过简单的平均来找到这三个点的中心:

x(mean) = (x1+x2+x3)/3
y(mean) = (y1+y2+y3)/3

然后,您可以查看每一个离中心有多近,以确定它是否应该是"星团"的一部分.


有许多方法可以定义群集,所有这些方法都使用clustering algorithm的某个变体.我现在很匆忙,没有时间总结,但是判断一下链接和算法,希望其他人能提供更多细节.祝好运!

Database相关问答推荐

位置运算符($)工作不正确

如何在Ballina中的事务失败时回滚缓存插入操作

Prisma - 将属性的类型设置为枚举数组

utf-8 与 latin1

数据库术语中的relation关系是什么意思?

PostgreSQL 嵌套 INSERTs / WITHs 用于外键插入

如何在 sql server 2005 中获取到数据库的详细连接列表?

外键可以作为主键吗?

如何在构建时创建填充的 MySQL Docker 映像

从 XML 读取数据

连接池策略效果怎样?

更改列类型而不丢失数据

Redis:数据库大小与内存的比率?

面向文档的数据库是否旨在取代关系数据库?

有什么理由不应该在生产中使用 h2 数据库?

SQL Server 自动备份

如何将 DECIMAL 插入 MySQL 数据库

如何将特定的、可变的 order订单保存到数据库中

MySQL 整数 0 与 NULL

如何使用 liquibase,一个具体的例子