如何选择特定圆圈中的所有点?

问题描述 投票:1回答:1

我有一个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';
oracle spatial oracle-spatial
1个回答
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_SRIDNULL)。您的查询窗口也是如此。但是在实际应用中,您应该始终使用显式坐标参考系统,即始终填充SDO_SRID。如果您的坐标是大地坐标(即经度/纬度),这一点尤为重要。以笛卡尔方式匹配这些将返回不正确的结果。此外,没有明确的SRID意味着您将无法进行任何测量或将数据与其他坐标系中的数据匹配。

(2)自Oracle 12.2起,空间索引是可选的。由于您收到错误,我假设您正在运行Oracle数据库的旧版本(可能已过时)。最新版本是Oracle 19c。但是对于实际应用程序,您应始终拥有空间索引 - 除非您的数据非常小:只需几个对象。来自200个或更多对象的任何东西都需要空间索引才能获得正确的性能水平。

© www.soinside.com 2019 - 2024. All rights reserved.