Как выбрать все точки, которые находятся в определенном круге? - PullRequest
1 голос
/ 28 апреля 2019

У меня есть база данных оракула, в которой есть таблица с посетителями и их позициями.Теперь я хочу выбрать все точки, которые находятся в круге с позицией и радиусом.

Я не слишком знаком со всеми пространственными функциями, но я попробовал 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';

1 Ответ

0 голосов
/ 29 апреля 2019

Вам необходимо определить пространственный индекс в столбце 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) Выше предполагается, что ваши пространственные данные (позиции) находятся в абстрактных декартовых координатах (то есть не содержат никакого явного идентификатора системы координат: SDO_SRID равен NULL). Это также относится и к окну вашего запроса. Однако в реальных приложениях вы должны всегда использовать явные системы координат, т.е. всегда заполнять SDO_SRID. Это особенно важно, если ваши координаты геодезические (то есть долгота / широта). Сопоставление с ними в декартовой системе вернет неверные результаты. Кроме того, отсутствие явных идентификаторов SRID означает, что вы не сможете выполнять какие-либо измерения или сопоставлять данные с данными в других системах координат.

(2) Начиная с Oracle 12.2, пространственные индексы являются необязательными. Поскольку вы получаете сообщение об ошибке, я предполагаю, что вы используете старую (возможно, устаревшую) версию базы данных Oracle. Последний выпуск - Oracle 19c. Однако для реальных приложений вы должны всегда иметь пространственный индекс - за исключением случаев, когда ваши данные действительно крошечные: например, всего несколько объектов. Любой объект из 200 и более объектов будет нуждаться в пространственном индексе, чтобы получить правильный уровень производительности.

...