3

特定の建築基準法 (bldg_code = 3)の重心を含む区画を選択するクエリを作成しようとしています。

区画はテーブル "city.zoning" にリストされ、各区画の PIN、ジオメトリ、および面積の列が含まれています。テーブル「建物」には、建物の種類とそれに対応するコードを示す bldg_type と bldg_code の列が含まれています。このクエリで対象となる建物タイプの bldg_code は 3 です。

これまでのところ、対象の建物タイプと相互作用する区画を表示するクエリを作成しました。

select a.*
from city.zoning a, username.buildings b
where b.bldg_code = 3 and sdo_anyinteract(a.geom,b.geom) = 'TRUE';

何か案は?

4

1 に答える 1

2

SDO_GEOM.SDO_CENTROID(ドキュメント) を使用して、ジオメトリの重心を見つけることができます。

この関数によって提供される重心は数学的な重心のみであり、たとえばポリゴンが L 字型の場合、常にジオメトリ内にあるとは限らないことに注意してください。SpatialDB Adviser にはこれに関する優れた記事がありますが、簡単な例を次に示します。

親ジオメトリの外側にある重心

これが問題ではなく、そのレベルの精度が必要ない場合は、ビルトインを使用してください。ただし、これが問題であると考えている場合 (私が過去に行ったように)、SpatialDB Adviser にはセントロイドを正しく計算するスタンドアロン PL/SQL パッケージ

パフォーマンスのニーズに応じて、オンザフライでセントロイドを計算し、クエリで直接使用するか、テーブルにセントロイド列を追加して、アプリケーション コード (最良の場合) またはトリガーで値を計算してキャッシュすることができます。 (最悪の場合)。

クエリは次のようになります。

SELECT a.*
FROM city.zoning a
JOIN username.buildings b ON sdo_contains(a.geom, b.centroid) = 'TRUE'
WHERE b.bldg_code = 3  

これは、空間的にインデックスが作成された列と、追加されて入力された新しい列にSDO_CONTAINS基づいて使用されていることに注意してください (注 - クエリはテストされていません)。ゾーニング ジオメトリが空間的にインデックス付けされていない場合は、 を使用するか、重心列にインデックスを付けてロジックを反転し、を使用する必要があります。a.geomb.centroidSDO_GEOM.RELATESDO_INSIDE

于 2013-02-26T09:18:36.957 に答える