【问题标题】:Picking random points using PostgreSQL使用 PostgreSQL 选择随机点
【发布时间】:2019-07-24 07:49:50
【问题描述】:

我正在尝试对一些 OSM 道路进行地理编码,并创建了一个包含 500 条道路样本的表格。所有的道路都是多线串。我已经使用 ST_DumpPoints 创建了另一个表,所以现在我还有一个包含道路信息的表,其中每个条目都是来自单个道路的单个点。初始样本表中的 500 条记录已变为 48000 条。我想创建第三张表,其中将有来自一条道路的三个随机点。

积分表:

| gid   | number | path   | path1 | path2 | geom | text_geom  |
|-------|--------|--------|-------|-------|------|------------|
| 39559 | 49     | {1,1}  | 1     | 1     | ...  | POINT(x y) |
| 39559 | 49     | {1,2}  | 1     | 2     | ...  | POINT(x y) |
| 39559 | ...    | ...    | ...   | ...   | ...  | ...        |
| 39559 | 49     | {1,79} | 1     | 79    | ...  | POINT(x y) |
| 15168 | Null   | {1,1}  | 1     | 1     | ...  | POINT(x y) |
| 15168 | Null   | {1,2}  | 1     | 2     | ...  | POINT(x y) |
| 15168 | ...    | ...    | ...   | ...   | ...  | ...        |
| 15168 | Null   | {1,43} | 1     | 43    | ...  | POINT(x y) |

注意:有些条目有 1800 分可供选择。这张表只是为了展示它的样子。

我想要的桌子:

| gid   | number | path  | path1 | path2 | geom | text_geom  |
|-------|--------|-------|-------|-------|------|------------|
| 39559 | 49     | {1,1} | 1     | 1     | ...  | POINT(x y) |
| 39559 | 49     | {1,2} | 1     | 2     | ...  | POINT(x y) |
| 39559 | 49     | {1,3} | 1     | 3     | ...  | POINT(x y) |
| 15168 | Null   | {1,1} | 1     | 1     | ...  | POINT(x y) |
| 15168 | Null   | {1,2} | 1     | 2     | ...  | POINT(x y) |
| 14005 | 460    | {1,1} | 1     | 1     | ...  | POINT(x y) |
| 14005 | 460    | {1,2} | 1     | 2     | ...  | POINT(x y) |
| 14005 | 460    | {1,3} | 1     | 3     | ...  | POINT(x y) |

还有一点值得一提的是,所有的条目都有三个以上的点可供选择。

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

    demo:db<>fiddle

    您可以使用row_number() window function 为具有特定顺序的组中的每条记录生成连续编号。我猜该组是您的gid,并且您可以简单地使用random() 值。

    我用一个更简单的表格证明了这一点:myroad 是你的 gidmypoint 是你的 text_geom 列b:

    SELECT
        myroad,
        mypoint
    FROM (
        SELECT
            *,
            row_number() OVER (PARTITION BY myroad ORDER BY random())
        FROM
            points
    ) s
    WHERE row_number <= 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多