Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Обучение от Mail.Ru Group.
Онлайн-университет
для программистов с
гарантией трудоустройства.
Набор открыт!
2005 г.

Вывод картографической информации
средствами Oracle с использованием Web-приложения

Л. Рейнгольд, гл.специалист Управления земельными ресурсами,
А. Сорокин, гл.специалист Управления земельными ресурсами,
В.Фощанко, ведущий специалист МУП "Центр геодезии"
г.Владимир
Источник: “Oracle Magazine/Русское издание”

Введение

Oracle Application Server MapViewer (или просто MapViewer) является программным инструментом для отображения карт. Он использует пространственные данные, управляемые компонентами базы данных для работы с картографической информацией – Oracle Spatial или Oracle Locator. MapViewer предоставляет инструменты, которые скрывают сложность и комплексность организации запросов к пространственным данным и функциям отображения карт, но в то же время предоставляет широкий набор средств для более тонкой и всесторонней настройки параметров для более опытных пользователей. Эти инструменты могут быть помещены в платформно-независимую среду разработки и использованы для интеграции с приложениями, отображающими картографические данные.

В качестве примера, иллюстрирующего возможности использование MapViewer, рассмотрим реализацию простейшего Web-приложения. В качестве клиентской части данного приложения будет задействован обычный Web-браузер. HTML-страница для отображения на стороне клиента будет динамически генерироваться при помощи пакета PL/SQL UTL_HTTP и содержать необходимые функции для навигации по отображаемому в ее составе плану-схеме. Для обеспечения картографического изображения, которое находится на странице, будет задействован MapViewer. В качестве примера приложения решим задачу отображения картографического плана-схемы земельных участков города. Таким образом, вывод картографических элементов будет являться частью более крупной информационной Web-системы. Пример приложения, использующего MapViewer, содержит пространственные таблицы Oracle Spatial и метаданные, созданные для обеспечения работы с заданными таблицами, пример организации источника данных для MapViewer, XML-запросы к MapViewer и код PL/SQL процедуры, генерирующей HTML-страницу.

Установка и настройка MapViewer

Для того, чтобы начать работать с MapViewer, необходимо иметь следующие пакеты Java и продукты Oracle, соответствующих версий или выше:
  • Oracle Application Server 10g (9.0.4) или автономную версию Oracle Application Server Containers for J2EE (OC4J) версии 9.0.2 или выше. В примере мы используем версию 9.0.4. Существенных отличий при использовании более новой версии MapViewer 10.1.2 RC (Release Candidate) в рамках рассмотренного примера не обнаружено.
  • Oracle Spatial или Oracle Locator (версии 8.1.6 или выше)
  • Клиент Oracle (версии 8.1.7 или выше), если необходимо использовать возможности JDBC Oracle Call Interface (OCI).
  • Java JDK (или JRE) версий 1.2, 1.3 или 1.4.

Все перечисленные компоненты доступны на сайте Oracle и Sun. Их использование в коммерческих целях требует соблюдения требований лицензирования.

MapViewer запускается, как OC4J Web-приложение и принимает запросы от клиентов. Его можно установить в составе полного Oracle Application Server или в виде отдельной автономной инсталляции компонента OC4J. С более подробными инструкциями по установке можно ознакомиться в соответствующей документации, прилагающейся к дистрибутиву продукта.

Если настройки MapViewer, установленные по умолчанию, необходимо изменить, можно отредактировать конфигурационный файл MapViewer mapViewerConfig.xml, который располагается по следующему пути: $ORACLE_HOME\lbs\mapviewer\conf. После того, как файл будет изменен, необходимо перезапустить MapViewer, чтобы изменения вступили в силу.

Конфигурационный файл задает следующую информацию в XML-формате:

  • Информация по подключению, задаваемая в элементе <logging>;
  • Информация по изображению карты, расположенная в элементе <save_images_at>;
  • Ограничения по выполнению административных запросов, задаваемые в элементе <ip_monitor>;
  • Web-прокси информация для настройки внешних подключений через firewall, находящаяся в элементе <web_proxy>;
  • Глобальные настройки карты, расположенные в элементе <global_map_config>;
  • Установки внутреннего пространственного кэша, находящиеся в элементе <spatial_data_cache>;
  • Настройки и регистрация нестандартного рендера, определенные в элементе <custom_image_renderer>;
  • Источники данных карты, задаваемые в элементе <map_data_source>

