1

我有一个包含路线 GPS 轨迹的表格,我只想选择唯一且最长的路线。

表看起来像:

route_id        gpstrace
route1      [[long,lat], [long,lat],... ]
route2      [[long,lat], [long,lat],... ]
route3      [[long,lat], [long,lat],... ]
route19     [[long,lat], [long,lat],... ]

route_id列中route1route2route3可能相同,但比和route1长一点。所以我想回来。同样,我想从表中返回所有唯一且最长的路线。route2route3route1

我试过了:

https://gis.stackexchange.com/questions/182246/sql-server-select-all-polygons-nested-within-a-larger-polygon

https://gis.stackexchange.com/questions/96037/sql-geometry-query-similar-to-select-by-centroid

任何人都可以帮助我进行 SQL 查询吗?

4

1 回答 1

0

您可以在 MySQL 中使用递归 CTE:

with recursive cte(r, d, c, gpstrace) as (
    select t.route_id, 6371*acos(cos(radians(json_extract(t.gpstrace, '$[0][0]')))
     * cos(radians(json_extract(t.gpstrace, '$[1][0]')))
     * cos(radians(json_extract(t.gpstrace, '$[0][1]') - json_extract(t.gpstrace, '$[1][1]')))
     + sin(radians(json_extract(t.gpstrace, '$[0][0]')))
     * sin(radians(json_extract(t.gpstrace, '$[1][0]')))), 1, t.gpstrace from testtable t
    union all
    select c.r, c.d + 6371*acos(cos(radians(json_extract(c.gpstrace, concat('$[', c.c, '][0]'))))
      * cos(radians(json_extract(c.gpstrace, concat('$[', c.c+1, '][0]'))))
      * cos(radians(json_extract(c.gpstrace, concat('$[', c.c, '][1]')) - json_extract(c.gpstrace, concat('$[', c.c+1, '][1]'))))
      + sin(radians(json_extract(c.gpstrace, concat('$[', c.c, '][0]'))))
      * sin(radians(json_extract(c.gpstrace, concat('$[', c.c+1, '][0]'))))), c.c + 1, c.gpstrace
    from cte c
    where c.c + 1 < json_length(c.gpstrace) 
),
results(r, d) as (select r, d from cte where c + 1 >= json_length(gpstrace))
select * from results r where r.d = (select max(r1.d) from results r1);

演示

于 2021-04-10T15:50:29.327 回答