从循环中运行的gps轨道中提取单个行

时间:2015-01-12 09:21:57

标签: postgis qgis gpx

我有一个我导入postgis的gps轨道。轨道在循环中运行大约8小时,因此结果表只包含一条记录,尽管它在QGIS中显示了几行。我想将曲目切成几条记录,每循环一条记录。到目前为止,我已经使用了st_intersection& st_intersects使用看起来像圆环(带有间隙)的多边形,在其末端切割线条。

下面是我用来获取边界多边形内的轨迹的脚本(来自here):

CREATE TABLE test 
AS (SELECT st_intersection(brte.st_union, trk.geom_32651)
    FROM buffer35 AS brte,
        tracks_utmz51n AS trk
    WHERE st_intersects(brte.st_union, trk.geom_32651)); 

ALTER TABLE test ADD COLUMN id SERIAL;
ALTER TABLE test ADD PRIMARY KEY (id);

即使线条已经开始和结束与甜甜圈相同,表格仍然只显示一条记录。 postgis中是否有爆炸功能(如autocad)?解决方案建议here将其分解为点对点细分。

我想尝试下面的代码(来自Lhttp://amercader.net/blog/2011/04/exploding-multigeometries-with-postgis~返回一组组成多个的单个几何一)。如果mpoly用于多边形,那么线条是什么,所以我可以替换它?:

CREATE TABLE world_worldborders_3 AS
SELECT id,name,
(ST_Dump(mpoly)).geom
FROM world_worldborders;

其他工作流程详情:

  1. 我有一辆围绕预定路线跑8小时的车辆的GPX赛道。这是一个循环,车辆在不同的时间通过相同的区域。这是因为我试图研究每小时的旅行时间差异。

  2. 使用OGR2OGR我将轨道(原样/默认设置)导入postgis数据库。结果是6个表格,其中我只保留轨迹线和轨迹点然后丢弃其余的表格。我将其从EPSG4326转换为EPSG32651

  3. 我最初打算只使用跟踪点并丢弃跟踪线,但是进退两难,因为它处于循环中,我不能在开始时选择积分并且路段的末端,因为在同一段上有其他对,但时间间隔不同。所以也许在30-40分钟之后,车辆通过然后我在该段有另一个开始和结束时间。

  4. 我需要能够区分对。每个循环的轨道,我认为会有所帮助,因为它将作为对的ID。恩。这对来自Loop#1,依此类推。

  5. 这就是为什么我从路线中删除了一小部分,为了赶上轨道线而缓冲剩下的部分,然后尝试运行st_intersects& st_intersection认为它会将轨迹切入我需要的循环中。不幸的是,输出是一条多线。如果我点击一个循环,其余的也被选中。

  6. 到目前为止,我找到的解决方案使用了pl / pgsql脚本。我不能这样做(我认为),因为这是一个python类项目。我基本上是通过psycopg2运行postgis脚本,所以我正在寻找一个简单的脚本。

  7. 如果真的没有办法尝试使用postgis将轨迹分解为多个轨道(每个循环1个),我想我做完一个后必须使用ST_MAKELINE循环标识符(分组依据)只是python,如Lhttp://www.bostongis.com/postgis_makeline.snippet ..something..something中所讨论的那样......或者只是用python和包含跟踪点的字典列表来完成信息。

  8. 有什么想法吗?还有其他方法吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

在单个线串中展开多线串的查询与多面线相同。在你的情况下将是:

SELECT id,(ST_Dump(the_geom)).geom FROM test;

请注意,在此查询中,“the_geom”是表“test”的几何列的名称,如果您将几何列命名为不同,则必须更改。 “geom”是转储对象的几何字段的名称,不得更改。

PS:实际上,测试表的几何列名为“st_intersections”。最好使用别名为此列明确指定名称。只需更改您的select语句:

CREATE TABLE test 
AS (SELECT st_intersection(brte.st_union, trk.geom_32651) AS the_geom
    FROM buffer35 AS brte, .......