Подробнее остановимся лишь на последнем элементе настройки, так как он имеет непосредственное отношение к приложению, которое рассматривается в этом материале. Конечно, источник данных для карты можно настроить динамически, выполнив соответствующий XML-запрос к MapViewer, но более простым решением будет задать нужный источник данных в конфигурационном файле, чтобы он был доступен всегда. Зададим нужный нам источник данных в элементе <map_data_source>

<map_data_source name="ds_demo"
jdbc_host="hostserver"
jdbc_sid="map9"
jdbc_port="1521"
jdbc_user="map"
jdbc_password="!mappswrd"
jdbc_mode="thin"
number_of_mappers="5"
/>
  • Атрибут name задает уникальное имя источника данных, которое в дальнейшем будет использовано в запросах к MapViewer.
  • Параметры jdbc_host, jdbc_sid, jdbc_port, и jdbc_user определяют информацию подключения к базе данных.
  • Параметр jdbc_mode определяет, каким способом JDBC-драйвер будет обеспечивать подключение MapViewer к базе данных. По умолчанию это thin. Этот режим не требует наличия на сервере, где запущен MapViewer, установленного клиента Oracle. Также можно воспользоваться типом подключения oci8, который рекомендуется использовать, в случае если MapViewer запущен на одной машине с сервером базы данных.
  • Параметр number_of_mappers определяет, сколько одновременно может быть создано рендеров карты для обслуживания одновременно подключившихся клиентов. Каждый рендер использует в среднем от 5 до 30 мегабайт оперативной памяти. Объем памяти зависит от объема полученных и обрабатываемых в процессе генерации карты данных. Каждый запрос, для которого нельзя сразу создать рендер, ставится в очередь. Максимально возможное количество рендеров - 64.

Основные принципы взаимодействия с MapViеwer

MapViewer представляет собой специализированный компонент среднего уровня в составе Oracle Application Server и состоит из двух основных компонентов:
  • подсистема рендеринга (на основе библиотеки Java-классов), которая формирует изображение картографической информации;
  • прикладной интерфейс на основе XML, позволяющий управлять работой MapViewer (т.е. предоставляет программный интерфейс к функциям MapViewer).

Подсистема рендеринга подключается к базе данных Oracle посредством JDBC и выполняет доступ к пространственным данным (чтение и запись данных, хранящихся в Oracle Spatial или Oracle Locator). Также эта подсистема загружает из базы данных метаданные для настройки отображения карты (характеристики карты, стили и правила отображения данных, условные знаки и т.д.), чтобы в ходе работы применить их к извлекаемым из базы данных пространственным данным.

Использование языка XML предоставляет разработчикам приложений высокоуровневый интерфейс, при помощи которого можно отправлять картографические запросы к MapViewer и получать ответы в виде сгенерированного растрового изображения. MapViewer может взаимодействовать с такими клиентами, как Web-браузер или специально разработанное клиентское приложение, используя протокол HTTP.

Схема взаимодействия с MapViewer укладывается в два основных шага и не зависит от того, является ли это обычным клиентским запросом или некоторым административным действием (см. рисунок 1).

Для запроса клиентом картографической информации:

  1. Выполняя запрос, клиент включает в него имя карты (то есть имя мета-описания хранящегося в базе данных), источник данных, центр местоположения, размеры карты, а возможно и другие данные, которые необходимы для отображения карты в нужном виде.
  2. Сервер возвращает изображение карты (или URL-адрес по которому доступно это изображение) и габаритный прямоугольник (MBR - минимальный охватывающий прямоугольник) карты, а также статус, отражающий успешность выполнения запроса.

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

  1. Клиент запрашивает у MapViewer административное действие, посылая информацию о типе запроса и необходимые для полноты запроса значения его параметров.
  2. Сервер возвращает статус запроса и запрошенную информацию.

Рисунок 1. Схема базового взаимодействия для MapViewer

Рисунок 2. Обобщенная архитектура приложения.

Структура демонстрационного приложения

Рисунок 3. Основные элементы приложения

В рассматриваемом упрощенном приложении Web-браузер выступает в качестве клиента. Он обращается к поставляемому с сервером Oracle Web-серверу Apache с запросом на выполнение PL/SQL-процедур с заданными параметрами. Процедура динамически генерирует HTML-страницу, содержащую план-схему.

