我有一个oracle数据库,其中有一个包含访问者及其位置的表。 现在,我要选择一个圆上所有具有位置和半径的点。
我不太熟悉所有空间功能,但是我尝试使用第一个参数sdo_contains访问者的位置。第二个是类型为SDO_GEOMETRY的圆。我不知道我的选择应该是什么样子,因为我收到了错误“没有空间索引就不支持接口”。我是否在访客中缺少一些索引?
我的选择如下:
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(TEXT_HTML)
public String service(String city) {
System.out.println(city);
}
答案 0 :(得分:0)
您需要在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个或更多对象开始的任何操作都需要空间索引。