Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何捕捉线串开始&;将顶点结束到最近的点?_Postgresql_Gis_Postgis_Spatial - Fatal编程技术网

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

Postgresql 如何捕捉线串开始&;将顶点结束到最近的点?,postgresql,gis,postgis,spatial,Postgresql,Gis,Postgis,Spatial,我有一个点层和一个线层。这些点是使用DGPS收集的道路交叉点,而这些线是连接道路,在跟踪模式下通过手持GPS收集。因此,线实际上没有连接到点 现在我想: 删除每个线串的所有中间节点,使其成为一条直线 将直线的起点和终点捕捉到最近的点 我正在使用PostGIS 2.0。到目前为止,我所做的是: UPDATE line SET geom = ST_Simplify(geom, 1000); 有没有其他更好的方法来实现它?(因为我使用的是荒谬的宽容) 这将把线(id=1)延伸到最近的点(在线的开头

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

现在我想:

  • 删除每个线串的所有中间节点,使其成为一条直线

  • 将直线的起点和终点捕捉到最近的点

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

    UPDATE line
    SET geom = ST_Simplify(geom, 1000);
    
    有没有其他更好的方法来实现它?(因为我使用的是荒谬的宽容)

    这将把线(id=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
    
    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)
    );
    
    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