【问题标题】:PostGIS: Find nearest point from a list of 3D pointsPostGIS:从 3D 点列表中查找最近的点
【发布时间】:2020-01-23 08:15:57
【问题描述】:

使用 PostGIS 数据库,我想从点列表(存储为表中的几何图形)中筛选出最接近传递给查询的某个点的点。
我已经尝试过ST_3DClosestPoint,但他们总是谈论一条线上的一个点。
如何过滤我的列表,以便仅确定最接近给定点的点云的 3D 点?有没有机会用 PostGIS(2.5 版)做到这一点?

编辑 表结构和一些示例数据:

CREATE TABLE points_list (id SERIAL PRIMARY KEY, name VARCHAR(64), geom GEOMETRY(POINTZ, 3857));

INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571450, 5800300, -246.028076), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571550, 5800300, -246.033478), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571650, 5800300, -246.040100), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571750, 5800300, -246.062714), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571850, 5800300, -246.104797), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571950, 5800300, -246.162323), 31468), 3857));

然后,查询应该询问传递给查询的最近点,例如4571547, 5800297, -246,0312。我希望我的示例值的条目号 2 是此查询的结果。

【问题讨论】:

  • 能否添加 1) 示例数据 2) 表结构和 3) 确切的预期结果?
  • 添加了一些示例数据。
  • 这就是您要找的东西吗? SELECT id, ST_Distance(geom,ST_SetSRID(ST_MakePoint(4571547, 5800297, -246,0312),3857)) as dist FROM points_list ORDER BY dist LIMIT 1 目前无法测试
  • 应该是这样的。我将ST_Distance 替换为ST_3DDistance,因为z 维度也很重要。不幸的是,我总是得到距离为 3293614.81946199 的示例数据的第 6 点,即使我将查询中的坐标设置为示例数据的第二个点的值。

标签: sql postgresql 3d postgis closest-points


【解决方案1】:

你真的很亲密。

考虑到数据样本,您需要执行大量 SRS 转换来填充您的表格。因此,存储的 SRS 也需要与查询中使用的匹配。

SELECT id, 
  ST_3DDistance(
    geom,
    ST_Transform(
      ST_SetSRID(
        ST_MakePoint(4571547, 5800297, -246,0312),31468),3857)) AS dist
FROM points_list
ORDER BY dist LIMIT 1;

 id |       dist        
----+-------------------
  2 | 6.936250729464996
(1 Zeile)

如果您已经可以为ST_3DDistance 提供SRS 中的坐标3857,则可以避免使用ST_Transform

【讨论】:

  • 这按预期工作 :tada: 是的,我知道。但是提供的坐标来自另一个使用 3857 的应用程序,它不是原始数据的 SRS。所以我必须在某处转换坐标(无论是在导入时还是在请求时)。
  • @SnoopyBrown 在这种情况下,这个查询是获取 3D 距离的最直接的选项 :) 干杯
猜你喜欢
  • 2016-07-01
  • 2012-08-05
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多