3

我有一个点层和一个线层。点是道路交叉点,使用 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)延伸到最近的点(在线的开头添加的点)。

Q. 上面看起来有点复杂,还有其他有效的方法/功能吗?

4

1 回答 1

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
于 2013-01-04T13:54:36.240 回答