我有一个包含区域和纬度/经度位置列的 MySQL 表。每个区域都有很多位置,例如20.000
。有没有办法只选择几个,比如 100
,看起来在地图上分布得比较均匀?
分布不一定要完美,查询速度更重要。如果直接使用 MySQL 无法做到这一点,则可以使用一种非常快速的算法来选择均匀分布的位置。
提前致谢。
编辑:回答评论中的一些请求。数据没有任何可以使用的东西,它只是面积和位置坐标,例如:
+-------+--------------+----------+-----------+------------+--------+--------+ | id | area | postcode | lat | lon | colour | size | +-------+--------------+----------+-----------+------------+--------+--------+ | 16895 | Athens | 10431 | 37.983917 | 23.7293599 | red | big | | 16995 | Athens | 11523 | 37.883917 | 23.8293599 | green | medium | | 16996 | Athens | 10432 | 37.783917 | 23.7293599 | yellow | small | | 17000 | Thessaloniki | 54453 | 40.783917 | 22.7293599 | green | small | +-------+--------------+----------+-----------+------------+--------+--------+
还有一些具有特征的列,但这些列仅用于过滤。
我确实尝试同时获取 nth
行,它似乎可以工作,尽管有点慢
SET @a = 0; select * from `locations` where (@a := @a + 1) % 200 = 0
使用 random()
也可以,但也有点慢。
编辑2:事实证明,在表格上添加邮政编码很容易。有了这个,按邮政编码分组似乎给出了一个赏心悦目的结果。唯一的问题是,有非常大的区域,大约有 3000 个不同的邮政编码,而仅获取 100 个可能最终会导致其中许多显示在一个地方,因此可能需要在 PHP 中进一步处理。
Edit3,在评论中回答@RickJames 的问题,以便它们位于一个位置:
AUTO_INCRMENT
id 并且可以有间隙1000
,我们希望仅显示随机的 100
。如果 1000
或更少,我们可以只显示所有内容P粉9820544492024-02-27 00:20:37
这是一种可以满足目标的方法。
至于“重复项”,请将此视为发现两个项目落在同一位置的粗略方法:
SELECT ROUND(latitude * 5), ROUND(longitude * 3), MIN(id) AS id_to_keep FROM tbl GROUP BY 1,2
“5”和“3”可以向上(或向下)调整,以保留更多(或更少)的 id。由于纬度/经度的排列方式,“5”和“3”是不同的;这个比例可能适用于大多数温带地区。 (在赤道附近使用相同的数量,在更高纬度使用更大的配给。)
有一个小缺陷...两个非常接近的项目可能会跨越由 ROUNDs
创建的边界。
原表有多少行?上述查询生成了多少行? ( SELECT COUNT(*) FROM ( ... ) x;
)