HTML-страница является носителем интерфейса пользователя и средством сохранения информации о состоянии пользовательского сеанса. Она содержит ссылку на растровое изображение плана-схемы, а также набор элементов управления для навигации по отображаемому на ней плану-схеме. Элементы управления выполнены в виде сгенерированных и вставленных в тело страницы запросов к PL/SQL-процедуре: увеличить, уменьшить масштаб; сдвинуть вправо, влево, вверх, вниз. Такой подход к организации навигации позволяет сохранить информацию о состоянии текущего сеанса пользователя в контексте взаимодействия браузера и Web-сервера без привлечения дополнительных механизмов (сookies, аутентификация и т.д.).

Web-сервер, функционирующий в составе сервера Oracle, обеспечивает работу Web-сервиса. Он осуществляет передачу и прием данных в рамках HTTP-протокола. В частности, он обеспечивает параметризированный вызов PL/SQL-процедуры, отправку браузеру динамически сгенерированной HTML-страницы и сгенерированного изображения плана-схемы.

MapViewer по XML-запросу PL/SQL-процедуры на основе заранее созданной карты и связанных с ней метаданных генерирует изображение плана-схемы фрагмента населенного пункта в указанном масштабе, с указанными размерами изображения и по указанным координатам. Он возвращает PL/SQL-процедуре ссылку на изображение сгенерированного изображения.

PL/SQL-процедура работает на стороне сервера и отвечает за генерацию HTML страницы. По запросу Web-браузера она генерирует HTML-страницу, в которую включает ссылку на изображение плана-схемы. Это изображение процедура предварительно запрашивает у MapViewer по заданным в качестве параметров процедуры координатам плана и масштабу, а также генерирует управляющие элементы навигации по плану-схеме. Эти управляющие элементы содержат обращения к той же самой PL/SQL-процедуре, но уже с модифицированными относительно текущего положения и масштаба плана-схемы параметрами.

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

Структуры данных Spatial, задействованные в проекте

Для того, чтобы вывести пространственные объекты при помощи MapViewer на растровое отображение карты, в базе данных Oracle необходимо создать таблицы, содержащие геометрические описания необходимых пространственных объектов, хранящиеся в столбцах типа SDO_GEOMETRY. Эти таблицы также могут содержать помимо колонок с пространственной информацией, необходимые столбцы, содержащие дополнительную семантическую информацию, по объектам. Например, подобная информация может служить для вывода текстовых надписей на объектах при формировании карты. Для более эффективной работы Spatial с этими таблицами необходимо создать пространственные индексы для столбцов с пространственной информацией.

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

  1. Здания (BUILDS) - хранит полигональные объекты зданий и сооружение, а также информацию об адресных номерах зданий. Она содержит столбцы:
    • PR_KEY NUMBER - первичный ключ;
    • GEOLOC SDO_GEOMETRY - контуры зданий;
    • NUM VARCHAR - номера зданий (номер и литера);
  2. Улицы (STREET) - хранит линейные объекты, характеризующие пролегание улиц города, и информацию о названиях улиц. Включает столбцы:
    • PR_KEY NUMBER - первичный ключ;
    • GEOLOC SDO_GEOMETRY - оси улиц;
    • NAME VARCHAR - названия улиц.
  3. Участки (PARCELL) - хранит полигональные объекты, описывающие земельные участки, и информацию о кадастровых номерах участков.Содержит столбцы:
    • PR_KEY NUMBER - первичный ключ;
    • GEOLOC SDO_GEOMETRY - контура земельных участков;
    • KU NUMBER - номера земельных участков.

