我有一个oracle数据库,其中包含一个访问者及其位置的表。现在我想选择位置和半径为圆的所有点。
我不是太熟悉所有的空间函数,但我尝试使用第一个参数sdo_contains访问者的位置。第二个是SDO_GEOMETRY类型的圆圈。我不确切地知道我的选择应该是什么样子,因为我得到错误“没有空间索引时不支持接口”。我在访客中错过了一些索引吗?
我的选择看起来像这样:
SELECT * FROM visitors v
WHERE SDO_INSIDE(v.position,
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,4), SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11))) = 'TRUE';
您需要在position
列上定义空间索引。为此,您首先需要定义所需的空间元数据。像这样:
insert into user_sdo_geom_metadata (table_name, column_name, dim info, srid)
values (
'visitors',
'position',
sdo_dim_array (
sdo_dim_element ('x',-1000,1000,0.05),
sdo_dim_element ('y',-1000,1000,0.05)
),
null
);
commit;
然后你可以创建空间索引:
create index visitors_sx on visitors(position)
indextype is mdsys.spatial_index;
然后您的查询将完成。
笔记
(1)以上假设您的空间数据(位置)是抽象的笛卡尔坐标(即不包含任何显式坐标参考系统id:SDO_SRID
是NULL
)。您的查询窗口也是如此。但是在实际应用中,您应该始终使用显式坐标参考系统,即始终填充SDO_SRID
。如果您的坐标是大地坐标(即经度/纬度),这一点尤为重要。以笛卡尔方式匹配这些将返回不正确的结果。此外,没有明确的SRID意味着您将无法进行任何测量或将数据与其他坐标系中的数据匹配。
(2)自Oracle 12.2起,空间索引是可选的。由于您收到错误,我假设您正在运行Oracle数据库的旧版本(可能已过时)。最新版本是Oracle 19c。但是对于实际应用程序,您应始终拥有空间索引 - 除非您的数据非常小:只需几个对象。来自200个或更多对象的任何东西都需要空间索引才能获得正确的性能水平。