【问题标题】:How to snap line string start & end vertex to the nearest point?如何将线串开始和结束顶点对齐到最近的点?
【发布时间】:2012-12-18 19:25:28
【问题描述】:

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

现在我想:

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

  2. 将线的开始和结束顶点捕捉到最近的点。

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

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

问。有没有其他更好的方法来完成它?(因为我使用了一个荒谬的容忍)

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)延伸到最近的点(添加在直线开头的点)。

问。上面看起来有点复杂,有没有其他有效的方法/功能可用?

【问题讨论】:

    标签: postgresql gis postgis spatial


    【解决方案1】:

    对同一个查询进行这两种操作似乎是合理的(未测试):

    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
    

    【讨论】:

      猜你喜欢
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2020-07-31
      • 1970-01-01
      相关资源
      最近更新 更多