【问题标题】:How to use st_Line_Locate_Point() with a MULTILINESTRING convertion in PostGIS?如何在 PostGIS 中将 st_Line_Locate_Point() 与 MULTILINESTRING 转换一起使用?
【发布时间】:2019-10-19 19:37:04
【问题描述】:

我正在尝试在MULTILINESTRING 中获取POINT 的索引位置。

这是我遇到的整个查询:

SELECT req.id, (dp).geom, netgeo_point_tech.id, ST_Line_Locate_Point(st_lineMerge(geom_cable), (dp).geom)
FROM (SELECT id, ST_DumpPoints(geom) as dp, geom as geom_cable FROM netgeo_cable_test ) as req
JOIN netgeo_point_tech ON ST_dwithin(netgeo_point_tech.geom, (dp).geom, 1) 
ORDER BY req.id, (dp).path [ 1] ASC

我得到的错误是:line_locate_point : 1st arg isnt a line

错误是由于st_lineMerge() 函数的返回导致LINESTRINGMULTILINESTRING。 我不明白这个。 st_lineMerge() 应该只返回 LINESTRING.ST_LineMerge()

当我尝试这样一个简单的查询时:

select st_astext(st_linemerge(geom)) from netgeo_cable_test 

输出是:

)

我想从中吸取教训,因此,如果可能的话,请向我解释我在这里做错了什么,或者我的方法是否缺乏洞察力。

【问题讨论】:

  • 在您的原始查询中,您将连接添加到另一个表,并且您只保留电缆几何的子集。合并这个子集时,结果不再是一条简单的线,而是一条多线,这使得 st_lineLocatePoint 失败。
  • @JGH 我不明白为什么它没有返回 LINESTRING ?因为当我尝试没有 ST_Line_Locate_Point() 函数的原始查询时,我得到了我想要的。
  • @JGH 你能给我一个例子或一个开始如何解决这个问题吗?
  • @JGH 我想,我发现为什么我的查询返回 false。 st_lineMerge() 也在返回 MULTILINESTRING。请参阅问题的编辑。
  • 您可以使用st_dump将多行拆分为多个简单行

标签: postgresql triggers postgis plpgsql


【解决方案1】:

感谢@JGH 建议使用 ST_Dump 我想出了这个功能:

create or replace function MultiLineLocatePoint(line geometry, point geometry) returns numeric as $$
select (base + extra) / ST_Length(line)
from (
    select 
        sum(ST_Length(l.geom)) over (order by l.path) - ST_Length(l.geom) base,
        ST_LineLocatePoint(l.geom, point) * ST_Length(l.geom) extra,
        ST_Distance(l.geom, point) dist
    from ST_Dump(line) l
) points
order by dist
limit 1;
$$ language SQL;

【讨论】:

  • 可能需要将数值改为双精度。
猜你喜欢
  • 1970-01-01
  • 2015-01-24
  • 2011-02-27
  • 2023-03-11
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多