【问题标题】:Efficient way to match postgis linestrings against a GPS log将 postgis 线串与 GPS 日志匹配的有效方法
【发布时间】:2018-08-16 13:55:14
【问题描述】:

我正在开发一个允许用户上传 GPX 文件的网站,该网站有一个表,其中包含存储在 postgis 中的行字符串。这些线串是道路和小径的部分。然后,网站从 gpx 文件中计算出 gps 日志所经过的所有线串(方向很重要)。问题是数据库中可能有数百万个这样的线串,如果 gps 日志沿着一个行进相当昂贵,所以我需要一些方法来确定可能匹配的线串,然后再将它们从数据库中拉出。

我的一个想法是将线串的第一个点存储在它自己的索引列中。然后绘制一个包含整个 gpx 日志的框,并在该框中查找每个带有起点的线串。我认为这将允许快速搜索,但如果 gpx 日志很长并且沿对角线移动,它可能会创建一个巨大的框,其中大部分区域距离任何 gpx 跟踪点都非常远。

这个想法的一个改进是绘制多个包含 gps 轨迹的小框。这会占用更少的空白空间,但需要更多查询。

绿线是 gps 跟踪示例,红线和蓝线是查询示例框。

我可以使用哪些方法来快速找到 postgis 中可能与 gps 跟踪匹配的线串?

【问题讨论】:

  • 如果我的问题是正确的:您是否考虑过将线串拆分为点,然后从大表中仅提取接近这些点的几何图形?
  • 为了澄清,该表包含所有线串,并且有一个 gpx 日志。我考虑过从 gpx 日志点之一开始的线串进行搜索,但 gpx 文件可能有数千个点,我不知道您是否可以执行一次查询来查找点列表附近的所有内容。
  • 我添加了一条评论作为答案...这里太大了。完成后告诉我,以便我改进或删除它:-) 干杯

标签: postgresql postgis


【解决方案1】:

如果您正在寻找一种有效的方法 第一:如果没有空间索引,请创建空间索引

create index on gpstrace gist(geom);
create index on boxes gist(geom);

现在,如果您想要所有 gpstrace 部分在您的盒子中,那么

select *
  from gpstrace g
 where exists (select from boxes b where st_dwithin(g.geom, b.geom,0) and b.id=1);

如果您只想要完全在您的盒子中的 gpstrace,那么

select *
  from gpstrace g
 where exists (select from boxes b where st_within(g.geom, b.geom) and b.id=1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多