0

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

下面是我的数据示例

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

查了一些资料,学会了对经纬度分组,然后用皮尔逊卡方检验,但是对sql的使用不熟悉。

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

4

1 回答 1

0

您通常按某个网格对点进行存储,然后从每个单元格中选择一个(随机)点。如果面积比较小,可以使用GeoHash作为bucket id。要选择任意点,请使用ANY_VALUE聚合(这是一个奇怪的聚合函数,它从组中返回任意元素 - 不是真正随机的,但在这里可能已经足够好了)。

查询将类似于

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。

于 2019-08-08T18:44:53.877 回答