我如何 select 特定圆圈中的所有点?

How do I select all points which are in a specific circle?

我有一个 oracle 数据库,其中 table 包含访问者及其位置。 现在我想要 select 具有位置和半径的圆中的所有点。

我不太熟悉所有空间函数,但我尝试 sdo_contains 第一个参数是访客的位置。第二个是 SDO_GEOMETRY 类型的圆。我不知道我的 select 应该是什么样子,因为我收到错误 "interface not supported without a spatial index"。我是否遗漏了访问者中的某些索引?

我的 select 看起来像这样:

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_SRIDNULL)。您的查询 window 也是如此。然而,在现实世界的应用程序中,您应该始终 使用显式坐标参考系统,即始终填充SDO_SRID。如果您的坐标是大地坐标(即 longitude/latitude),这一点尤其重要。以笛卡尔方式匹配那些将 return 不正确的结果。此外,没有明确的 SRID 意味着您将无法进行任何测量或将数据与其他坐标系中的数据进行匹配。

(2) 从 Oracle 12.2 开始,空间索引是可选的。由于出现错误,我假设您是 运行 旧版(可能已过时)的 Oracle 数据库。最新版本是 Oracle 19c。 但是对于实际应用程序,您应该总是有一个空间索引——除非您的数据非常小:比如只有几个对象。任何 200 个或更多对象都需要空间索引才能获得正确的性能水平。