您可以使用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
进一步阅读: