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 回答