0

SDO_NN 演算子を使用して、建物の隣にある最も近い消火栓を見つけています。

建物:

CREATE TABLE  "BUILDINGS" 
(   
"NAME" VARCHAR2(40), 
"SHAPE" "SDO_GEOMETRY") 

消火栓:

CREATE TABLE  "HYDRANTS" 
   (    "NAME" VARCHAR2(10), 
"POINT" "SDO_POINT_TYPE"
  );

building.shape の空間インデックスを適切に設定し、クエリを実行して、建物「Motel」に最も近い消火栓を取得します。

select b1.name as name, h.point.x as x, h.point.y as y  from buildings b1, hydrants h where  b1.name ='Motel'  and
                    SDO_nn( b1.shape, MDSYS.SDO_GEOMETRY(2003,NULL, NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),
                            SDO_ORDINATE_ARRAY( h.point.x,h.point.y)), 'sdo_num_res=1')= 'TRUE';

問題は次のとおりです。

パラメータsdo_num_res=1を設定すると、タプルがゼロになります。そして、sdo_num_res=2 にすると、タプルが 1 つ取得されます。

奇妙な動作の理由は何ですか?

注: building.name= 'Motel' の場合にのみ 0 行を取得しています。他のすべてのタプルでは、​​sdo_num_res = 1 の場合に 1 行を取得しています。

編集:クエリを挿入

Insert into buildings (NAME,SHAPE) values ('Motel',MDSYS.SDO_GEOMETRY(2003,NULL,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),MDSYS.SDO_ORDINATE_ARRAY(564,425,585,436,573,458,552,447)));

Insert into hydrants  (name,POINT) values ('p57',MDSYS.SDO_POINT_TYPE(589,448,0));
4

2 に答える 2

0

ポイントとポリゴンの間の空間比較を実行するには、SDO_GEOMETRYを で定義しSDO_SRID=2001、中心SDO_POINT_TYPE->を比較したい に設定します。

MDSYS.SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(-79, 37, NULL), NULL, NULL)
于 2013-04-13T15:43:14.440 に答える