如何用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。
我有一些带有经纬度信息的数据,但大部分数据点在地理上比较密集,不具有代表性。我希望从这些数据集中挑选出一个具有均匀分布的代表性子集。
下面是我的数据示例
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。