Джустин Локиц,
Мадлен Аламеда

Использование информации о местоположении
в производственных отчетах

(Use Location Information in Enterprise Reporting,
by Justin Lokitz & Madeline Alameda)

Источник: Oracle Technical Articles (http://www.oracle.com/technology/pub/articles/index.html), http://www.oracle.com/technology/pub/articles/lokitz_location.html

Рассмотрим, как создаются динамические карты, которые делают более наглядными связи между описателями (атрибутами) и информацией о местоположении.

Для работы с этой статьей загрузите JDeveloper Project Files.

Информация о местоположении есть везде; она присутствует во всех сферах бизнеса, во всех областях промышленности, а также в каждой международной организации или департаменте. Однако большинство организаций применяют информацию о местоположении только в одном из двух случаев:

  • Местоположение, как адрес, обычно связывается с именем объекта или с идентификатором, используется для поддержки бизнес-функций (составление отчетов, отправка по почте) или для отличия определенных записей от других, на них похожих. Примерами могут служить бизнес- и сервисные приложения, а также кадровые и маркетинговые приложения.
  • Местоположение, как точка на карте, используется выделения отдельной точки или области от множества других точек, областей и/или тем (themes), что доступно только для пользователей географических информационных систем (GIS - geographic information system).

Не слишком широко известно, что эту технологию можно использовать не только для определения адреса или местоположения точки на карте, но и как способ отображения тенденций движения рыночных ресурсов, кучности популяций, а также множества взаимодействий, зависящих от местоположения. В этой статье мы изложим методику, как достичь этой цели во всех направлениях бизнеса, используя некоторые средства производственной отчетности, которые также применяются для реляционных данных.

Получение аналитических сведений из информации о местоположении

Существует, по крайней мере, три способа хранения GIS-информации в базе данных:

  • в собственном формате (обычно BLOB или Long Raw),
  • как координаты Х, У,
  • или используя OpenGIS-совместимый объектный тип, например, тип SDO_GEOMETRY в Oracle Spatial.

В первых двух случаях, чтобы достать информацию о местоположении из базы данных и связать ее с информацией об атрибуте, разработчики должны использовать разработки сторонних фирм или сами написать программы. Однако, используя объектный формат SDO_GEOMETRY, чтобы сохранять и управлять данными о местоположении, разработчики могут использовать стандартный язык SQL с GIS-функциями для извлечения аналитических сведений из данных об атрибутах и местоположении.

Рассмотрим следующий пример Oracle by Example: Performing Location-Based Analysis . Даны две таблицы Customers и Warehouses. Мы сохраняем данные, используя несколько типов данных: NUMBER, VARCHAR2, XMLTYPE, а также определяемые пользователем типы. Однако вы можете заметить, что еще существует и пятый тип MDSYS.SDO_GEOMETRY, который является Spatial/Locator типом, используемым для хранения информации о местоположении клиента или помещения склада на земной поверхности.

Таблица Customer имеет следующие столбцы:


Column                Data Type
customer_id           NUMBER(6)
cust_first_name       VARCHAR2(20)
cust_last_name        VARCHAR2(20)
cust_address          cust_address_typ
phone_numbers         phone_list_typ
nls_language          VARCHAR2(3)
nls_territory         VARCHAR2(30)
credit_limit          NUMBER(9,2)
cust_email            VARCHAR2(30)
account_mgr_id        NUMBER(6)
cust_geo_location     MDSYS.SDO_GEOMETRY 

Таблица Warehouses имеет следующие столбцы:


Column                Data Type
warehouse_id          NUMBER(3)
warehouse_spec        SYS.XMLTYPE
warehouse_name        VARCHAR2(35)
location_id           NUMBER(4)
wh_geo_location       MDSYS.SDO_GEOMETRY

Обратив внимание на столбец cust_geo_location таблицы Customers, мы увидим, что он описывается следующим образом:


CUST_GEO_LOCATION(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), 
                         SDO_ELEM_INFO, SDO_ORDINATES)

Из этого описания можно определить несколько характеристик хранимых данных:

  • SDO_GTYPE описывает тип геометрии (точка, линия или многоугольник)
  • SDO_SRID используется для определения координатной системы
  • SDO_POINT описывает широту и долготу
  • SDO_ELEM_INFO описывает, как использовать числа, сохраненные в секции SDO_ORDINATES
  • SDO_ORDINATES описывает значения координат, которые составляют границу пространственного объекта.