Все три таблицы создадим в схеме, которую назовем MAP. Данные для примера в каждую из таблиц можно загрузить при помощи стандартного загрузчика Oracle или воспользоваться специализированной программой третьей фирмы. Например, Easy Loader, поставляемый с MapInfo, позволяет загрузить в Oracle Spatial данные из файлов формата MapInfo (TAB) и сразу же создать пространственные индексы на пространственные колонки (подробнее о программе смотрите здесь http://www.mapinfo.com). Также можно воспользоваться программой FME, позволяющей загружать данные из различных форматов (подробнее о программе смотрите http://www.safe.com/products/fme/).

Доступ к графической информации осуществляется опосредовано - через соответствующие процедуры PL/SQL, которые неявно формируют политику доступа к данным. Следует отметить, что в порядке разграничения доступа может возникнуть задача ограничения объема вывода информации, введения заданной погрешности в отображение данных, и другие. Эти проблемы могут быть решены, однако их рассмотрение выходит за рамки данной статьи. Для простейшего случая подключения к базе картографических данных MapViewer и Web-сервера необходимо создать соответствующего пользователя (или отдельно пользователей для MapViewer и Web-сервера для более полного разграничения доступа), в схеме которого будут храниться данные.

Концепция MapViewer применительно к разрабатываемому приложению

Для описания того, как и что будет выводить MapViewer в ответ на запрос клиента, используются метаданные в служебной схеме MDSYS, хранящие в виде XML-описаний информацию о правилах отображения пространственных объектов, перечне слоев, участвующих в формировании карты, и параметрах отображения самой карты. Основными типами метаданных являются стили, темы и базовые карты. Следует отметить, что при пересоздании схемы пользователя, метаданные не сохраняются, поскольку не находятся непосредственно в его схеме. При перезагрузке данных в схеме необходимо создавать метаданные заново или позаботиться о заполнении соответствующих таблиц в схеме MDSYS, например, с использованием соответствующих сохраненных SQL-команд.

Стили (styles) определяют свойства отображения для объектов, с которыми ассоциированы данные стили. Например, стиль текста определяет, как объекты будут подписываться на карте, а стиль линий определяет, как будут отображаться на карте линейные объекты, такие, как улицы. Каждый стиль имеет уникальное имя, и определяется одним или несколькими графическими элементами в синтаксисе XML

Основные типы стилей

  • Цвет (Color): служит для заливки площадных объектов и прорисовки их границ.
  • Маркер (Marker): используются в качестве иконок для отображения точечных объектов, требующих отображения в виде условного знака.
  • Линия (Line): данный стиль используется для оформления линейных объектов.
  • Площадь (Area): используемый для представления площадных объектов с возможностью заливки их контура заданным графическим шаблоном (картинкой узора).
  • Текст (Text): данный стиль используется для нанесения пояснений и надписей для объектов.
  • Продвинутый (Advanced): комплексный стиль, используемый для тематического ранжирования.

Все стили, которые заданы пользователем, можно обнаружить в пользовательском представлении USER_SDO_STYLES.

Тема (theme) - это коллекция объектов (заданных как пространственными, так и непространственными атрибутами), с которыми ассоциированы стили отображения или набор правил, задающих стили отображения. Каждая тема (если эта тема - не изображение) связана с хранящимся пространственным слоем, представленным таблицей или представлением, имеющим в своем составе столбец типа MDSYS.SDO_GEOMETRY. Все предопределенные пользовательские темы можно увидеть в пользовательском представлении USER_SDO_THEMES.

Базовая карта (base map), на основе которой формируется вывод графических данных, обычно состоит из одной или нескольких тем. С картой связана определенная система координат, в которой отображаются все темы, образующие карту. Все темы в карте должны содержать пространственные объекты, которые заданы в данной системе координат. Порядок следования тем при добавлении определяет порядок их отрисовки на карте. Т.е. последняя добавленная тема отображается самой последней поверх всех остальных и так далее. Каждая тема в базовой карте может быть ассоциирована с масштабными границами, определяющими ее видимость.

Все имена базовых карт и все пользовательские настройки базы данных можно увидеть в пользовательском представлении USER_SDO_MAPS. Колонка DIFINITION в представлении USER_SDO_MAPS хранит XML-описание базовой карты.

Карта является компонентом, который MapViewer создает в ответ на картографический запрос на основе базовой карты и ряда других параметров. Карта может быть файлом изображения, объектом, который предоставляет доступ к файлу изображения карты или URL-ссылкой на файл изображения карты.

Под размером карты (Size) подразумевается высота карты в заданных единицах измерения карты. Масштаб карты вычисляется, как количество единиц измерения карты, представленных в одном дюйме на экране или устройстве вывода. Его можно использовать в качестве знаменателя в наиболее распространенном методе представления картографического масштаба 1/n.

Набор связанных объектов, участвующих в определении карты, можно назвать картографическим профилем приложения. Разработчик может управлять стилями, темами и базовыми картами также при помощи поставляемой дополнительно утилиты Map Definition Tool.

Использование инструмента формирования метаданных Map Definition Tool

Map Definition Tool является автономным приложением, написанным на Java. Оно позволяет создавать, модифицировать и удалять стили, темы и базовые карты. Например, можно разработать и задать новый стиль линии, увидеть предварительное отображение этого стиля, модифицировать его при необходимости, а затем вставить XML-описание нового стиля в базу данных. Инструмент использует введенную разработчиком информацию, относящуюся к стилю, чтобы сгенерировать соответствующее описание в XML-формате.

Когда возможно, желательно использовать Map Definition Tool вместо прямой модификации метаданных MapViewer. Утилита всегда проверяет и поддерживает ссылочную целостность между объектами.

Map Definition Tool содержит ряд закладок, сгруппированных в следующие категории

  • Connection: страница для подключения базе данных;
  • Styles: все, что связано с настройкой и созданием стилей;
  • Themes: страница для работы с темами;
  • Maps: страница для работы с картами.

В первую очередь нужно воспользоваться вкладкой Connection, чтобы подключиться к базе данных Oracle. Кнопкой Connect to вызывается диалоговое окно для задания параметров нового подключения. В общем случае, в этом окне необходимо указать имя сервера или его IP-адрес, на котором запущен Oracle, задать имя экземпляра базы данных, порт и данные пользователя (имя и пароль).

Как только подключение будет выполнено, станут доступны и все остальные разделы утилиты.

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

Через вкладку Color раздела Styles созданы стили COLOR_BUILDS для отображения темы зданий и COLOR_PARCELL для отображения темы земельных участков. На данной вкладке в поле Name указывается уникальное имя стиля. В группах Stroke Color и Fill Color задаются соответственно цвет окантовки объектов и цвет их заливки. Цвета можно задавать при включенной галочке Apply либо при помощи кнопки Sample Color, дающей доступ к наглядной палитре цветов. Можно также воспользоваться прямым указанием RGB-кода цвета в окошке ниже упомянутой кнопки. Регулятор Opacity позволяет регулировать степень прозрачности заливки или окантовки. В поле Description можно задать пояснительную информацию к данному стилю. Для занесения вновь сформированного стиля в библиотечку нужно нажать кнопку Insert внизу вкладки и название стиля появиться в списке доступных площадных стилей. В дальнейшем, если возникнет необходимость отредактировать данный стиль, нужно выбрать его в списке, изменить нужные свойства на вкладке и нажать кнопку Update. Чтобы очистить вкладку перед формированием нового стиля, нужно нажать кнопку New.

Через вкладку Line раздела Styles сформирован стиль LINE_STREET отображения темы улиц. В данной задаче оси улиц служат лишь в качестве опорных объектов для вывода названий улиц и желательно отображение самих линий сделать невидимым. Для этого можно оставит галочку Apply только в разделе Overall Style и указать в качестве цвета белый. Значение Opacity выставить на минимально возможную величину.

Для отображения надписей через вкладку Text раздела Styles созданы три текстовых стиля: TEXT_BUILDS для отображения номеров домов, TEXT_STREET для отображения названий улиц и TEXT_PARCELL для отображения номеров земельных участков. Все три стиля создаются одинаково. При необходимости можно указать, будет ли текст наклонным (флажок Italic) или жирным (флажок Bold), в поле Size размер шрифта, а в списке Family выбрать один из возможных стилей начертания шрифта. Кнопкой Sample Color напротив надписи Foreground Color можно задать цвет текста.

После того, как все стили были сформированы, через вкладку Themes были созданы три темы: тема THEME_BUILDS для отображения зданий, тема THEME_STREET для отображения улиц и тема THEME_PARCELL для отображения земельных участков. На вкладке в верхнем левом углу находится список уже сформированных тем, содержащихся в репозитории метаданных, справа находятся поля основных параметров темы, а внизу вкладки находится табличка, которая в общем случае позволяет настраивать одно или более правил отображения темы. В списке Base Table выбирается пространственная таблица, объекты из которой будет отображать тема (в нашем случае это в порядке перечисления тем таблицы BUILDS, STREET и PARCELL, находящиеся в схеме MAP). В списке Geometry Column указывается колонка из указанной выше таблицы, которая имеет пространственный тип SDO_GEOMETRY. Для всех трех таблиц это будет поле GEOLOC. В нижней настроечной таблице в верхней строке для каждой создаваемой тематики в колонке Feature Style указывается стиль отображения пространственных объектов на карте (соответственно в порядке создания тем были указаны ранее подготовленные стили COLOR_BUILDS, LINE_STREET и COLOR_PARCELL). В колонке Label Col выбирается столбец пространственной таблицы, из которой будут браться данные для надписей (соответственно в порядке создания тем были указаны поля: колонка NUM из таблицы BUILDS, содержащая номера домов, колонка NAME из таблицы STREET, содержащая названия улиц и колонка KU таблицы PARCELL, содержащая номера земельных участков). В следующей колонке Label Style указывается стиль текста надписей (соответственно в порядке создания тем были указаны стили TEXT_BUILDS, TEXT_STREET и TEXT_PARCELL). В поле Label Func для всех трех тем были указаны 1.

После завершения создания тем через вкладку Maps была сформирована базовая карта. В поле Name было указано имя базовой карты MAP_DEMO. В нижней таблице был сформирован список из ранее созданных тем, которые будут отображаться на карте. Темы были указаны в том порядке, в котором они должны отрисовываться (первой указана тема THEME_PARCELL, затем THEME_STREET в самом конце тема THEME_BUILDS). Колонки Min Scale и Max Scale были оставлены пустыми.

Имя сформированной карты используется при формировании запросов к MapViewer.

Запросы, задействованные в задаче

Как было показано на схеме выше, основная последовательность действий клиента при работе с MapViewer является следующей: поиск запущенного экземпляра MapViewer, присоединение к нему, отправка картографического XML запроса и обработка результата, полученного от экземпляра MapViewer.

Запрос к сервлету MapViewer имеет следующий формат:

http://hostname[:port]/MapViewer-servlet-path?xml_request=xml-request
где hostname - это сетевой путь к серверу, на котором запущен MapViewer.
port - это порт, на котором сервис MapViewer слушает сеть.
MapViewer_servlet_path - это путь к сервлету MapViewer (например :/mapviewer/omserver)
xml_request - кодированный по правилам URL запрос в формате XML, который отсылается на сервер методами POST или GET. Форма представления запроса в виде XML требуется во всех видах запросов. Содержимое ответа на запрос может варьироваться от данных в виде XML-документа до бинарного объекта, содержащего файл изображения, запрошенного пользователем.

В отправляемом запросе необходимо указать источник данных и один или более необходимых параметров:

  • Темы и стили.
  • Координаты центральной точки или прямоугольник, задающие отображаемую карту. Также дополнительно могут быть посланы надписи и стили.
  • Предопределенную базовую карту, которая может быть многократно использована и частично переопределена в данном конкретном запросе.
  • Настроенные темы, содержащие пользовательские точки данных (или другие геометрические объекты) генерируемые динамически и отображаемые непосредственно из доступной базы данных.
  • Настроенные объекты (точки, линии, полигоны и пр.), заданные в строках XML запроса для отображения.
  • Тематическое картографирование

В нашем конкретном случае, генерируя HTML-страницу, PL/SQL-процедура выполняет непосредственно один запрос к MapViewer вида:

'http://hostserver:8888/mapviewer/omserver?
xml_request='<?xml version="1.0" standalone="yes"?>
                   <map_request
                     datasource="ds_demo"
                     basemap="map_demo"
                     width="640"
                     height="480"
                     bgcolor="#FFFFFF"
                     antialiasing="false"
                     format="GIF_URL">
                     <center size="[size]">

                       <geoFeature>
                         <geometricProperty>
                           <Point>
                             <coordinates>[x],[y]</coordinates>
                           </Point>

                         </geometricProperty>
                       </geoFeature>
                     </center>
            </map_request>

где

  • hostserver:8888/mapviewer/omserver - сервер MapViewer
  • datasource="ds_demo" - параметр запроса, определяющий источник данных, настроенный ранее для MapViewer
  • basemap="map_demo" - параметр, определяющий имя базовой карты, и включающей в себя все необходимые метаданные, необходимые для формирования и отображения карты.
  • width="640" height="480" - эти параметры задают размеры в пикселах результирующего изображения карты
  • bgcolor="#FFFFFF" - параметр задает RGB-цвет фона изображения карты, поверх которого отрисовывается все остальное.
  • antialiasing="false" - параметр сглаживания ступенчатости на изображении карты.
  • format="GIF_URL" - параметр, указывающий MapViewer, что необходимо сформировать изображение карты и вернуть ссылку на него.
  • <center>...</center> - раздел, определяющий участок карты, котрый нужно отобразить на результирующем изображении.
  • size="[size]" - параметр определяющий размер карты.
  • <geoFeature>...</geoFeature> - раздел указывающий MapViewer, что положение отображаемого участка карты будет задано при помощи пространственного объекта (в нашем случае при помощи точки).
  • <geometricProperty>...</geometricProperty> - подраздел задает геометрические параметры пространственного объекта.
  • <Point>...</Point> - этим подразделом конкретизируется, что в качестве пространтсвеннгшо объекта будет указана точка.
  • <coordinates>[x],[y]</coordinates> - а здесь уже конкретно указываются координаты точки в единицах измерения и системе координат карты

    Организация PL/SQL-процедуры для обработки запросов Web-браузера

    PL/SQL-процедура использует приведенный выше XML-запрос к MapViewer, чтобы получить ссылку на изображение карты, подставив в него входные параметры размера карты и координаты центральной точки. Данная ссылка используется, чтобы сформировать HTML-документ и в дальнейшем будет использована браузером, чтобы запросить у Web-сервера файл изображения карты.

    Ниже приводится фрагмент текста простой процедуры, содержащий ключевые моменты реализации

    --------------------------------------------------------------------------------------------
    PROCEDURE map_view(
          map_size    IN VARCHAR2     DEFAULT NULL,
          map_x       IN VARCHAR2     DEFAULT NULL,
          map_y       IN VARCHAR2     DEFAULT NULL,
    )
    IS
    
        size_par   NUMBER; -- размер карты
        x_par      NUMBER; -- координата X центра карты
        y_par      NUMBER; -- координата Y центра карты
        delta_   NUMBER; -- величина инкремента/декремента смещения центра карты при навигации
        
        l_http_req utl_http.req;
        l_url varchar2(4000);
        l_value varchar2(4000);
        img_url varchar2(4000); -- URL изображения
        response sys.xmltype;
        map_req varchar2(4000);
    
    BEGIN
    
     size_par := to_number(map_size);
     x_par := to_number(map_x);
     y_par := to_number(map_y);
     delta_ := round(size_par/3,2);
     
    -- организация запроса к MapViewer
     l_url := 'http://hostserver:8888/mapviewer/omserver';
     utl_http.set_persistent_conn_support(TRUE);
     map_req := '<?xml version="1.0" standalone="yes"?>
                       <map_request
                         datasource="ds_demo"
                         basemap="map_demo"
                         width="640"
                         height="480"
                         bgcolor="#FFFFFF"
                         antialiasing="false"
                         format="GIF_URL">
                         <center size="'||map_size||'" >
                           <geoFeature>
                             <geometricProperty>
    
                               <Point>
                                 <coordinates>'||map_x||','||map_y||'</coordinates>
                               </Point>
                             </geometricProperty>
                           </geoFeature>
    
                         </center>
                       </map_request>';
    -- отправка запроса к MapViewer
    l_http_req := utl_http.begin_request(l_url, 'POST', 'HTTP/1.0');
    
    utl_http.set_header(l_http_req, 'Content-Type','application/x-www-form-urlencoded');
    utl_http.set_header(l_http_req, 'Content-Length', length('xml_request='||map_req));
    utl_http.set_header(l_http_req, 'Host', 'zemhp');
    utl_http.set_header(l_http_req, 'Port', '8888');
    utl_http.write_text(l_http_req, 'xml_request=' || map_req);
    
    -- получение URL изображение карты
    l_http_resp := utl_http.get_response(l_http_req);
    utl_http.read_text(l_http_resp, l_value);
    response := sys.xmltype.createxml (l_value);
    utl_http.end_response(l_http_resp);
    img_url := response.extract('/map_response/map_image/map_content/@url').getstringval();
     
    -- генерация HTML-страницы
    htp.htmlOpen;
    htp.headOpen;
    htp.title( 'Демонстрационное приложение' );
    htp.headClose;
    htp.bodyOpen;
    
    htp.tableOpen('border=0');
    
    htp.prn('<tr>');
    -- ячейка таблицы, содержащая изображением карты
    htp.prn('<td colspan=6><img border=1 src='''||img_url||''' width="640" height="480"></td>');
    htp.prn('</tr>');
      
    -- ячейки таблицы, содержащие вызовы данной PL/SQL-процедуры для организации навигации
    htp.prn('<tr>');
    htp.prn('<td><img src="in.png" alt="Увеличить" onclick="location=''web.map_view?map_size='||to_char(size_par-delta_)||'&map_x='||map_x||'&map_y='||map_y||'""></td>');
    htp.prn('<td><img src="out.png" alt="Уменьшить" onclick="location=''web.map_view?map_size='||to_char(size_par+delta_)||'&map_x='||map_x||'&map_y='||map_y||'""></td>');
    htp.prn('<td><img src="left.png" alt="Влево" onclick="location=''web.map_view?map_size='||map_size||'&map_x='||to_char(x_par+delta_)||'&map_y='||map_y||'""></td>');
    htp.prn('<td><img src="up.png" alt="Вверх" onclick="location=''web.map_view?map_size='||map_size||'&map_x='||map_x||'&map_y='||to_char(y_par+delta_)||'""></td>');
    htp.prn('<td><img src="down.png" alt="Вниз" onclick="location=''web.map_view?map_size='||map_size||'&map_x='||map_x||'&map_y='||to_char(y_par-delta_)||'""></td>');
    htp.prn('<td><img src="right.png" alt="Вправо" onclick="location=''web.map_view?map_size='||map_size||'&map_x='||to_char(x_par-delta_)||'&map_y='||map_y||'""></td>');
    htp.prn('</tr>');
    
    htp.tableClose;
    
    htp.bodyClose;
    htp.htmlClose;
    
    END;
    ----------------------------------------------------------------------------------------
    

    Связка Web-браузер, Web-сервер и PL/SQL-процедура работает по рекурсивному принципу, так как каждый раз вновь генерируемая процедурой HTML-страничка содержит обратный вызов самой PL/SQL-процедуры, но уже с модифицированными относительно текущего состояния параметрами вызова. Это обеспечивает управление логикой запросов MapViewer и обеспечивает навигацию по плану посредством серии запросов данной HTML-страницы.

    Управление MapViewer при помощи административных запросов

    Основное использование MapViewer заключается в обработке различных запросов. Однако, MapViewer также принимает различные административные (то есть не картографические) запросы. К ним, например относится добавление источника данных при помощи прикладного интерфейса XML. Во все административные запросы вложен элемент <non_map_request> Административные запросы используются для следующих основных задач:

    • Управление источниками данных.
    • Получение списка всех доступных карт (внесение в список).
    • Получение списка всех доступных тем (внесение в список).
    • Управление стилями.
    • Управление КЭШем.

    Наиболее типичным является использование административных запросов управления кэшем MapViewer. MapViewer использует два типа кэша:

    • кэш метаданных (кэшируются стили, темы и базовые карты)
    • кэш пространственных данных.

    Например, если был изменен какой либо из стилей, участвующих в формировании карты, то для того, чтобы эти изменения вступили в силу, необходимо либо перезапустить MapViewer, либо воспользоваться соответствующим административным запросом. Пример подобного запроса:

        <?xml version="1.0" standalone="yes"?>
             <non_map_request>
             <clear_cache data_source="ds_demo"/>
    
    </non_map_request> 
    

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

    Заключение.

    Как и любое технологическое решение MapViewer имеет преимущества и недостатки.

    Преимущества:

    • Так как MapViewer находится в одной "песочнице" с программными продуктами, обеспечивающими хранение пространственных данных, хранение вспомогательных метаданных, а также средств выполнения серверной логики (по аналогии с CGI-логикой Web-серверов), то в итоге информационные системы, созданные с использованием его и всех этих компонентов, во-первых, очень тесно и непротиворечиво взаимодействуют друг с другом, и во-вторых, находятся в едином пространстве информационных стандартов и правил обмена информацией.
    • Подобные решения при создании Web-систем, в основе которых лежат мощные механизмы хранения и доступа к данным Oracle, позволяют безболезненно и, главное, гибко, с меньшими затратами открывать доступ пользователям к данным, хранящимся в базе данных, через Web-интерфейс. До появления MapViewer компонент представления картографической информации в линейке продуктов Oracle отсутствовал и приходилось прибегать к помощи программных продуктов третьих фирм. MapViewer заполнил данный пробел.

    Недостатки:

    • По сравнению с программными продуктами других фирм, изначально нацеленных на отображение настраиваемых в широких пределах картографических данных в Web, MapViewer все же не является полноценным картографическим Web-сервером, о чем предупреждают и сами разработчики.
    • Так данное программное средство целиком ориентировано на отображение данных Oracle Spatial, естественно отсутствует возможность подключения в картографическую композицию наряду с собственными данными Oracle данных из других источников (например, файловых), будь то фотографии, хранящиеся на сервере в виде файлов или данные, хранящиеся в применяемых в других ГИС форматах.

    На наш взгляд, это средство может быть эффективно использовано в типичных системах отображения информации различного назначения как промышленного, так и коммерческого применения (муниципальном и региональном управлении, отображения в задачах позиционирования объектов с использованием мобильных терминалов и пр.).

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

  • Новости мира IT:

    Архив новостей

    Последние комментарии:

    Loading

    IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

    Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
    тел. +7 985 1945361
    Пресс-релизы — pr@citforum.ru
    Обратная связь
    Информация для авторов
    Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2015 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...