3
SELECT id, ST_Box2D(areas) AS bbox FROM mytable;

この例では、テーブル"mytable" に 2 つの列が含まれています。" id " は行の一意の ID 番号で、" area "は行ごとに 1 つのMULTIPOLYGONを含むジオメトリフィールドです。


これは、ポリゴンが 1 つしかないマルチポリゴンでは問題なく機能しますが、一部の行ではポリゴンが非常に離れているため、マルチポリゴンにヨーロッパとカナダに 1 つのポリゴンが含まれている場合、境界ボックスは関係ありません。

そのため、マルチポリゴンごとにポリゴンごとに 1 つの box2d を取得する方法が必要ですが、まだ方法がわかりません。より正確には、私の目標は、ポリゴンごとに 1 つの box2d を含む、行ごとに 1 つのマルチポリゴンを返すことです。


最初の例

  • id : 123
  • area : オーストラリアの楕円形ポリゴンを 1 つだけ含むマルチポリゴン
  • したがって、bboxは、オーストラリアで 1 つの長方形 (バウンディング ボックス) のみを含むマルチポリゴンを返す必要があります。

2 番目の例

  • id : 321
  • area : パリに 1 つの円、トロントに 1 つの円を含むマルチポリゴン
  • したがって、bboxは、パリに 1 つの長方形、トロントに 1 つの長方形を含むマルチポリゴンを返す必要があります。
4

2 に答える 2

5

https://postgis.net/docs/ST_Dump.htmlを使用する必要がありますST_Dump

次に、ポリゴンごとに 1 つの行を取得します。ジオメトリが分割されると、他のフィールドが複製されます。集計関数に似ていますが、逆です。

複合データ型を出力するため、構文は少し特殊になるため、次のようにジオメトリ部分を抽出する必要があります。

SELECT (ST_Dump(the_geom)).geom from mytable;

これにより、テーブル内の行数が増えるため、クエリから新しいテーブルを作成する必要があります。

次に、新しいテーブルの新しいジオメトリ列にインデックスを作成するだけで、単一のポリゴンごとに境界ボックスに構築されます。

HTH

/ニクラス

ポリゴンもそれぞれ 1 行に配置しますか? それが私が考えたことですが、bboxesを持つテーブルのみが必要な場合、IDを持つ行ごとに1つが元のマルチポリゴンを参照します(もちろん、マルチポリゴンのすべての部分で同じIDが繰り返されます)、同じバイトを実行できます次のようなbboxを抽出するだけです:

CREATE TABLE newTable AS
SELECT id, BOX2D((ST_Dump(the_geom)).geom) AS myBox FROM originamTable

残念ながら、あなたが望むものは本当に得られませんが、ST_Dumpこのような場合には多くの可能性があります.

于 2010-10-11T07:19:07.647 に答える
1

関連するビット (たとえば、カナダとフランスのコンポーネント) を個別にボックス化する必要があります。PostGIS でこれに最適なツールは、ジオメトリ アクセサーですST_GeometryN(geometry,int)(参照: http://postgis.refractions.net/docs/ST_GeometryN.html )。そのリンクには、アクセサーをST_NumGeometriesと組み合わせた良い例があります。

コメントごとに更新:

サンフランシスコの簡単な例を次に示します。このテーブルには というジオメトリ フィールドが含まれていますthe_geomgidレコード 1 は、によって報告された 2 つのマルチポリゴンを含むフィールドですst_numgeometries(序数は 0 ではなく 1 でインデックス付けされていることに注意してください)。

=> select st_box2d(st_geometryn(the_geom, 1)) from tl_2009_06075_cousub00 \
 where gid = 1;

                                st_box2d                                 
-------------------------------------------------------------------------
 BOX(-123.173828125 37.6398277282715,-122.935707092285 37.8230590820312)
(1 row)

=> select st_box2d(st_geometryn(the_geom, 2)) from tl_2009_06075_cousub00 \
 where gid = 1;

                                  st_box2d                                  
----------------------------------------------------------------------------
 BOX(-122.612289428711 37.7067184448242,-122.281776428223 37.9298248291016)
(1 row)
于 2010-10-11T02:34:43.370 に答える