Рассматривая данные отдельного столбца (SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(6.1667, 46.2, NULL), NULL, NULL)) мы видим, что для точечных данных используются только три первых атрибута SDO_GEOMETRY. Такой способ хранения данных о местоположении оставлен для гибкости доступа с помощью стандартных методов, таких как SQL, JDBC и ODBC.

Теперь мы можем запросить в таблице Customers информацию о местоположении и об атрибуте, используя SQL*Plus с операторами Spatial/Locator. Рассмотрим следующий пример:


SELECT a.cust_last_name
 FROM customers a
 WHERE
   SDO_WITHIN_DISTANCE(a.cust_geo_location, mdsys.sdo_geometry (2001, 8307,
                              mdsys.sdo_point_type (6.1667, 46.2, null), 
                              null, null),
                           'distance=20000 unit=meter') = 'TRUE';

В этом запросе (рис. 1) мы выбираем фамилии (last name) всех клиентов, находящихся на расстоянии 20000 метров (20 км.) от точки с координатами (6.1667, 46.2):

Рисунок 1. Запрос на нахождение клиентов на расстоянии 20000 метров

Простой предыдущий зарос весьма интересен, но на самом деле мы хотим получить из информации о местоположении и атрибутах некую выборку, которая покажет, как клиенты взаимодействуют с нашими складами. Поэтому следующий SQL-запрос находит имена десяти клиентов, которые ближе всего находятся к складу warehouse_id=2, а также расстояние (в метрах) между ним и выбранными клиентами:


select /*+ordered*/ 
         c.customer_id, 
         c.cust_first_name, 
         c.cust_last_name,
         sdo_nn_distance (1) distance
from warehouses w, 
         customers c
where w.warehouse_id = 2
and sdo_nn (c.cust_geo_location, w.wh_geo_location, 'sdo_num_res=5', 1) = 'TRUE'
order by distance;

Снова посмотрим на отдельные части запроса (рис. 2):

Рисунок 2. Нахождение десяти ближайших к складу клиентов

Разобранные выше примеры показывают, как отыскать в базе данные о местоположении и атрибутах, а также как найти взаимосвязи этих данных. Далее мы исследуем, как можно использовать эти запросы в системе производственных отчетов (ERS - enterprise reporting system), давая, таким образом, конечным пользователям полномочия просматривать информацию о себе.

Использование информации о местоположении в ERS

Теперь, когда мы можем с использованием SQL-запросов находить связи между данными о местоположении и данными об атрибутах, сохраненные в различных таблицах, мы разберем способы, как использовать эту функциональность в ERS-системах. Большинство таких систем поддерживают стандартный язык SQL для получения требуемых результатов. Следовательно, теперь мы можем использовать SQL из предыдущей секции с любыми инструментальными средствами. Поэтому мы интегрируем SQL, обладающий GIS-спецификой, в Oracle Application Server Discoverer.

