Ограничительная коробка для стола PostGIS

19

Есть ли простой способ получить ограничительную рамку для всей таблицы в PostGIS?

Ульрик
источник

Ответы:

26

ST_Extent должен сделать свое дело.

ST_Extent - агрегатная функция, которая возвращает ограничивающий прямоугольник, ограничивающий ряды геометрий.

Применяется так:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;
Подземье
источник
13

Как ответил @underdark , ST_Extent выполнит эту работу, но имейте в виду, что он возвращает не геометрию, а a box2d. Если вам нужен тип геометрии, вы должны использовать что-то вроде

SELECT ST_SetSRID(ST_Extent(the_geom), THE_SRID) as table_extent FROM your_table;

Кроме того, если вам нужно получить ограничивающий прямоугольник для каждой из строк, который вы также можете использовать, ST_Extentи фальшивку, GROUP BY подобную этой:

SELECT ST_SetSRID(ST_Extent(the_geom),THE_SRID) as table_extent FROM your_table GROUP BY gid;

Предполагая, что GID является первичным ключом таблицы

Но ST_Envelope будет работать лучше, так как @ bugmenot123 указано в комментариях

SELECT ST_Envelope(geom) FROM your_table ;
Франциско Пуга
источник
1
Если вам нужна ограничительная рамка для каждой строки без агрегации, просто используйте ST_Envelope! Это не то, что просили, хотя.
bugmenot123
1
Вы правы насчет st_envelope, я обновляю ответ. По поводу «не просили» иногда пытаются дать похожие ответы, потому что людям, которые плохо говорят по-английски (как я), сложно выбрать правильный текст для поиска, чтобы найти ответ. Вероятно, я попал в этот вопрос в поисках ответа на вторую тему.
Франциско Пуга
4

Другая возможность - использовать ST_Envelopeфункцию, которая возвращает геометрию с SRID,

ST_Envelope - возвращает геометрию, представляющую ограничивающую рамку предоставленной геометрии.

вместе с агрегатной функцией ST_Unionдля получения объединения всех геометрий (или объединения их соответствующих огибающих) следующим образом:

SELECT ST_Envelope(ST_Union(geom)) AS table_extent FROM your_table

или

SELECT ST_Envelope(ST_Union(ST_Envelope(geom))) AS table_extent FROM your_table

Второй вариант должен быть быстрее, поскольку он упрощает операцию объединения, используя огибающие отдельных геометрий.

см. Источник .

tinlyx
источник
1
Подход ST_Extent работает на величины быстрее, поскольку он может работать исключительно с числами и не требует каких-либо сложных геометрических вычислений. Избегайте ST_Union, когда вы можете.
bugmenot123
2

Отказ от какого-либо пространственного агрегирования должен быть намного быстрее:

select
  min(ST_XMin(geom)) as l,
  min(ST_YMin(geom)) as b,
  max(ST_XMax(geom)) as r,
  max(ST_YMax(geom)) as t
from x
mika666
источник
1
ST_Extent также не должен делать ничего пространственного. Это в 2-3 раза быстрее, чем ваш подход к моим данным (~ 400 тыс. Полигонов). Вероятно, потому что он может сделать все это за один раз, в то время как ваш подход должен рассмотреть несколько аспектов каждого geom, а затем агрегировать в конце.
bugmenot123