0

建物の隣接する建物/消火栓が燃えているのを見つけるアプリケーションを作成しています。テーブルを作成しました:

CREATE TABLE building (
       buildingno VARCHAR(40) PRIMARY KEY
       , buildingname VARCHAR2(32),noofvertices INT
       , shape MDSYS.SDO_GEOMETRY)

CREATE TABLE hydrant (hydrantno VARCHAR(40) PRIMARY KEY
      , point MDSYS.SDO_GEOMETRY)

CREATE TABLE firebuilding(hydrantno VARCHAR(40) PRIMARY KEY)

特定の建物(消火栓と建物の両方)の最も近い隣人を見つけたいです。列名に空間インデックスを作成せずにこれを行うことはできますか?

私は空間クエリを学習していますが、作業しているデータセットは小さいです(各テーブルに約20エントリあり、拡張されません)。

4

1 に答える 1

1

空間インデックスを作成しない正当な理由がありますか?

そうする場合、形状の数が少ない場合はSDO_GEOM.SDO_DISTANCE、特定のポイントと他の各ポイントポイントとの間の距離を計算し、最小の距離を選択する「ブルートフォース」アプローチを使用すると、許容できる結果とパフォーマンスが得られる可能性があります。 。たとえば、firebuilding特定の建物を識別する場合、次のクエリは、1メートル(座標が測地の場合)または1座標単位(座標が非測地の場合)の許容誤差を使用して最も近い建物を識別します。

SELECT
    B.*
FROM
    (
        SELECT
            A.*,
            DENSE_RANK () OVER (ORDER BY A.DISTANCE) AS RANKING
        FROM
            (
                SELECT
                    OTHER_BUILDINGS.*,
                    SDO_GEOM.SDO_DISTANCE(BUILDING.SHAPE, OTHER_BUILDINGS.SHAPE, 1) DISTANCE
                FROM
                    FIREBUILDING,
                    BUILDING,
                    BUILDING OTHER_BUILDINGS
                WHERE
                    BUILDING.BUILDINGNO = FIREBUILDING.BUILDINGNO
                    AND
                    OTHER_BUILDINGS.BUILDINGNO <> BUILDING.BUILDINGNO
            ) A
    ) B
WHERE
    B.RANKING = 1;
于 2013-03-26T17:39:35.333 に答える