【问题标题】:Postgres: Order coordinates points in a directionPostgres:顺序坐标点在一个方向
【发布时间】:2022-01-10 15:59:25
【问题描述】:

我在处理空间日期时遇到了 Postgres 的问题。我有一个包含列的表:对象 ID 及其坐标(纬度和经度,数据类型是几何)。我需要按从西北到东南方向的坐标对这些数据进行排序。我怎样才能做到这一点?我想我当然需要使用“order by”和索引。但是哪个以及如何?

【问题讨论】:

  • 这些坐标连接后的样子如何?他们在一条直线上吗?
  • 不,这不是一条直线,而是一个岛屿的点域。对角线移动(从西北到东南)可能会有几个点会假装是下一个。所以我想我需要添加一个条件,例如“先显示更多的北点”
  • @Wazyto 欢迎来到 SO。仅按x 轴排序就足够了吗?
  • 那么可能是最东北点被定义为最东南点的情况。也许我需要尝试不按轴排序,而是按距最西北点的距离排序?到东南点的距离应该是最大的。我说的对吗?

标签: sql postgresql postgis


【解决方案1】:

您可以使用ST_Envelope 从整个数据集中创建一个信封,然后您可以从那里检索您想要的角作为参考 - 例如右下角。使用此参考点,您可以使用距离运算符<-> 对几何图形进行排序。

演示:db<>fiddle

CREATE TABLE t (gid int, geom geometry(point,4326));
    
INSERT INTO t VALUES 
(6,'SRID=4326;POINT(-4.3675 54.2428)'),
(5,'SRID=4326;POINT(-4.5488 54.3591)'),
(1,'SRID=4326;POINT(-4.5405 54.2974)'),
(7,'SRID=4326;POINT(-4.3098 54.2973)'),
(4,'SRID=4326;POINT(-4.4952 54.2742)'),
(2,'SRID=4326;POINT(-4.4568 54.2790)'),
(3,'SRID=4326;POINT(-4.4156 54.2509)');

下面的CTE基于表t中的所有点创建一个包络(见上图中的包络),检索右下角的值,并在外部查询中使用这个参考点进行排序按距离记录。

WITH j AS (
  SELECT 
    ST_SetSRID(
      ST_MakePoint(
        ST_XMax(ST_Envelope(ST_Union(geom))),
        ST_YMin(ST_Envelope(ST_Union(geom)))),
      4326) AS reference_point
  FROM t
)
SELECT 
  t.gid,
  ST_AsText(t.geom) AS geom, 
  ST_AsText(j.reference_point) AS reference_point,
  t.geom <-> j.reference_point AS distance_to_ref_point
FROM j,t
ORDER BY t.geom <-> j.reference_point;

 gid |          geom          |    reference_point     | distance_to_ref_point 
-----+------------------------+------------------------+-----------------------
   7 | POINT(-4.3098 54.2973) | POINT(-4.3098 54.2428) |   0.05449999999999733
   6 | POINT(-4.3675 54.2428) | POINT(-4.3098 54.2428) |   0.05769999999999964
   3 | POINT(-4.4156 54.2509) | POINT(-4.3098 54.2428) |   0.10610961313660537
   2 | POINT(-4.4568 54.279)  | POINT(-4.3098 54.2428) |   0.15139167744628546
   4 | POINT(-4.4952 54.2742) | POINT(-4.3098 54.2428) |   0.18804020846616745
   1 | POINT(-4.5405 54.2974) | POINT(-4.3098 54.2428) |    0.2370730899954694
   5 | POINT(-4.5488 54.3591) | POINT(-4.3098 54.2428) |    0.2657944506568918

进一步阅读:

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多