Oracle Spatial:查找邻近的建筑物

时间:2013-03-24 12:15:44

标签: 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 个答案:

答案 0 :(得分: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;