2013-03-24 72 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;