2014-05-15 3 views
0

Прямо сейчас у меня есть таблица в базе данных Oracle 10g с колонками LAT(FLOAT) и LNG(FLOAT).Запросить расстояние между двумя объектами без использования функциональности Oracle Spatial?

Задача состоит в том, чтобы найти все записи на определенном расстоянии (радиусе) заданной точки (в центре). Само приложение находится в Java, Hibernate используется как реализация JPA.

После некоторого исследования я обнаружил, что Oracle Spatial необходимо использовать. Тем не менее, нет возможности конвертировать мои столбцы в SDO_GEOMETRY, поэтому я не могу использовать функциюOracle SDO_WITHIN_DISTANCE.

Есть ли какое-либо обходное решение для реализации таких функций?

В настоящее время я просто запрашивая все записи и итерацию над ними с формулой Haversine - и это станет узким местом очень скоро :-)

Спасибо за вашу помощь!

+0

Вы всегда можете реализовать гаверсинус alghorithm –

+0

@JakubKania Спасибо за ваш ответ! В настоящее время я использую алгоритм Haversine, но он недостаточно точен - мне нужно проверить расстояния (500 -> 5000) метров, и он не дает точных результатов. – user1772574

+2

Вы не можете напрямую преобразовать столбцы, но не можете ли вы изменить таблицу, чтобы включить новый столбец пространственного типа и вычислить его из значений в Lat и Lng ??? –

ответ

0

Если вы не можете изменить столбцы целевой таблицы, вы можете использовать триггер для материализации данных в отдельной таблице как sdo_geometry, используйте sdo_within_distance и затем присоедините строки к исходной таблице.

+0

Ну кажется, что триггер был самым «изящным» решением для этого случая. Спасибо @Ben! – user1772574

1

Использование существующих пространственных данных, закодированных в столбцах X и Y без ввода дополнительных столбцов, просто: просто используйте функциональный индекс.

Это означает отсутствие изменений в существующих таблицах: просто добавление функции и индекс на основе функций вместе с возможностью просмотра, чтобы сделать все более прозрачным.

Смотреть полный ответ here

Смежные вопросы