28 июля 2012

Oracle Spatial - это просто ! Решаем, где будем ужинать сегодня :-)

Начать работу со Spatial -- очень легко. Я потратил на это один день. Но это только "начать", модуль серьёзный, для серьёзных задач -- разбираться придётся глубоко.

Spatial -- пространственные данные (ГИС). Модуль позволяет работать с плоскими и трёхмерными объектами (точки, линии, многоугольники, поверхности и пр.) и выполнять над ними операции -- найти пересечения, найти ближайшие и пр.
Пространственные данные хранятся как тип MDSYS.SGO_GEOMETRY. База при этом не перестаёт быть реляционной
Для информации -- http://ru.wikipedia.org/wiki/Пространственная_база_данных

Я поясню на следующих примерах:
  1. Найдем ближайшие рестораны, места развлечений, достопримечательности к трем точкам: дому, офису и заказчику. Координаты своих мест вы наберете сами -- или пользуйтесь моими дефолтными (для обзора модуля этого хватит).
  2. Найдем все объекты внутри Садового кольца (изменив условие, получим ВНЕ).
Список объектов далее -- это только пример, этот список неполный и может быть устаревшим. Я собрал его всего лишь из двух источников в Интернете -- из двух KML файлов.

I. Пробуем под любым пользователем
Например, можем создать SPTEST
create user SPTEST identified by SPTEST default tablespace USERS;
grant connect, resource, create view, unlimited tablespace to SPTEST;

II. Выполняем скрипт
Скрипт здесь http://yaroslavbat.narod.ru/sql/spatial_test.sql
sqlplus SPTEST/SPTEST@ORTE_LOCALHOST @spatial_test

Создание таблиц завершено. Делаем отчёты:

III. Ищем ближайшие объекты к дому, офису, заказчику (по три ближайших объекта).

select * from SP_NEAREST_PLACES_V

Выборка отсортирована по типу стартовой точки, типу объекта и возрастанию расстояния в метрах

POINT_ TYP      PLACE_NAME              ADDRESS                 DISTANCE
------ -------- ----------------------- ----------------------- --------
1.Home Развлече Бутик "Конфаэль" на Про ул.Вавилова, д.66 стр.1 3364   
                Нескучный сад           Ленинский проспект      4242   
                Пушкинская набережная   Пушкинская наб.         4456   
       Ресторан Ресторан "Султан"       Орджоникидзе ул., д.3   3032   
                Ресторан "Скай Лонж"    Ленинский пр., д. 32а   3405   
                Кафе "Мята"             Лужнецкий проезд, д. 1А 5537   
2.Offi Развлече Фирменный магазин «Рот  2-й Новокузнецкий переу 895    
                Лужков мост             м. Третьяковская  напро 2076   
                Болотная площадь        Болотная площадь        2224   
       Ресторан Ресторан "Семь пятниц"  Воронцовская ул., 6     1117   
                Ресторан "Море времени" Б. Полянка., д. 51 А/9  1434   
                Ресторан "Балчуг"       Балчуг ул., д. 1        2121   
3.Cust Развлече Патриаршие пруды        Патриаршие пруды        476    
                Московский зоопарк      Б. Грузинская, 1        742    
                Салон приключений и под ул. Тверская, д.22а, ст 913    
       Ресторан Кафе "Воск"             ул. Красина, д. 7, стр. 51     
                Ресторан "China Club"   Красина ул., 21         181    
                Ресторан "Грандъ Алекса Тверская ул., д. 27/1   639    


IV. Получаем список объектов внутри Садового кольца

select * from SP_PLACES_INSIDE_V
Обратите внимание, что в тексте этого VIEW есть лишний DECODE. Но без него не работает. Похоже баг.
where decode (<FUNCTION>, 'TRUE', 'TRUE', 'FALSE', 'FALSE') = 'TRUE'

Исправьте в тексте запроса условие на  = 'FALSE' и получим список ВНЕ Садового кольца


to be continued...

Комментариев нет:

Отправить комментарий