2013-03-24 111 views
0

我正在創建一個應用程序,該應用程序可以發現建築物的相鄰建築物/消防栓着火。我創建了表:Oracle Spatial:查找附近的建築物

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個條目並且不會增長)。

回答

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;