如何捕捉线串开始&结束顶点到最近点?

时间:2013-01-04 10:53:18

标签: postgresql gis postgis spatial

我有一个点图层和一个线图层。这些点是使用DGPS收集的道路交叉点,而线路是连接道路,通过手持GPS在跟踪模式下收集。结果,这些线实际上并没有连接到这些点。

Sample Network Image

现在我想:

  1. 从每个线串中删除所有中间节点,使其成为一条直线。

  2. 抓住开始&行的顶点到最近的点。

  3. 我正在使用PostGIS 2.0。到目前为止,我所做的是:

    UPDATE line
    SET geom = ST_Simplify(geom, 1000);
    

    Q值。还有其他更好的方法可以实现吗?(因为我使用了荒谬的宽容)

    UPDATE line
    SET geom = ST_AddPoint(
    (SELECT geom FROM line WHERE id = 1),
    (SELECT p.geom FROM point AS p, line AS l
        ORDER BY ST_Distance(p.geom,(SELECT ST_StartPoint(l.geom) FROM lt WHERE l.id=1)) LIMIT 1),
    0)
    WHERE id=1;
    

    这会将行(id = 1)扩展到最近的点(在行的开头添加的点)。

    Q值。以上看起来有点复杂,有没有其他有效的方法/功能?

1 个答案:

答案 0 :(得分:4)

在同一查询(未测试)上执行这两项操作似乎是合理的:

UPDATE line l
SET geom = ST_MakeLine(
    (SELECT geom FROM point p ORDER BY ST_Distance(p.geom, ST_StartPoint(l.geom) LIMIT 1),
    (SELECT geom FROM point p ORDER BY ST_Distance(p.geom, ST_EndPoint(l.geom) LIMIT 1)
);

如果数据集较小并且您只运行一次查询,则性能不会出现问题 - 但您可以添加额外的bbox比较来加快速度:

SELECT geom FROM point p WHERE p.geom && ST_Expand(ST_StartPoint(l.geom), 100) ORDER BY ST_Distance(p.geom, ST_StartPoint(l.geom) LIMIT 1