Обв'язувальний ящик для таблиці PostGIS


19

Чи є простий спосіб отримати обмежувальне поле для всієї таблиці в PostGIS?

Відповіді:


26

ST_Extent повинен зробити трюк.

ST_Extent - сукупна функція, яка повертає обмежувальне поле, що поєднує рядки геометрії.

Застосовується так:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;

13

Як відповів @underdark , ST_Extent зробить цю роботу, але майте на увазі, що він не повертає геометрію, а а 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

Другий варіант повинен бути швидшим, оскільки він спрощує операцію з'єднання за допомогою конвертів окремих геометрій.

см Джерело .


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

1
ST_Extent також не повинен робити нічого просторового. Це в 2-3 рази швидше, ніж ваш підхід для моїх даних (~ 400k багатокутників). Можливо, тому, що це може зробити все за один раз, тоді як ваш підхід повинен переглянути декілька аспектів кожного геомашини, а потім звести в кінці.
bugmenot123
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.