【问题标题】:Using ST_ClosestPoint, ST_StartPoint, and ST_EndPoint to find closest object to beginning and end points of lines使用 ST_ClosestPoint、ST_StartPoint 和 ST_EndPoint 查找距离线的起点和终点最近的对象
【发布时间】:2021-09-25 06:38:19
【问题描述】:

我需要使用两个单独表格中的几何图形来找到最接近线两端的点。到目前为止,我能够使用以下方法找到端点的几何形状:

SELECT "id", ST_StartPoint(dmp.geom) AS upstream,
       ST_EndPoint(dmp.geom) AS downstream
FROM sewers.pipes,
        LATERAL ST_Dump("geom") AS dmp
;

使用它,我想使用ST_ClosestPoint 来查找最接近管道端点的结构。到目前为止,这是我想出的:

SELECT ST_ClosestPoint('POINT(SELECT ST_StartPoint(dmp.geom) AS upstream
FROM sewers.pipes,
        LATERAL ST_Dump("geom") AS dmp)',
                      ('LINESTRING(SELECT geom from sewers.pipes)'))

但是,这会产生以下错误:

ERROR: parse error - invalid geometry
Line 1: SELECT ST_ClosestPoint('POINT(SELECT ST_STartPoint(dmp.geom)...

HINT: "POINT(SE" <-- parse error at position 8 within geometry
SQL state: XX000
Character: 24

我在下面提供了一些示例数据。

sewers.pipes

| id       | geom |
| -------- | -------------- |
| 822      | 0105000020950B00000100000001020000000200000046243EC3282608418D28242D6C1B3D4128531BE88A2608418284B3EF561B3D41        |
| 6660     | 0105000020950B0000010000000102000000020000004ABF2CBC86B108413B93650696323D413C487924CCB10841925D490495323D41            |

sewers.structures

| id        | geom |
| --------  | -------------- |
| 2014      | 0104000020950B00000100000001010000001026FA48113B07410D6A8412CF1D3D41            |
| 22979     | 0104000020950B0000010000000101000000BA1BF246E6DD0741D064CB58C2E43C41            |

我知道选择多个数据点可能会出现错误,例如。 more than one row returned by a subquery used as an expression,所以这也可能是一个问题。任何帮助将不胜感激。

【问题讨论】:

  • 嗨,我很困惑。您希望哪些点最接近线串的第一个和最后一个点?能否提供数据样本?
  • @JimJones 我增加了一些清晰度。我还尝试使用降价表添加一些示例数据。我的目标是找到最接近管道(线串)给定端点的结构(点)。

标签: sql postgresql postgis closest-points


【解决方案1】:

upstreamdownstream 尝试不同的LATERALs:

SELECT p.id,
  (dump_line).geom,
  ST_EndPoint((dump_line).geom) AS downstream,
  geom_closest_downstream,
  ST_StartPoint((dump_line).geom) AS upstream,
  geom_closest_upstream
FROM sewers.pipes p,
  LATERAL ST_Dump(p.geom) dump_line,
  LATERAL (SELECT s.geom 
           FROM sewers.structures s
           ORDER BY ST_EndPoint((dump_line).geom)<->s.geom 
           LIMIT 1) j (geom_closest_downstream),
  LATERAL (SELECT s.geom 
           FROM sewers.structures s
           ORDER BY ST_StartPoint((dump_line).geom)<->s.geom 
           LIMIT 1) i (geom_closest_upstream);
  • 要从ST_Dump 访问几何图形,您必须用括号括起来它的输出,例如(ST_Dump(multiline)).geom
  • ORDER BY 子句中的运算符&lt;-&gt; 对应于距离。因此,将它与 LIMIT 1 结合使用,您只能获得最近的距离。

演示:db&lt;&gt;fiddle

【讨论】:

  • 当我运行它时,它给了我下游和上游的空列,因此它为所有 geom_closest_downstream 和 geom_closest_upstream 返回相同的值。
  • @AThomspon 你检查我的小提琴了吗?我在上次编辑中添加了它
  • 我检查了演示,当它在演示数据库上运行时,我收到一条错误消息,指出“对混合 SRID 几何图形进行操作”。我使用“ST_SetSRID()”将“ST_Dump()”强制为 4326,但错误仍然存​​在。
  • @AThomspon 你为什么使用4326?您的几何图形使用2965 编码;)
  • @AThomspon 我很高兴能帮上忙。我刚刚注意到你有multilinestringsmultipoints,它们都只有一个几何图形。如果您的表在一行中没有多个几何图形,请考虑使用pointlinestring。这将使查询更容易一些;)欢呼和快乐的编码
猜你喜欢
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2021-11-05
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
相关资源
最近更新 更多