当前位置: 首页 > 知识库问答 >
问题:

Postgres:顺序坐标指向一个方向

房泉
2023-03-14

我在研究空间日期时遇到了一个问题。我有一个包含列的表:对象id及其坐标(纬度和经度,数据类型是几何体)。我需要按照从西北到东南方向的坐标对这些数据进行排序。我该怎么做?我想我当然需要使用“orderby”和索引。但是哪一个和如何?

共有1个答案

欧桐
2023-03-14

您可以使用ST_envelope从整个数据集创建一个信封,并从中检索您想要作为参考的角落,例如右下角。使用此参考点,然后可以使用距离操作符对几何图形排序

演示:db

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

进一步阅读:

  • 使用PostGIS计算距离

 类似资料:
  • 问题内容: 我从http://www.movable-type.co.uk/scripts/latlong.html实现了“轴承”公式。但这似乎非常不准确- 我怀疑我的实现中存在一些错误。您能帮我找到它吗?我的代码如下: 问题答案: 您将括号放在错误的位置。 您正在将度数添加到以弧度为单位的值,这将不起作用。将为您完成从弧度到度的转换, 然后 在获得度值后进行归一化。 你有: 但是您需要: 也请记

  • 如果你有一个坐标系或地图(或者一个2D数组,如果你愿意的话),并且每个单元的编号从[0,0]到[m,n]。在给定起点和终点坐标的情况下,如何判断每一步要走的方向?如果不在网格的边界(北、南、西北等),可以向8个方向移动。所以没有上升或下降,只有左/右等。 目标是有一个“向右走”、“向左走一半”的序列。。。到达目的地时,要考虑自己一直在看哪个方向。例如,如果一个人正朝地图的左边看,并向前移动,那么他

  • 径向轴专门用于雷达和极地面积图表类型。这些坐标轴覆盖图表区域,而不是位于其中一个边上。 Chart.js中默认包含一个径向轴。 linear

  • 问题内容: 我在postgres中有一个排序问题,其中包含诸如版本之类的值。版本是字符变化的,其值如下所示(无序)。 我如何按照自然顺序排序,这样当我发行时就会给我 代替 问题答案: Postgres允许您按数组排序-本质上就是版本号所代表的含义。因此,您可以使用以下语法: 这是一个完整的示例: 甚至是示威。

  • 所以我想在10x10坐标系中转换不同支点之间的三个点 想象我想要什么: 这是我的第一个坐标系 翻译成: 现在,这些点必须保持在不同系统之间的同一点上,因此只有这些点的坐标应该更改。首先,我想我应该把之前的原点添加到转换后的坐标中,这对A和B是有效的,但C是不同的,也许我使用了一个错误的公式或其他东西 请你帮帮我

  • 我有一个代表半径(r)和另一个代表角度(θ)的值列表。我正在尝试制作一个极地图,其中北为0度,东为90度,依此类推。 列表中的角度与绘制的角度不对应。有人知道怎么解决吗?