На взгляд конечного пользователя связи в Discoverer и другие атрибуты в метаданных абстрагируются Discoverer Administrator. После подсоединения к экземпляру базы данных Oracle, где хранится информация о местоположении, мы должны создать Business Area (рис. 3-6). Эта операция предполагает, что Discoverer End User Level (EUL) уже был создан с помощью процесса, описание которого не входит в наш обзор. (Для более подробной информации обратитесь к Discoverer Administrator's Guide ).

Рисунок 3. Создание Business Area

Рисунок 4. Выбор схемы пользователя для доступа к таблицам

Рисунок 5. Выбор таблиц для Business Area

Рисунок 6. Присваивание имени для Business Area

После создания Business Area мы должны определить, как наши пользователи будут вызывать данные о местоположении из таблиц OE-схемы (Customers и Warehouses). Чтобы сделать это, мы создаем папку, которая будет содержать SQL-предложения из предыдущей секции, включенные в следующий запрос:


select /*+ordered*/ c.customer_id, 
         c.cust_first_name, 
         c.cust_last_name,
         c.account_mgr_id,
         w.warehouse_id, 
         sdo_nn_distance (1) distance
from warehouses w, 
         customers c
where sdo_nn (c.cust_geo_location, w.wh_geo_location, 'sdo_num_res=10', 1) = 'TRUE'
order by distance;

Заметьте, что мы добавили w.warehouse_id и c.account_mgr_id в тело запроса. Эта вставка позволит нам динамически использовать запрос из Discoverer, относящемся к любому складу или начальнику отдела рекламы.

Рисунок 7. Добавление папки для фиксирования и подтверждения GIS SQL-предложения

Теперь у нас есть Discoverer Busines Area и папка, названная Distance, которая содержит данные об атрибутах и местоположении. В этом пункте мы уже можем задействовать Business Area. Таким образом, наши конечные пользователи могут использовать данные в своих отчетах, или мы можем перейти к следующему шагу и предоставить им второй набор информации - динамическую карту.

Использование динамических карт

Вероятно, самый удобный способ увидеть информацию о местоположении - это карта. В предыдущих примерах мы получали данные о местоположении и атрибутах, используя технику стандартного запроса и отчета; однако, во многих случаях географические особенности сильно различаются, стоит только посмотреть на них на карте. Поскольку у нас есть большой набор данных и множество конечных пользователей, которым нужно просматривать данные, мы предоставим отчеты, которые позволят конечным пользователям разбирать детали любого отчета, который, в свою очередь, свяжется с доступной через сеть динамической картой, и, таким образом, получит подробную табличную форму и указания на карте.

Многие GIS и картографические инструментальные средства поддерживают развитие таких карт. Для нашего примера мы будем использовать Oracle Server MapViewer и сервис J2EE для выполнения карт, используя данные о местоположении, управляемые Oracle Spatial/Locator. Так как MapViewer связывается с клиентами через XML, он работает по принципу, что все, что может выдать запрос и получить ответ в XML, может стать клиентом MapViewer. Кроме того, так как MapViewer является сервисом J2EE, он оснащается Java API, также как и JSP tag библиотекой.

Подобно другим инструментам, создающим карту, MapVeiwer использует концепцию стилей (цвета, маркеры, линии, области, текст, символы и расширенные стили) и тем, которые иногда называются слоями, для создания динамических карт. Определения этих атрибутов, также как и определения карт, сохраняются как XML в базе данных, наряду с информацией о местоположении.

Для создания определений атрибутов и/или карт, мы будем использовать стандартные вставки/добавления в базу данных, например:


SQL> insert into USER_SDO_STYLES values(
      'V.PIECHART1', 'ADVANCED', null, 
      '<?xml version="1.0" ?>
      <AdvancedStyle>
              <PieChartStyle pieradius="10">
                      <PieSlice name="A"    color="#ffff00" />
                      <PieSlice name="B"    color="#000000" />
                      <PieSlice name="H"    color="#ff00ff" />
                      <PieSlice name="I"    color="#0000ff" />
                      <PieSlice name="W"    color="#ffffff" />
              </PieChartStyle>
      </AdvancedStyle>',  null, null);

Или мы можем использовать инструмент Map Definition (рис. 8), который многое для нас сделает:

Рисунок 8. Инструмент Map Definition

Стандартный MapViewer загружается или покупается вместе с Oracle Application Server и имеет набор стилей, темы, базовые карты и типовой код. Однако, для нашего примера, нам потребуется скопировать одну базовую карту и добавить две темы. Поскольку мы имеем оба вида доступа - SQL и инструментальный - к карте, определенной в базе данных, то простейший способ копирования определения карты осуществляется следующим SQL-предложением. (Перед тем как это делать, просмотрите MapViewer-представления user_sdo_styles, user_sdo_themes и user_sdo_maps, чтобы лучше понимать их работу.)


SQL> insert into user_sdo_maps
  2  values('WAREHOUSES_AND_CUSTOMERS', 'customers and warehouses',
  3  (select definition from user_sdo_maps where name='DENSITY_MAP'));

1 row created.

SQL> commit;

Commit complete.

Теперь у нас есть новая базовая карта с именем WAREHOUSES_AND_CUSTOMERS, к которой мы будем добавлять какие-то темы, используя инструмент Map Definition. Сначала мы изменим директорию, содержащую mapdef.jar, и запустим следующую команду для подсоединения к экземпляру базы данных Oracle, в которой сохранены наши определения карты:


java -classpath mapdef.jar;d:\oracle\ora92\jdbc\lib\classes12.jar 
     - Dhost="localhost" -
Dsid="orcl" -Dport="1521" oracle.eLocation.console.GeneralManager

Далее создаем две темы CUSTOMERS и WAREHOUSES (рис. 8 и 9):

Рисунок 9. Создание темы CUSTOMERS

Рисунок 10. Создание темы WAREHOUSES

После создания тем добавляем их на нашу новую базовую карту WAREHOUSES_ AND_CUSTOMERS (рис.11):

Рисунок 11. Создание WAREHOUSES_AND_CUSTOMERS

Обратите внимание на элементы Min Scale и Max Scale. Они используются для определения, какие из тем появятся на данной карте в зависимости от уровня приближения, указанного в запросе.

После обновления определения карты (с помощью кнопки Update) мы можем начать использовать его для построения динамических карт, основанных на запросах клиентов. Простым способом проверки работы карты является подключение нового названия определения карты WAREHOUSES_AND_CUSTOMERS в одно из демонстрационных предложений MapViewer. Для того, чтобы сделать это, можно воспользоваться простым клиентом MapViewer (mapclient.jsp на MapViewer URL) и ввести необходимые значения (рис.12):

Рисунок 12. Демонстрационный клиент

Обратите внимание на то, что mapclient.jsp производит выборку приложений, а также отображает запрос, сделанный для сервера MapViewer – это такой же XML-запрос, который может быть сделан на любом языке клиента или разработчика. Если все определения и значения подключения правильны, карта (или URL на карту) будет построена на основе запроса.

Для нашего примера мы будем использовать файл demo/tagmap.jsp, которым снабжен MapViewer. После выполнения tagmap.jsp мы можем получить доступ к его исходному коду и начать его изменять так, чтобы он соответствовал нашей BI-модели запроса. Изменение и тестирование JSP может быть очень легкой задачей при условии использования правильных инструментов. В этой демонстрации мы будем использовать Oracle JDeveloper 10g и связанные с ним библиотеки Oracle Application Server 10g MapViewer JSP Tag Libraries(Загрузите JDeveloper Project Files здесь)

Чтобы создать карту, динамически основанную на запросах к данным в столбце cust_geo_location, измените tagmap.jsp (который мы переименовали в oemap.jsp) для вставки методов, которые открывают доступ к базе данных, выполняют запрос, и возвращают набор результатов. Обычно вы использовали бы JDBC или похожую технологию для совершения событий в базе данных. Однако, поскольку Oracle Application Server MapViewer уже использует JDBC для того, чтобы получить определение карты из базы данных, мы можем использовать MapViewer Java API, чтобы сделать все соединения: все о чем следует беспокоится – это написание запросов.

Для доступа к таблице Customers выполним запрос и задействуем переменные значения широты и долготы на нашей карте, добавим следующий код в oemap.jsp. Обратите внимание на параметр custid JSP, используемый в SQL-запросе, этот параметр фильтрует набор результатов и, таким образом, создает динамическую карту, основанную на отдельном ID клиента:


String mvURL = "http://www.foo.com:8888/mapviewer/omserver";
MapViewer mv = new MapViewer(mvURL);
String custid = request.getParameter("custid");
String latitude = "";
String longitude = "";
String sqlQuery = 
     "SELECT c.cust_first_name, c.cust_last_name, t.X, t.Y FROM   customers c, 
      TABLE(SDO_UTIL.GETVERTICES(c.cust_geo_location)) t 
            where c.customer_id ="+custid;
String[][] qryRes = mv.doQuery("mvdemo",sqlQuery);

После выполнения операций запроса и получения набора результатов, напечатаем результаты и установим соответственно параметры широты и долготы (рис. 13).

Рисунок 13. Добавление переменных, операций запроса и печать результатов

После выполнения запроса и настройки параметров широты и долготы, используем следующий код для установки тегов MapViewer и специальной JDBC-темы (используется для печати красной звезды в центре карты, см. рис. 14):



<mv:init url="<%=mvURL%>"datasource="mvdemo" id="mvHandle"/>
    
<mv:setParam title="Customer/Warehouse Map" bgcolor="#ffffff" 
                     width="500" height="375" antialiasing="true" />

<mv:importBaseMap name="WAREHOUSES_AND_CUSTOMERS"/>
    
<mv:setParam centerX="<%= latitude %>" centerY="<%= longitude %>" size="3"/>

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


<%
mvHandle.addJDBCTheme("mvdemo", "centerPoint",
"SELECT mdsys.sdo_geometry(2001, 8307, 
mdsys.sdo_point_type("+ latitude +","+ longitude +", null), null, null)
  geom FROM dual","geom", 
null, "M.STAR", null, null, true);  
%>

Рисунок 14. Теги MapViewer и JDBC-тема

После внесения нескольких незначительных изменений в код карты протестируем развертывание карты из JDeveloper, установим параметр custid JSP и получим следующий результат (рис. 15):

Рисунок 15. Недавно созданная динамическая карта клиента.

Когда карта выглядит и работает, как задумано, развернем карту на экземпляре Oracle Application Server.

Мы, наконец, готовы связать наш Discovere-отчет с динамической картой клиента. Чтобы сделать это, вернемся к Discoverer Administrator Tool и создадим расчетный (calculation)T FACE="Arial" SIZE=1> столбец в папке Distance. Этот столбец будет содержать URL на динамическую карту.

Установив курсор на папку Distance, нажмем на иконку “New Calculation” (рис. 16). Этот новый столбец Calculation получает имя MAP URL.

Рисунок 16. Новый значок Calculation

В секции Calculation мастера настройки, введем URL карты и присоединим URL к окончанию поля id Discoverer Customer, что проделаем теперь с каждого отчета, возвращенного Discoverer Report. Возможны различные JSP-параметры custid (рис. 17).

Рисунок 17. Ввод URL и объединение Customer id с расчетным полем.
(получится URL: http://www.foo.com:8888/OEMaps/oemap.jsp?custid='||Customer Id)

Теперь, когда динамический URL связан с каждым возвращаемым отчетом, убедимся, что когда пользователь нажимает на URL, будет открываться окно, отображающее новую динамическую карту. Чтобы сделать это: двойной клик на рассчитанный MAP URL, что приведет нас к свойствам этого столбца. Сразу за Content Type выбираем “File” (Рис. 18).

Рисунок 18. Изменение Content Type в “File”

Теперь мы готовы установить отчет Discoverer и протестировать динамическую карту. Discoverer Desktop и Discoverer Plus являются инструментами, позволяющими конечным пользователям записывать в базу данных и создавать динамические отчеты, основывающиеся на наборе информации Discoverer Administrator. Таким образом, зайдем в Discoverer Desktop, как конечный пользователь, и начнем процесс создания нового отчета для отображения, как Page Detail Table (рис. 19).

Рисунок 19. Создание нового отчета Discoverer

Так как мы соединяемся с базой данных и предоставляем надлежащие разрешения, мы можем решить, какие поля важны для нашего сообщения. В этом случае выберется все поля в папки Distance (рис. 20).

Рисунок 20. Поля отчета

Топология (Размещение) нашего сообщения дает нам возможность динамически смотреть внутрь информации, основанной на Warehouse ID и Account Manager ID (рис. 21).

Рисунок 21. Размещение отчета

Чтобы выполнить иную сортировку, отличную от сортировки по умолчанию, создайте групповую сортировку для столбца Distance, предоставляющего информацию о том, как далеко находятся клиенты от склада – от ближайшего и от самого далекого в метрах (рис. 22).

Рисунок 22. Создание сортировки.

После завершения процесса создания отчета с использованием мастера настройки Discoverer мы можем запустить отчет из-под Discoverer Desktop, Discoverer Plus или Discoverer Viewer. Заметьте, что динамический URL создается для каждой строки отчета (рис. 23).

Рисунок 23. Запуск отчета из-под Discoverer Plus

В итоге, и конечные пользователи, и разработчики информативным и дружественным образом могут просматривать информацию о местоположении (рис. 24).

Рисунок 24. Что мы видим

Информация о местоположении всегда и везде

Обрабатываете ли вы заказы клиента, которые нужно доставить со склада, или изучаете по карте распределение популяции [например, животных, насекомых], местоположение влияет на все совершаемые транзакции и всегда связано с информацией атрибутов, независящих от местоположения. Динамические карты намного облегчат поиск взаимосвязей между атрибутами и информацией о местоположении.

Подробно об Oracle Application Server MapViewer можно узнать по адресу otn.oracle.com/products/mapviewer/index.html.

Более детальная информация об использовании данных SDO_GEOMETRY находится в руководстве “Oracle Spatial User’s Guide and Reference” (download-west.oracle.com/docs/cd/B13789_01/appdev.101/b10826/toc.htm)


Justin Lokitz - старший консультант по продажам в Oracle Corporation, специализирующаяся на GIS и J2EE разработках.

Madeline Alameda - штатный консультант по продажам в Oracle Corporation, специализирующаяся на бизнес-анализе и технологиях хранилищ данных.

E-mail this page