postGISを使用して境界ボックスを選択しますか?


36

postGISを使用して、境界ボックス内に存在するすべてのウェイとそのノードを選択するクエリを作成します。境界「--bounding-box」コマンドが取得するため、境界ボックスにはすべての詳細が含まれます。

それを行う方法はありますか?

回答:


36

浸透ドキュメントについては、コマンドオプションが表示されます

--bounding-box top=49.5138 left=10.9351 bottom=49.3866 right=11.201

PostGISの場合、ST_MakeEnvelope(left、bottom、right、top、srid)を使用して境界ボックスを作成し、次に&&境界ボックス演算子を使用して境界ボックスが交差する場所を見つけることができます。

SELECT *
FROM mytable
WHERE mytable.geom && ST_MakeEnvelope(10.9351, 49.3866, 11.201, 49.5138, 4326);

SRID 4326はWGS84 Lat / Long用であり、PostGIS 1.5にのみ必要です。それ以降のバージョンでは省略できます。


ありがとう。ST_MakeEnvelope関数にはもう1つのパラメーターsridが必要です。私はそこに何を置くべきかわかりません。
ウリエル

1
そのパラメーターを必要とするPostGIS 1.5を使用しているようです。SRIDは無視されるため、どの値でも同じ結果になる可能性があると思います。あなたは緯度/経度データを持っている場合は、一般的に4326のSRID使用
マイク・T

1
最近のほとんどのツールを使用すると、OSMデータをロードするときに、そのSRIDを選択できます。デフォルトのOSM SRIDは3857(球状メルカトル)です。ほとんどの緯度/経度データのデフォルトのSRIDはSRID 4326(緯度/経度AKA WGS84)です。たとえば、SRID 3857でデータをロードする場合、LAT / LON WGS84から3857への変換を行う必要があります。ST_Transform(ST_MakeEnvelope(LON1、LAT1、LON2、LAT2、4326)、3857)一部のツール(imposm3など)現在はSRID 3857のみをサポートしています
ジャスティンスワンハート14年

&&演算子はSRIDを変換しないことに注意してください。作成するエンベロープがテストジオメトリと同じSRIDにあることを確認するか、自分でエンベロープを変換してください。trac.osgeo.org/postgis/ticket/2320
ネルソン

1
&&演算子は、計算遅いST_Intersectsはより
caiohamamura

8

私はそれがこのようなものになると思う:PostGISのバウンディングボックスはによって作成されます

ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid>)

クエリは、サブクエリでST_Intersectionを使用します。

SELECT bbox_nodes.id, bbox_nodes.tag, nodes_geom 
FROM (SELECT nodes.id, nodes.tag, 
   ST_Intersection(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )).geom AS nodes_geom
   FROM nodes 
   WHERE ST_Intersects(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )) AS bbox_nodes
WHERE ST_Dimension(bbox_nodes.nodes_geom)=0;

私は多かれ少なかれこれをPostGISのヘルプページから取り
ました。上記と同様に設計されたウェイテーブルに関する2番目のクエリ(ただしST_Dimension()= 1を使用)がウェイを取得するはずです。

HTH、ミカ


ありがとね!何スリッド?<srid>に何を挿入する必要がありますか?そして「.geom」(4行目)は無効のようですが、そこにあるべきですか?
ウリエル

申し訳ありませんが、先週のコメントを逃しました。sridは座標参照システムのコードです。すなわち、イスラエルでは2039年。.geomの追加により、「GeometryCollectionのGeometry部分が抽出されます。ここでは必要ないことは正しいかもしれません。–
Micha

5

ここにあなたの質問に似たトピックがあります ...

ST_Intersection —(T)geomAとgeomBの共有部分を表すジオメトリを返します。ジオグラフィの実装では、ジオメトリへの変換を行って交差点を作成し、その後WGS84に戻ります。

1. ジオメトリ構築関数に関する情報もここで入手できます。

SELECT ST_AsText(ST_Intersection(
  ST_Buffer('POINT(0 0)', 2),
  ST_Buffer('POINT(3 0)', 2)
));

交差点

2.Another情報ここと交差する交差点について:PostGISの- ST_Intersectsは、ST_Intersection ...

SELECT b.the_geom As bgeom, p.the_geom As pgeom, 
        ST_Intersection(b.the_geom, p.the_geom) As intersect_bp
    FROM buildings b INNER JOIN parcels p ON ST_Intersection(b,p)
    WHERE ST_Overlaps(b.the_geom, p.the_geom)
    LIMIT 1;

交差点

私はそれがあなたを助けることを願っています...


0

これは@Michaのコードに対するコメントです。

の座標ペアPOLYGONは、時計回り(または反時計回り)の順序に従う必要があります。左上、右上、右下、左下、左上です。

したがって、時計回りに、関数呼び出しは次のようになります。

ST_GeomFromText('POLYGON((ulx uly, urx ury, lrx lry, llx llr, ulx uly))', <srid>)

または反時計回り:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.