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について正しいです。「求められていない」については、英語を上手に話せない人(私のような人)が正しい検索テキストを選択して答えを見つけることが難しいため、関連する答えをしようとすることがあります。おそらく私はこの質問に落ちて、2番目のトピックの答えを探しました。
フランシスコプガ

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

2番目のオプションは、個々のジオメトリのエンベロープを使用して結合操作を簡素化するため、より高速になります。

Sourceを参照してください。


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倍高速です(最大40万ポリゴン)。おそらく、すべての作業を一度に行うことができますが、アプローチでは各geomのいくつかの側面を確認し、最終的に集約する必要があります。
bugmenot123
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.