如何用sql从一个有经纬度的数据集中得到一个有代表性的均匀分布的子集?

How to use sql to get a representative evenly distributed subset from a data set with latitude and longitude?

我有一些带有经纬度信息的数据,但大部分数据点在地理上比较密集,不具有代表性。我希望从这些数据集中挑选出一个具有均匀分布的代表性子集。

下面是我的数据示例

no lon     lat
1  121.62  31.18
2  121.91  30.90
3  121.76  31.11
4  121.49  31.12
... ... 

查了一些资料,学会了对经纬度进行分组,然后用Pearson卡方检验,但是对sql的用法不熟悉。

我希望得到sql代码来得到这样的子集或者更好地使用sql得到均匀分布的方法。

您通常通过一些网格来存储点,并且 select 每个单元格中的一个(随机)点。如果面积比较小,可以使用GeoHash作为bucket Id。 select 一个任意点,使用 ANY_VALUE 聚合(这是一个奇怪的聚合函数,returns 来自一个组的任意元素 - 不是真正随机的,但在这里可能足够好)。

查询类似于

SELECT ANY_VALUE(geo_point)
FROM (
  SELECT 
    ST_MakePoint(lon, lat) as geo_point,
    ST_GeoHash(lon, lat, <level>) as geo_hash
  FROM <table>
)
GROUP BY geo_hash

对于较大的区域,GeoHash 不是一个好的选择,因为它在两极附近比在赤道附近更密集,解决方案将取决于您希望它变得多么复杂:)。要么忽略这个问题,继续使用 GeoHash,要么切换到提供更均匀分布的 S2 单元 ID,或者创建一些自定义网格并使用 ST_Intersects 条件为每个点找到网格 ID。