Разработка приложения для визуализации картографической информации
МИНИСТЕРСТВО
ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
Учреждение
образования
«Гомельский
государственный университет имени Франциска Скорины»
Математический
факультет
Кафедра
математических проблем управления
КУРСОВАЯ
РАБОТА
Разработка
приложения для визуализации картографической информации
Исполнитель:
студент группы ПМ-41
Британов Е.А.
Научный руководитель:
ассистент кафедры МПУ
Короткевич Л.И.
Гомель
2014
Реферат
Курсовая работа 47 страниц, 10 таблиц, 17 рисунков, 2 приложение, 10
источников.
Ключевые слова: Oracle, язык SQL, Delphi, Visual Basic, XML,
компоненты, объектно-ориентированное программирование, визуализация
картографической информации.
Объект исследования: способы представления картографической информации.
Предмет исследования: элементы карт, содержащие необходимую информацию.
Методы исследования: изучить особенности типов контуров картографической информации
Цель курсовой работы: Разработка оконного приложения для визуализации
картографической информации
Задачами курсовой
работы являются: изучить структуру базы данных для визуализации
картографической информации, разработать алгоритмы визуализации карт, изучить
средства визуализации данных и средства взаимодействия с СУБД Oracle в интегрированной среде Delphi,
изучить язык программирования Visual Basic,
визуализировать карты в среде MS Visio
Выводы: выполнено приложение по визуализации картографической
информации.
Содержание
Введение
1. Назначение и
возможности разработанного приложения
1.1 Исходные
данные
1.2 Возможности
приложения
2. Средства
разработки приложения
2.1 Хранимые
процедуры, функции и триггеры
2.1.1 Хранимые
процедуры
2.1.2 Хранимые
функции
2.1.3 Триггеры
2.2 Структура
блока PL/SQL
2.2.1 Секция
заголовка
2.2.2 Секция
объявлений
2.2.3
Выполняемая секция
2.2.4 Секция
исключений
3. Структура
таблиц базы данных, используемых в приложении
4.
Взаимодействие пользователя с приложением
4.1 Описание
экранной формы по работе с картами
4.1.1 Страница
«Карта»
4.1.2 Страница
«Контуры»
4.2 Особенности
работы приложения
4.3 Визуализация
карты в MS Visio
Заключение
Список
использованных источников
Приложения
Введение
В настоящее время с помощью современных технологий осуществляются
геофизические исследования поверхностей земли, на основе чего составляются
схематические рисовки исследованных пластов в виде карты местности, элементами
которой являются схематически обозначенные контуры карт, необходимые глубины, и
другие параметры.
В связи, с чем программистами создаются предназначенные для этих целей
программные средства, систематизирующие полученные данные о местности и
представляемые для конечных пользователей в удобном им виде.
Целью курсовой работы являлось разработать приложение в среде Delphi, взаимодействующее с базами данных в
СУБД Oracle, выполняющее визуализацию
картографической информации о местности. В частности, на карте отображаются
типы контуров карты, информация о местности и легенда карты.
В ходе выполнения курсовой работы были решены следующие задачи:
) Проработать структура базы данных для визуализации картографической информации
) Разработать алгоритм рисовки контуров карты
) Разработать алгоритм отображения отдельных элементов карты
) Разработать алгоритм для задания параметров каждому контуру карты
) Разработать алгоритм сохранения картографической информации в XML-документе
) Разработать алгоритм визуализации картографической информации в MS Visio на языке программирования Visual Basic
) Наладить работу между приложением и СУБД Oracle.
В описание курсовой работы входят такие главы, как:
) Назначение и возможности разработанного приложения - содержит описание
разработанного приложения для визуализации картографической информации
) Средства разработки приложения - содержит описание элементов языка PL/SQL
) Структура баз данных, используемых в приложении - содержит описание
используемых таблиц
) Взаимодействие пользователя с приложением - содержит указания для
корректной работы пользователя с приложениями
1.
Назначение и возможности разработанного приложения
Разработанное приложение выполнено для осуществления работы с геофизическими
данными с последующей их визуализацией.
1.1
Исходные данные
Приложение позволяет создавать и загружать карты местности из цифровых
форматов информации о местности.
Формат apr является файлом проекта ArcView. Поддерживается в ArcGis начиная с версии 3.x.- семейство программных продуктов
американской компании ESRI, одного из лидеров мирового рынка геоинформационных
систем. ArcGIS позволяет визуализировать (представить в виде цифровой карты)
большие объёмы статистической информации, имеющей географическую привязку. В
среде создаются и редактируются карты всех масштабов: от планов земельных
участков до карты мира. Также в ArcGIS встроен широкий инструментарий анализа
пространственной информации.
Данные содержатся в текстовом формате, поэтому при желании можно его
отредактировать в любом текстовом редакторе.
В файле формата apr
содержатся перечень слоев, привязки по координатам и множество другой
информации.
Каждый слой представляет из себя совокупность нескольких файлов, то есть:
) Файл с расширением shp. Содержит перечень объектов одного слоя с
соответствующими координатами для них. Данные хранятся в бинарном режиме,
поэтому редактированию вручную файл не подлежит.
) Файл с расширением dbf. Формат хранения данных, используемый в качестве
одного из стандартных способов хранения и передачи информации системами
управления базами данных. Для каждого соответствующего объекта слоя
соответствует определенное значение, обозначающее глубину расположения объекта.
Имеет возможность редактирования в таких утилитах для таблиц баз как Database
Dekstop.
) Файл с расширением shx. Содержит индексные значения каждого слоя
Для правильного функционирования файлы, соответствующие одному слою,
должны иметь одно наименование. Также все файлы должны находиться в том же
каталоге, что и apr-файл.
Для корректного отображения карты используются прочитанные из файла
формата apr привязки по координатам, так как
координаты, прочитанные из файлов формата shp, содержат значения в другой системе координат.
приложение
визуализация картографический информация
1.2
Возможности приложения
Таким образом приложение осуществляет чтение информации из файлов формата
apr, выполняет рисовку карты на экранной
форме. Также на карте присутствуют такие элементы как наименование карты и
легенда карты, которым можно задавать размеры и осуществлять передвижение их по
карте, а также пользователь может решить, отображать ли их вообще.
Имеется возможность отображать скважины, причем существует несколько
режимов отображения, то есть либо не отображать вообще, либо комбинировать со
следующими режимами:
¾ Стандартные обозначения скважин
¾ Цветные пиктограммы каждой из скважин
¾ Номера скважин рядом пиктограммой скважины
Скважины отображаются таким образом, что если они присутствовали в
перечне слоев в файле проекта, то рисуются скважины из этого файла. В противном
случае, в зависимости от выбранного пользователем пласта, отображаются
скважины, соответствующие этому пласту и выбранному ранее месторождению.
Также для каждого контура имеется возможность задать для них свойство
видимости на карте, а также изменить тип линии, цвет линии и ширину.
Имеется возможность сохранять отрисованную карту в формате wmf на диск.
Все временные файлы, создаваемые в процессе приложения хранятся во
временной директории каталога Windows.
В связи с тем, что файлы формата wmf предназначены в основном для просмотра на компьютере,
а при распечатке изображение дает неточности, то была реализована такая
возможность, как прорисовка карты в MS Visio.
2.
Средства разработки приложения
.1
Хранимые процедуры, функции и триггеры
Процедуры, функции и триггеры PL/SQL помогают легко реализовывать сложную
бизнес-логику модульным способом (т.е. компонент за компонентом, причем
одни компоненты многократно используются другими). Сохранение их на сервере
Oracle дает двоякую выгоду: возможность повторного использования с
предсказуемыми результатами и очень быстрое выполнение, поскольку серверные
операции почти или совсем не требуют обращения к сети.
2.1.1
Хранимые процедуры
Хранимая процедура - это определенный набор инструкций, написанных на
языке PL/SQL. Вызов процедуры приводит к выполнению содержащихся в ней
инструкций. Процедура хранится в базе данных, поэтому и называется хранимой.
Хранимая процедура может выполнять SQL-операторы и манипулировать данными
в таблицах. Ее можно вызывать из другой хранимой процедуры PL/SQL, хранимой
функции или триггера, а также непосредственно из строки приглашения SQL*Plus.
Процедура состоит из двух основных частей: спецификации и тела.
Спецификация процедуры (procedure specification) включает в себя имя процедуры
и описание ее входных и выходных данных. Эти входные и выходные данные
называются формальными параметрами (formal parameters) или формальными
аргументами (formal arguments). Если при вызове процедуры указываются параметры
командной строки или другие входные данные, эти значения называются
фактическими (actual) параметрами или фактическими аргументами.
Теперь рассмотрим некоторые примеры спецификаций процедур (Спецификация
не содержит никакого кода; в ней определяется только имя процедуры, а также ее
входные и выходные параметры).
increase_prices (percent_increase NUMBER)
Этой процедуре при вызове может быть передано значение. Внутри процедуры
значение будет известно под именем PERCENT_INCREASE. Обратите внимание, что здесь указан тип данных: NUMBER.
increase_salary_find_tax (increase_percent IN NUMBER
:= 7,IN OUT NUMBER,OUT NUMBER)
Здесь мы видим процедуру с тремя формальными параметрами. Слово IN после
имени параметра означает, что при вызове процедура может считать из этого
параметра входное значение. Слово OUT означает, что процедура может
использовать данный параметр для возврата значения в ту программу, из которой
она была вызвана. Комбинация IN OUT после имени параметра говорит о том, что
параметр может использоваться как для передачи значения процедуре, так и для
возврата значения.
Параметру INCREASE_PERCENT в этом примере присвоено значение по умолчанию
(default value), равное 7, путем добавления := 7 после типа данных. Таким
образом, если процедура будет вызвана без указания процента прироста, она
увеличит переданное значение зарплаты на 7% и рассчитает налог, исходя из новой
зарплаты.
Типы данных в процедуре не могут иметь спецификаций размера. Например, вы
можете указать для параметра тип данных NUMBER, но не NUMBER(10,2).
Тело процедуры (procedure body) - это блок PL/SQL-кода.
2.1.2
Хранимые функции
Функция PL/SQL похожа на процедуру PL/SQL: она также имеет спецификацию и
тело. Главное различие между процедурой и функцией в том, что функция предназначена
для возврата значения, которое может использоваться в более крупном
SQL-Операторе.
Рассмотрим в качестве примера функцию, предназначенную для вычисления
процентного различия между двумя числами. Спецификация этой функции может
выглядеть таким образом:
calcjpercent (value_l NUMBER,_2 NUMBER) return NUMBER
Эта функция принимает в качестве входных параметров два числа, ссылаясь
на них внутри себя как на VALUE_1 и VALUE_2. После написания тела функции ее
можно вызывать в SQL-операторе следующим образом:
INSERT INTO employee VALUES (3000, CALC PERCENT(300,
3000));
2.1.3
Триггеры
Триггер - это процедура PL/SQL, которая выполняется автоматически, когда
происходит некоторое заданное событие, называемое триггерным событием
(triggering event). Например, можно писать триггеры, срабатывающие при
выполнении над таблицей операций INSERT, UPDATE или DELETE; при выдаче команд
DDL; при входе пользователя в систему или его выходе из системы; при запуске
или останове базы данных; при возникновении ошибок.
Между триггерами и процедурами PL/SQL есть три различия:
¾ Триггеры нельзя вызывать из кода программы. Oracle вызывает
их автоматически в ответ на определенное событие
¾ Триггеры не имеют списка параметров
¾ Спецификация триггера немного отличается от спецификации процедуры
2.2
Структура блока PL/SQL
Весь код PL/SQL, выполняющий фактическую работу, состоит из базовых
блоков. Изучив базовые блоки, можно рассматривать законченные примеры процедур,
функций и триггеров.
Базовый блок PL/SQL состоит из четырех секций: секции заголовка (header
section), необязательной секции объявлений (declaration section), выполняемой
секции (execution section) и необязательной секции исключений (exception
section).
Анонимный блок (anonumous block) - это блок PL/SQL без секции заголовка, иначе
говоря, секции имени, поэтому он и называется анонимным. Анонимные блоки могут
выполняться из SQL*Plus и использоваться в функциях, процедурах и триггерах
PL/SQL. Вспомните, что сами процедуры, функции и триггеры также состоят из
базовых блоков. Это означает, что базовый блок можно помещать в другой базовый
блок.
2.2.1
Секция заголовка
Секция заголовка блока бывает разных видов в зависимости от того, какому
компоненту программы принадлежит блок. Вспомните, что процедуры, функции,
триггеры и анонимные блоки состоят из базовых блоков. Как минимум они имеют
один базовый блок, составляющий их тело. Этот блок может содержать внутри себя
другие базовые блоки. Заголовок базового блока верхнего уровня для функции,
процедуры или триггера содержит спецификацию этой функции, процедуры или
триггера.
Для анонимных блоков заголовок содержит только ключевое слово DECLARE.
Для помеченных блоков заголовок содержит имя метки, заключенное в двойные
угловые скобки, за которым следует ключевое слово DECLARE:
<<just_a_label>>
Метки блоков облегчают чтение кода. В процедуре, содержащей вложенные
блоки (блоки внутри других блоков), можно ссылаться на элемент определенного
блока, предваряя имя элемента именем блока (например,
метка_блока.метка_элемента).
2.2.2
Секция объявлений
Секция объявлений не является обязательной. В случае использования она
начинается после секции заголовка и оканчивается перед ключевым, словом BEGIN.
Эта секция содержит объявления переменных, констант, курсоров, исключений,
функций и процедур PL/SQL, которые будут использоваться в выполняемой секции и
секции исключений. Все объявления переменных и констант должны размещаться до
объявлений функций или процедур. Объявление сообщает PL/SQL о том, что нужно
создать переменную, констан ту, курсор, функцию или процедуру согласно
приведенной спецификации.
Когда выполнение базового блока завершается, все элементы, объявленные в
секции объявлений, перестают существовать. Элементы, объявленные в секции
объявлений базового блока, могут использоваться только в пределах этого блока.
2.2.3
Выполняемая секция
Выполняемая секция начинается с ключевого слова BEGIN и заканчивается
либо ключевым словом EXCEPTION, если присутствует секция исключений, либо
ключевым словом END, за которым следуют необязательное имя функции или
процедуры и точкас запятой. Выполняемая секция содержит один и более
PL/SQL-операторов, выполняемых при передаче управления данному блоку. Структура
выполняемой секции показана ниже.
BEGIN
один и более PL/'SQL-операторов
[секция исключений][имя функции или процедуры];
В выполняемом коде PL/SQL чаще всего встречается оператор присваивания
(:=). Он указывает, что нужно вычислить выражение справа и поместить результат
в переменную слева.
2.2.4
Секция исключений
В ходе выполнения PL/SQL-оператора может возникнуть ошибка, которая
сделает невозможным дальнейшее выполнение программы. Такие исключительные
ситуации называются исключениями (exceptions). Пользователь, вызвавший
процедуру, должен быть проинформирован о возникновении исключения, а также о
причинах, его вызвавших. Вы можете выдать пользователю содержательное сообщение
об ошибке, или предпринять некоторые корректирующие действия и повторить
операцию, выполнявшуюся до возникновения ошибки. Вы также можете откатить
изменения, которые были произведены в базе данных к этому моменту./SQL помогает
вам во всех этих случаях, предоставляя средства обработки исключений (exception
handling). В хорошо написанных приложениях исключения столь важны, что им
посвящен специальный раздел в конце этой главы, где о них рассказано более
подробно. А здесь, в качестве введения, рассмотрим структуру секции исключений.
EXCEPTION
WHEN имя_исключения
THEN
действия, предпринимаемые при возникновении
исключенияимя_исключения
действия, предпринимаемые при возникновении исключения
Секция исключений начинается с ключевого слова EXCEPTION и продолжается
до конца блока. Каждому исключению соответствует оператор WHEN имя_исключения,
указывающий, что должно быть сделано при возникновении данного исключения. В
нашем примере таких операторов три, все они выводят текст на экран SQL*Plus.
Пакет DBMS_OUTPUT и процедура PUT_LINE являются частью базы данных Oracle;
вместе они позволяют построчно отображать текст на экране SQL*Plus. Все
операторы, находящиеся между оператором, вызвавшим ошибку, и секцией
исключений, игнорируются.
Процесс, включающий в себя обнаружение ошибки, определение, какое
исключение описывает ее наилучшим образом, и передачу PL/SQL информации,
позволяющей найти соответствующий код в секции исключений, называется
возбуждением исключения (raising exception). В демонстрационном коде исключение
возбуждает сам PL/SQL, обнаружив попытку деления на нуль. В PL/SQL это
исключение имеет предопределенное имя - ZERO_DIVIDE. Во многих ситуациях ошибку
должен обнаруживать ваш код, а не PL/SQL.
3.
Структура таблиц базы данных, используемых в приложении
В результате выполнения курсовой работы, была проработана структура базы.
В таблице 3.1 представлен перечень таблиц, используемых в приложении
Таблица 3.1 - Используемые таблицы в приложении
Наименование таблицы
|
Наименование справочника
|
FIELD_HDR
|
Справочник месторождений
|
LAYER_HDR
|
Справочник
стратиграфических пластов (слоев)
|
WELL_HDR
|
Головная таблица
исследований
|
WMF_MAP
|
Исходные файлы с картами
|
VEKT_MAP
|
Векторные карты
|
MAP_SLV
|
Типы линий
|
MAP_SLVM
|
Типы карт
|
Структура разработанных таблиц представлена в таблицах 3.2, 3.3, 3.4,
3.5, 3.6, 3.7, 3.8
Таблица
3.2 - Структура таблицы FIELD_HDR. Справочник месторождений
Имя поля
|
Обяз
|
Тип поля
|
Наименование поля
|
ID
|
Да
|
NUMBER
|
Первичный ключ
|
FIELD_CODE
|
Да
|
VARCHAR
|
Код НСИ
|
FIELD_NAME
|
Нет
|
VARCHAR
|
Наименование НСИ
|
SOURCE_ID
|
Нет
|
NUMBER
|
Источник данных
|
KOD
|
Нет
|
VARCHAR
|
Код месторождения
|
MEST
|
Нет
|
VARCHAR
|
Наименование
|
NOM
|
Нет
|
NUMBER
|
№ п/п
|
Таблица 3.3 - Структура таблицы LAYER_HDR. Справочник стратиграфических
пластов
Имя поля
|
Обяз
|
Тип поля
|
Наименование поля
|
ID
|
Да
|
NUMBER
|
Первичный ключ
|
LAYER_NAME
|
Да
|
VARCHAR
|
Индекс
|
LAYER_TYPE
|
Нет
|
VARCHAR
|
Тип пласта
|
DISPLAY_NAME
|
Нет
|
VARCHAR
|
Наименование
|
MIN_AGE
|
Нет
|
VARCHAR
|
Мин.возраст
|
MAX_AGE
|
Нет
|
VARCHAR
|
Макс.возраст
|
REMARKS
|
Нет
|
NUMBER
|
Комментарий
|
SOURCE_ID
|
Нет
|
NUMBER
|
Идентификатор источника
|
KOD
|
Нет
|
VARCHAR
|
Код пласта в OIS (PL0001,
PL0002, …)
|
Таблица 3.4 - Структура таблицы MAP_SLVM (Типы карт)
Имя поля
|
Обяз
|
Тип поля
|
Наименование поля
|
KOD
|
Да
|
VARCHAR2
|
Первичный ключ
|
NOMP
|
Нет
|
NUMBER
|
Порядковый номер
(используется при отображении)
|
NAME
|
Нет
|
VARCHAR2
|
Наименование типа карты
|
NAMED
|
Нет
|
VARCHAR2
|
Отображаемое наименование
(сокращенное)
|
Таблица 3.5 - Структура таблицы MAP_SLV (Типы линий)
Имя поляОбязТип поляНаименование
поля
|
|
|
|
KOD
|
Да
|
VARCHAR2
|
Первичный ключ
|
NOMP
|
Нет
|
NUMBER
|
Порядковый номер
(используется при отображении)
|
NAME
|
Нет
|
VARCHAR2
|
Наименование типа линии
|
NAMED
|
Нет
|
VARCHAR2
|
Отображаемое наименование
(сокращенное)
|
Таблица 3.6 - Структура таблицы WMF_MAP (Исходные файлы с картами)
Имя поля
|
Обяз
|
Тип поля
|
Наименование поля
|
ID
|
Да
|
NUMBER
|
Первичный ключ
|
FIELD_HDR_ID
|
Да
|
NUMBER
|
Идентификатор скважины
|
KZAL
|
Нет
|
VARCHAR2
|
Код залежи
|
DATA
|
Нет
|
DATE
|
Дата вставки записи
|
USER_NAME
|
Нет
|
VARCHAR2
|
Пользователь, добавивший
запись
|
XX_LU
|
Нет
|
NUMBER
|
X-координата левой верхней точки «привязки» карты
|
YY_LU
|
Нет
|
NUMBER
|
Y-координата левой верхней точки «привязки» карты
|
YY_RL
|
Нет
|
NUMBER
|
Y-координата правой нижней точки «привязки» карты
|
XX_RL
|
Нет
|
NUMBER
|
X-координата правой нижней точки «привязки» карты
|
JPG
|
Нет
|
BLOB
|
Карта месторождения
|
TYPE
|
Нет
|
VARCHAR2
|
Расширение карты
месторождения, например, wmf, shp и т.п.
|
MAP_NAME
|
Нет
|
VARCHAR2
|
Наименование карты
|
AVTOR
|
Нет
|
VARCHAR2
|
Автор
|
IDM
|
Нет
|
RAW
|
Идентификатор карты
|
PRA
|
Нет
|
NUMBER
|
Признак архивации
|
XX_LU_I
|
Нет
|
NUMBER
|
X-координата дополнительной точки «привязки» карты
|
YY_LU_I
|
Нет
|
NUMBER
|
Y-координата дополнительной точки «привязки» карты
|
YY_RL_I
|
Нет
|
NUMBER
|
Y-координата дополнительной точки «привязки» карты
|
Нет
|
NUMBER
|
X-координата дополнительной точки «привязки» карты
|
TIPM
|
Нет
|
NUMBER
|
Код типа карты
|
Таблица 3.7 - Структура таблицы VEKT_MAP (Векторные карты)
Имя поля
|
Обяз
|
Тип поля
|
Наименование поля
|
ID
|
Да
|
NUMBER
|
Первичный ключ
|
FIELD_HDR_ID
|
Да
|
NUMBER
|
Идентификатор скважины
|
KOD_PLAST
|
Нет
|
VARCHAR2
|
Код пласта
|
NAME_MAP
|
Нет
|
VARCHAR2
|
Наименование контура
|
AVTOR
|
Нет
|
VARCHAR2
|
Автор
|
DATE_MAP
|
Нет
|
VARCHAR2
|
Дата создания контура
|
MAS
|
Нет
|
BLOB
|
Описание контура с
координатами точек
|
DT_INSERT
|
Нет
|
DATE
|
Дата вставки записи в таблицу
|
USR_INSERT
|
Нет
|
VARCHAR2
|
Пользователь, добавивший
запись
|
DT_UPDATE
|
Нет
|
DATE
|
Дата обновления записи
|
USR_UPDATE
|
Нет
|
VARCHAR2
|
Пользователь, обновивший
запись
|
IDM
|
Нет
|
RAW
|
Идентификатор карты
|
TIPL
|
Нет
|
NUMBER
|
Код типа линии
|
Таблица 3.8 - Структура таблицы WELL_HDR (Паспортные данные по скважине)
Имя поля
|
Обяз
|
Тип поля
|
Наименование поля
|
ID
|
Да
|
NUMBER
|
Первичный ключ
|
UWI
|
Нет
|
NUMBER
|
Идентификатор скважины
|
KOD_MEST
|
Да
|
NUMBER
|
Код месторождения
|
R_FIELD_AREA_ID
|
Нет
|
NUMBER
|
Идентификатор площади на
месторождении
|
NOM_SKV
|
Да
|
VARCHAR
|
Номер скважины
|
NOM_STV
|
Да
|
NUMBER
|
Номер ствола
|
NOM_KUST
|
Нет
|
NUMBER
|
Номер куста
|
LIT_KUST
|
Нет
|
NUMBER
|
Литера куста
|
D_BEG_BYR
|
Нет
|
DATE
|
Дата начала бурения
|
D_END_BYR
|
Нет
|
DATE
|
Дата окончания бурения
|
BYR_ORG
|
Да
|
NUMBER
|
Организация, пробурившая
скважину
|
KAT_P_ZAL
|
Нет
|
NUMBER
|
Категория при заложении
|
PR_OB_RAZR
|
Нет
|
VARCHAR
|
Признак объекта разработки
|
KOOR_X
|
Нет
|
NUMBER
|
Координата X устья
|
KOOR_Y
|
Нет
|
NUMBER
|
Координата Y устья
|
SOST_SKV
|
Нет
|
VARCHAR
|
Состояние скважины после
бурения
|
FAKT_GOR
|
Да
|
NUMBER
|
Фактический горизонт
|
FAKT_GLUB
|
Нет
|
NUMBER
|
Фактическая глубина забоя
|
PROE_GOR
|
Нет
|
VARCHAR
|
Проектный горизонт
|
PROE_GOR_FIN
|
Нет
|
NUMBER
|
Код проектного горизонта
|
PROE_GLUB
|
Нет
|
NUMBER
|
Проектная глубина
|
ALT_ROT
|
Нет
|
NUMBER
|
Альтитуда со столом ротора
|
ALT_UST
|
Нет
|
NUMBER
|
Альтитуда устья
|
ALT_FLN
|
Нет
|
NUMBER
|
Альтитуда фланца
|
GL_KR_MOST
|
Нет
|
NUMBER
|
Глубина кровли отсекающего
моста
|
DATA_PRIN
|
Нет
|
DATE
|
Дата принятия из бурения
|
DATA_EKSPL
|
Нет
|
DATE
|
Дата начала эксплуатации
|
DATA_LIKV
|
Нет
|
DATE
|
Дата ликвидации
|
D_END_STV
|
Нет
|
DATE
|
Дата окончания
использования ствола
|
DT_INSERT
|
Нет
|
DATE
|
Дата вставки записи
|
USR_INSERT
|
Нет
|
VARCHAR
|
Пользователь вставивший
запись
|
DT_UPDATE
|
Нет
|
DATE
|
Дата модификации записи
|
USR_UPDATE
|
Нет
|
VARCHAR
|
Пользователь модифицировавший
запись
|
LOG_NOM
|
Нет
|
CHAR
|
Ссылка на журнал LOG
|
SOST
|
Нет
|
NUMBER
|
Состояние
|
PRIM
|
Нет
|
VARCHAR
|
Примечание
|
BEG_ISPT
|
Нет
|
DATE
|
Дата начала испытания
|
END_ISPT
|
Нет
|
DATE
|
Дата окончания испытания
|
CEX
|
Да
|
NUMBER
|
Цех
|
4.
Взаимодействие пользователя с приложением
После запуска приложения открывается главная экранная форма приложения,
содержащая в верней части перечень месторождений, в нижней части формы
находится на двух вкладках перечень карт и перечень контуров карт. Причем
карты и контуры карт отображаются в соответствии с выбранным пользователем
месторождением (см. рисунок 4.1).
Рисунок 4.1 - Главная экранная форма
Пользователь имеет возможность работать с непосредственными данными в
перечне карт. В частности, может добавить новую запись в таблицу, либо
отредактировать уже имеющуюся. Чтобы это осуществить, необходимо выбрать на
панели меню пункты «Загрузить карту» или «Редактировать карту» соответственно.
4.1
Описание экранной формы по работе с картами
Экранная форма по работе с картами состоит из двух страниц «Карта» и
«Контуры» (как показано на рисунках 4.2, 4.3).
Рисунок 4.2 - Экранная форма по работе с картами. Страница
"Карта"
Рисунок 4.3 - Экранная форма по работе с картами. Страница
"Контуры"
4.1.1
Страница «Карта»
Непосредственно сама карта месторождения состоит из нескольких частей:
само отображение карты, легенда карты, шапка карты.
Для
редактирования шапки карты существуют несколько элементов управления,
позволяющих это сделать (что описано в Таблице 4.1).
Таблица 4.1 - Элементы управления для корректировки шапки карты
Изображение
|
Описание элемента
управления
|
|
Видимость шапки карты
|
|
Наименование месторождения.
Не редактируемо.
|
|
Наименование залежи.
Вручную не редактируемо. Можно изменить, изменив текущую запись в перечне
залежей
|
|
Наименование карты.
Редактируемо
|
|
Масштаб карты. Не
редактируемо
|
|
С помощью этого элемента
управления можно подкорректировать размеры надписей на шапке карты, двигая
бегунок вправо-влево.
|
Для
редактирования легенды карты существуют несколько элементов управления,
позволяющих это сделать (что описано в Таблице 4.2).
Таблица
4.2 - Элементы управления для корректировки легенды карты
Изображение
|
Наименование
|
|
Видимость шапки карты
|
|
Определяет, рисовать ли на
легенде стандартное обозначение скважины с номером, либо без него
|
|
С помощью этого элемента
управления можно подкорректировать размеры надписей на шапке карты, двигая
бегунок вправо-влево.
|
Непосредственно сами панели, содержащие шапку и легенду карты, можно
перетаскивать с помощью мыши по экрану. Перемещение будет ограничено границами
изображения.
Пользователь может на карте месторождения кроме самих контуров также
отображать и дополнительные параметры. На правой панели над изображением карты
находятся переключатели, регулирующие это.
¾ Скважины - переключатель определяет, рисовать ли на карте
обозначения скважин. Если переключатель выключен, то следующие три
переключателя не активны.
¾ Номера скважин - переключатель определяет, рисовать ли на
карте номера скважин рядом с их обозначением.
¾ Пиктограмма - переключатель определяет, рисовать ли на карте
вместо стандартного обозначения скважин обозначения скважин, соответствующие
обозначения для каждого типа скважины.
¾ Линии устья - переключатель определяет, рисовать ли для
каждой скважины линии устья.
Для того чтобы увидеть сделанные изменения, необходимо нажать на кнопку
«Обновить», находящуюся на панели инструментов, в результате чего выполнится
перерисовка карты.
На форме загрузчика карт на вкладке «Карта» предусмотрены также
возможности, связанные с просмотром карты в окне. В частности следующие кнопки:
¾ Увеличить - увеличивает изображение. Увеличение происходит до
определенных размеров.
¾ Уменьшить - уменьшает изображение. Уменьшение происходит до
определенных размеров.
¾ Начальный - задаёт изображению начальный размер.
Рисунок 4.4 - Диалог по сохранению нарисованной карты
Также экранная форма позволяет сохранять карту в формате wmf после щелчка по соответствующей
кнопке на панели управления и корректного осуществления диалога с пользователем
с выбором директории по сохранению файла. По умолчанию наименование файла
совпадает с наименованием карты (см. рисунок 4.4).
После того, как все корректирующие действия сделаны, для того чтобы карту
занести в базу данных, необходимо нажать на кнопку «Сохранить», находящуюся на
панели управления.
Если введенные данные не корректны, например если пусты редактируемые
поля «Автор», «Имя карты», то пользователь увидит соответствующее сообщение
(см. рисунок 4.5)
Рисунок 4.5 - Сообщение о некорректности введенных данных
В этом случае пользователю необходимо проверить введенные данные и после
исправления ошибок вновь нажать на кнопку «Сохранить», либо просто завершить
сеанс работы с окном, не сохраняя изменений.
4.1.2
Страница «Контуры»
Для корректировки неотъемлемых частей карты - контуров, необходимо
перейти на вкладку «Контуры». Там представлены все контуры, доступные для
отображения. Контуры представлены в виде дерева с корнями, соответствующими
названию контура (как показано на рисунке 4.6)
Рисунок 4.6 - Список контуров на странице «Контуры»
Для каждого контура можно изменить простым кликом на квадрат рядом с ним
можно изменить свойство его видимости. Также при вызове контекстного меню
правым кликом мыши по одному из контуров откроется окно, позволяющее настроить
выбранный тип линии. В частности изменить тип рисовки, цвет линии и ширину
линии (см. рисунок 4.7). Для того чтобы принять изменения, необходимо нажать на
кнопку «Ок», в противном случае закрыть форму или нажать на «Отмена».
Рисунок 4.7 - Экранная форма настройки контура карты
При переходе от одного контура к другому и при изменении его типа,
автоматически перерисовывается его изображение (как показано на рисунке 4.8).
Рисунок 4.8 - Вопрос пользователю о применении сделанных изменений
Также пользователь может добавить новый контур на карту. Для этого
требуется нажать на кнопку «Добавить слой» на панели инструментов. После чего
отобразится диалоговое окно открытия контура (рисунок 4.9).
Рисунок 4.9 - Диалоговое окно загрузки карты
И таким образом в список контуров карты добавится новый контур «Контур
картопостроения» (см. рисунок 4.10).
Рисунок 4.10 - Добавление контура на карту
Чтобы применить сделанные изменения, то есть сделать так, чтобы на карте
рисовались измененные контуры, достаточно нажать на кнопку «Применить», а чтобы
оставить контуры без изменений, нажать на «Отменить». После нажатия на любую из
этих кнопок, активной станет вкладка «Карта».
Также, если переключиться с вкладки «Контуры» на вкладку «Карта», то в
случае если был изменен какой-либо параметр контуров, пользователь увидит
соответствующее сообщение (см. рисунок 4.11).
Рисунок 4.11 - Вопрос пользователю о применении сделанных изменений
При переключении на вкладку «Карта», если это необходимо, будет выполнена
перерисовка карты в соответствии с изменениями параметров контуров (что
показано на рисунке 4.12).
Рисунок 4.12 - Карта после некоторых изменений
4.2
Особенности работы приложения
Таким образом, экранная форма по работе с картами имеет два режима
работы: режим загрузки и режим редактирования.
В результате нажатия на кнопку «Редактировать карту», на экранную форму
загрузится уже имеющаяся карты местности, и таким образом на форму загрузится
сама карта и её параметры в элементах управления.
Если же нажать кнопку «Загрузить карту», то в результате отобразится
диалоговое окно загрузки карты (рисунок 4.13).
Рисунок 4.13 - Диалоговое окно загрузки карты
Для корректной загрузки карты необходимо выбрать файл с расширением apr, в котором содержится перечень
файлов с разрешением shp.
Эти файлы должны находиться в той же директории, что и apr-файл.
В результате, как и в случае редактирования карты выполнится рисовка
карты местности, и параметры карты примут соответствующие им значения в
элементах управления
Если по каким-либо причинам пользователя не устраивает текущая карта,
например он выбрал не тот файл при открытии формы, предусмотрена такая
возможность, как загрузить другую карту на форму, чтобы не проводить лишние
манипуляции с закрытием и последующим открытием формы. Для этого необходимо
нажать на кнопку «Открыть», находящуюся на панели инструментов. В результате
чего выполнится то же, что и при открытии формы при загрузке новой карты. А
прошлые данные будут утеряны. Стоит отметить, что эта функция доступна только в
режиме загрузки карты.
4.3
Визуализация карты в MS Visio
Для того, чтобы визуализировать карту в MS Visio необходимо нажать кнопку «Загрузить в Visio». После чего откроется пустой
документ MS Visio (см. рисунок 4.14), в котором для отрисовки карты
необходимо нажать на сочетание клавиш «Alt+F8» и
нажать клавишу «Enter» (рисунок
4.15). В результате на документе отрисуется требуемая карта (показано на
рисунке 4.16).
Рисунок 4.14 - Пустой документ MS Visio
Рисунок 4.15 - Пустой документ MS Visio
Рисунок 4.16 - Отрисованная карта
Причем элементы карты в процессе рисовки группируются таким образом, что
в проводнике рисунков можно выбрать отдельно элемент карты и провести с ним
какую-нибудь манипуляцию (см. Рисунок 4.17)
Рисунок 4.17 - Проводник рисунков
Заключение
В настоящее время с помощью современных технологий осуществляются
геофизические исследования поверхностей земли, на основе чего составляются
схематические рисовки исследованных пластов в виде карты местности, элементами
которой являются схематически обозначенные контуры карт, необходимые глубины, и
другие параметры.
В связи, с чем программистами создаются предназначенные для этих целей
программные средства, систематизирующие полученные данные о местности и
представляемые для конечных пользователей в удобном им виде.
Целью курсовой работы являлось разработать приложение в среде Delphi, взаимодействующее с базами данных в
СУБД Oracle, выполняющее визуализацию
картографической информации о местности. В частности, на карте отображаются
типы контуров карты, информация о местности и легенда карты.
В ходе выполнения курсовой работы были решены следующие задачи:
) Проработана структура базы данных для визуализации картографической
информации
) Разработан алгоритм рисовки контуров карты
) Разработан алгоритм отображения отдельных элементов карты
) Разработан алгоритм для задания параметров каждому контуру карты
) Разработан алгоритм сохранения картографической информации в XML-документе
) Разработан алгоритм визуализации картографической информации в MS Visio на языке программирования Visual Basic
) Налажена работа между приложением и СУБД Oracle.
Все задачи, поставленные на курсовое проектирование, выполнены полностью.
Список
использованных источников
1 Архангельский, А.Я. Программирование в Delphi / А.Я.
Архангельский М.: ООО «Бином-Пресс», 2003. - 1152 с.
Сухарев, М.В. Основы Delphi. Профессиональный подход/ М.В.
Сухарев СПб.: Наука и Техника, 2004. - 600 с.
Кенту, М. Delphi 7. Для профессионалов/ М. Кенту СПб.: Питер,
2004. - 1101 с.
Архангельский, А.Я. Работа с локальными базами данных в
Delphi 5/ А.Я. Архангельский М.: ЗАО «Издательство БИНОМ», 2000. - 192 с.
Архангельский, А.Я. Язык SQL в Delphi 5/ А.Я. Архангельский
М.: ЗАО «Издательство БИНОМ», 2000. - 208 с.
Понамарев, В. Базы данных в Delphi 7. Самоучитель/ В.
Понамарев СПб.: Питер, 2003. - 224 с.
Аллен, К. 101: Oracle PL/SQL / К. Ален М.: Издательство
«Лори», 2001. - 369 с.
Луни, К., Брила, Б. 101: Oracle Database 10g Настольная книга
администратора / К. Луни, Б. Брила М.: Издательство «Лори», 2008. - 729 с.
Клайн, К. SQL. Справочник. 2-е издание/ К. Клайн М.:
КУДИЦ-ОБРАЗ, 2006. - 832 с.
Браун, С. Visual Basic 6. Учебный
курс/ С. Браун СПб.: Питер, 2007. - 576 с.
Приложение
А
В приложении А представлен исходный код разработанных функций и процедур
в среде Delphi
procedure TFormMap.FormCreate(Sender:
TObject);:=TMetafile.Create;:=TGranImg.Create;.Date:=Today;:=TListParamTypeLine.Create(True);.ADODataSetMapSlv.Active:=True;.ADODataSetMapSlvm.Active:=True;.ADODataSetWellHdr.Active:=False;:=TStringList.Create;;;TFormMap.FormDestroy(Sender:
TObject);.Free;.Free;.ADODataSetLayerHdr.Active:=False;.ADODataSetMapSlv.Active:=False;.ADODataSetMapSlvm.Active:=False;.ADODataSetWellHdr.Active:=False;.Free;.Free;;TFormMap.DrawLabelToLine(koor
: TKoor; ugol : Integer; str : String; var mc : TMetafileCanvas);:
TLogFont;str<>'0' then(lf, SizeOf(lf), 0);lf do:= 60;:= 30;:= ugol;:=
0;;.Font.Handle :=
CreateFontIndirect(lf);.Font.Color:=clBlack;.TextOut(koor.x,koor.y,str);;;TFormMap.AllShpToTextFile;:
Integer;i:=0 to ListParamTypeLine.Count-1 do(i);;TFormMap.ShpToTextFile(i :
Integer);: IShapefile;: IShape;: MapWinGis_TLB.ITable;: ICallBack;,strY,
filename, znLine, filedbf : String;,m,q, numShapes : Integer;,koorY : Double;:
TextFile;:
Integer;:=CoShapefile.Create;:=MapWinGis_TLB.CoTable.Create;:=ListParamTypeLine.GetTypeLine(i);:=ListParamTypeLine.GetFullName(i);:=ChangeFileExt(filename,'.dbf');typeLine
of
,1..16:((typeLine=16) and (bSkv=True)) or
(typeLine<>16) thennot pShapefile.Open(filename,cb) then(0,PChar('Не удалось открыть
файл '+filename), 'Внимание',MB_OK or MB_ICONHAND)not
pTable.Open(filename,cb) then(0,PChar('Не удалось открыть файл '+filedbf), 'Внимание',MB_OK or
MB_ICONHAND):=pShapefile.NumShapes;:=ListParamTypeLine.GetFileName(i);:=DirTempFolder+filename;(f,filename);(f);(f,'FFASCI
0 1 "LINES" 0 1e+10');(f,'FFATTR 0 1');j:=0 To numShapes-1 do:=pShapefile.Shape[j];(f,'->'+IntToStr(j+1));:=pTable.CellValue[0,j];q:=0
to pShape.numPoints-1
do:=pShape.Point[q].x;:=pShape.Point[q].y;:=FloatToStr(koorX);m:=StrLen(PChar(StrX))
to 11 do:=StrX+' ';:=FloatToStr(koorY);m:=StrLen(PChar(StrY)) to 11 do:=StrY+'
';(f,StrX,StrY,znLine);;;(f);;.Close;;;;;TFormMap.FileToHex(fname : String) :
String;: TFileStream;,col_byte : Integer;: String;: array [1..100] of Char;:
array [1..200] of Char;not FileExists(fname) then('Ошибка открытия файла '+ fname);:='';:=TFileStream.Create(fname,fmOpenRead);:='';:=0;_byte:=100;total<fStream.Size
dofStream.Size-col_byte-total<0
then_byte:=fStream.Size-total;.Read(Buf,col_byte);(@Buf,@Buf2,col_byte);:=s+Copy(Buf2,1,col_byte*2);:=total+col_byte;;.Free;:=s;;;TFormMap.LoadWmfToScr(filename
: String);: Double;: TMetafile;: TMetafileCanvas;:
TRect;:=TMetafile.Create;.LoadFromFile(filename);.Width:=abs(mf.Width);:=mf.Width/mf.Height;:=Rect(0,0,ImageWmf.Width,Round(ImageWmf.Width/k1));.Width:=ImageWmf.Width;.Height:=Round(ImageWmf.Width/k1);:=TMetafileCanvas.Create(mfOrig,0);.StretchDraw(RectM,mf);.Free;.Free;.Height:=mfOrig.Height;.Picture.Metafile:=mfOrig;;TFormMap.LoadShp(filename
: String; kodmest : Integer; InnerCall : Boolean = False) :
String;:=ExtractFileExt(filename);.Caption:='Загрузка карты';_mest:=kodmest;:=taInsert;_step:=1;:=ExtractFilePath(filename);fileext='.apr'
then(filename);;;;:=DirTempFolder+LEMapName.Text+'.wmf';not InnerCall
then;;;;;;;;.DataSet.RecNo:=ListParamTypeLine.GetTypeLine(0);not InnerCall
then;:=StrXml;;TFormMap.FileSaveAs(oldName,newName : String);, fstream2 :
TFileStream;:=TFileStream.Create(oldName,fmOpenRead);:=TFileStream.Create(newName,fmCreate);.CopyFrom(fstream1,fstream1.Size);.Free;.Free;;TFormMap.ClearDataPanel;:
TGuid;(iGuid);:=DirTempFolder+GUIDToString(iGuid)+'\';(DirTempFolder);.Date:=Today;DataModuleMap.DataSourceLayerHdr.DataSet.Active
then.DataSourceLayerHdr.DataSet.First;.Visible:=False;.Visible:=False;.Enabled:=True;.Enabled:=True;.Position:=5;.Position:=5;;;TFormMap.TBLoadClick(Sender:
TObject);OpenDialogApr.Execute
then;(OpenDialogApr.FileName,0,True);;;TFormMap.CheckOutputData : Boolean;:
Boolean;:=True;(Trim(LEMapName.Text)='') or
(Trim(LEAvtor.Text)=''):=False;:=bCheck;;TFormMap.TBSaveClick(Sender:
TObject);not CheckOutputData then(0,'Данные
не корректны!','Внимание',MB_OK or
MB_ICONSTOP);;(nameWmf);(nameWmf);;;;TFormMap.GenerateIdm : String;: TGuid;:
String;,i : Integer;(idm);:=GUIDToString(idm);:=Copy(strGuid,2,36);i:=0 to 3
do:=Pos('-',strGuid);:=Copy(strGuid,1,pos1-1)+Copy(strGuid,pos1+1,StrLen(PChar(strGuid))-pos1);;:=strGuid;;TFormMap.BSmallImgClick(Sender:
TObject);: Double;_step:=cur_step-step;not WmfZoom
then_step:=cur_step+step:=cur_step/(cur_step+step);(k);(k);;;TFormMap.BBigImgClick(Sender:
TObject);: Double;_step:=cur_step+step;not WmfZoom
then_step:=cur_step-step:=cur_step/(cur_step-step);(k);(k);;;TFormMap.AddNameMapToWmf(var
mfc : TMetafileCanvas; mfWidth, mfHeight : Integer);, maxStr : string;,x_new,
y_new, maxSymbol, k, totalHeight, delX : Integer;: TLogFont;:
TLabel;_new:=Round(mfWidth*(PanelLabel.Left/PanelImg.Width));_new:=Round(mfHeight*(PanelLabel.Top/PanelImg.Height));:=0;i:=0
to ListLabelMap.Count-1
do:=TLabelMap(ListLabelMap.Items[i]).Caption;:=StrLen(PChar(s));maxSymbol<k
then:=k;:=s;;;:=0;:=TLabel.Create(nil);:=Round(mfWidth*PanelLabel.Width*0.5/PanelImg.Width);i:=0
to ListLabelMap.Count-1
do.Font.Assign(TLabelMap(ListLabelMap.Items[i]).Font);.Caption:='H';.AutoSize:=True;lf
do:= Round(mfWidth*(labeltmp.Width/PanelImg.Width));:=
Round(mfHeight*(labeltmp.Height/PanelImg.Height));;.Font.Handle :=
CreateFontIndirect(lf);TLabelMap(ListLabelMap.Items[i]).TypeLabel of, tlMap,
tlZaleg : mfc.Font.Style:=[fsBold];:
mfc.Font.Style:=mfc.Font.Style-[fsBold]-[fsItalic];;.TextOut(Round(x_new+delX-mfc.TextWidth(TLabelMap(ListLabelMap.Items[i]).Caption)/2),_new+totalHeight,(ListLabelMap.Items[i]).Caption);:=totalHeight+mfc.TextHeight('H');;.Free;.Free;;TFormMap.SetListStr(var
ListNameMap : TObjectList; s : string; TypeLabel :
TTypeLabel);_total,len,pos1,num_str : integer;,str : string;_total:=0;:=StrLen(PChar(s));:=1;(num_total<=len-1)
and (pos1>0) do_str:=0;:='';:=Pos(' ',
s);:=Copy(s,1,pos1);:=str+s1;:=Copy(s,pos1+1,StrLen(PChar(s))-pos1);_str:=num_str+StrLen(PChar(s1));pos1=0
then:=str+s;(num_str>maxSymb) or (pos1=0);_total:=num_total+StrLen(PChar(str));.Add(TLabelMap.Create(nil));(ListLabelMap.Last).Caption:=str;(ListLabelMap.Last).TypeLabel:=TypeLabel;;;TFormMap.WmfZoom
: Boolean;: TMetafile;: TMetafileCanvas;:
TRect;:=TMetafile.Create;(cur_step>=1) and (cur_step<=6*step) then.Width:=Round(mfOrig.Width*cur_step);.Height:=Round(mfOrig.Height*cur_step);:=Rect(0,0,mfCur.Width,mfCur.Height);:=TMetafileCanvas.Create(mfCur,0);.StretchDraw(RectM,mfOrig);.Free;.Width:=mfCur.Width;.Height:=mfCur.Height;.Picture.Metafile:=mfCur;:=True;:=False;.Free;;TFormMap.DefineUgol(ListKoor
: TObjectList; str : string;koor : TKoor; numstart : integer;ugol :
Double);,widthStr,heightStr,rastPred,rast1,rast2 :
Double;,y,delX,delY,numBest,k,num1,num2 : integer;: TMetafile;:
TMetafileCanvas;: TLogFont;:=TMetafile.Create; //определение ширины метки
mfc:=TMetafileCanvas.Create(mf,0);(lf, SizeOf(lf), 0);lf do:=
60;:= 30;:= 0;;.Font.Handle :=
CreateFontIndirect(lf);:=mfc.TextWidth(str);:=mfc.TextHeight(str);.Free;.Free;:=numStart;:=0;:=0;(rast<widthStr)
and (k<ListKoor.Count-1)
do(k);:=rast;:=TKoor(ListKoor.Items[k]).X;:=TKoor(ListKoor.Items[k]).Y;:=sqrt(sqr(koor.x-x)+sqr(koor.y-y));;(rast-widthStr)>(widthStr-rastPred)
then:=rastPred;:=k-1;:=rast;:=k;;:=numStart;:=0;(rast<widthStr) and (k>0)
do(k);:=rast;:=TKoor(ListKoor.Items[k]).x;:=TKoor(ListKoor.Items[k]).y;:=sqrt(sqr(koor.x-x)+sqr(koor.y-y));;(rast-widthStr)>(widthStr-rastPred)
then:=rastPred;:=k+1;:=rast;:=k;;abs(rast1-widthStr)>abs(rast2-widthStr)
then:=num2:=num1;:=TKoor(ListKoor.Items[numBest]).x;:=TKoor(ListKoor.Items[numBest]).y;x-koor.x<>0
then:=ArcTan((koor.y-y)/(x-koor.x)):=0;:=Round(heightStr/2*cos(ugol));:=Round(heightStr/2*sin(ugol));x>koor.x
Then.x := koor.x - delX;.y := koor.y - delY;.x := x - delX;.y := y -
delY;;:=ugol*180/Pi;;TFormMap.DrawElem(pShape : IShape;, endShp,typeLine :
Integer;mc : TMetafileCanvas;: String);,predX, predY,x,y,j: integer;:
TObjectList;: TKoor;:
Double;:=TObjectList.Create(True);:=Round(pShape.Point[startShp].x-GranImg.left);:=Round(GranImg.bottom-pShape.Point[startShp].y);.Add(TKoor.Create(predX,predY));j:=startShp+1
to endShp-1 do:= Round(pShape.Point[j].x-GranImg.left);:=
Round(GranImg.bottom-pShape.Point[j].y);.Add(TKoor.Create(x,y));.DrawShape(mc,x,y,predX,predY);:=x;:=y;;typeLine=5
then:=Round((endShp-startShp)/2)-1;numstart=0 then:=1;:=TKoor.Create(
TKoor(ListKoor.Items[numstart]).x,(ListKoor.Items[numstart]).y);(ListKoor,znLine,koor,numstart,ugol);(koor,Round(ugol*10),znLine,mc);.Free;;.Free;;TFormMap.DrawElemEdit(pShape
: IShape;, endShp,typeLine : Integer;mc : TMetafileCanvas;: String);,predX,
predY,x,y,j: integer;: TObjectList;: TKoor;:
Double;:=TObjectList.Create(True);:=Round(pShape.Point[startShp].x-GranImg.left);:=Round(GranImg.bottom-pShape.Point[startShp].y);.Add(TKoor.Create(predX,predY));j:=startShp+1
to endShp-1 do:= Round(pShape.Point[j].x-GranImg.left);:=
Round(GranImg.bottom-pShape.Point[j].y);.Add(TKoor.Create(x,y));.DrawShapeEdit(mc,x,y,predX,predY);:=x;:=y;;typeLine=5
then:=Round((endShp-startShp)/2)-1;numstart=0 then:=1;:=TKoor.Create(
TKoor(ListKoor.Items[numstart]).x,(ListKoor.Items[numstart]).y);(ListKoor,znLine,koor,numstart,ugol);(koor,Round(ugol*10),znLine,mc);.Free;;.Free;;TFormMap.DrawPanelLabel(k
: Double=1);: integer;, totalHeight : integer;ListLabelMap=nil then
ListLabelMap:=TObjectList.Create(True);.Clear;(ListLabelMap,LEMest.Text,
tlMest);(ListLabelMap,LEZaleg.Text, tlZaleg);(ListLabelMap,LEMapName.Text,
tlMap);.Add(TLabelMap.Create(nil));(ListLabelMap.Last).Caption:='Масштаб
'+EdMashFir.Text+':'+EdMashSec.Text;(ListLabelMap.Last).TypeLabel:=tlMashtab;.Color:=clWhite;.Top:=Round(PanelLabel.Top*k);.Left:=Round(PanelLabel.Left*k);i:=0
to ListLabelMap.Count-1
do(ListLabelMap.Items[i]).Parent:=PanelLabel;(ListLabelMap.Items[i]).Alignment:=taCenter;(ListLabelMap.Items[i]).Left:=0;(ListLabelMap.Items[i]).AutoSize:=True;(ListLabelMap.Items[i]).Visible:=True;(ListLabelMap.Items[i]).Enabled:=False;TLabelMap(ListLabelMap.Items[i]).TypeLabel
of:(ListLabelMap.Items[i]).Font.Size:=Round((18+delSizeLabel)*cur_step);(ListLabelMap.Items[i]).Font.Style:=[fsBold];;:(ListLabelMap.Items[i]).Font.Size:=Round((14+delSizeLabel)*cur_step);(ListLabelMap.Items[i]).Font.Style:=[fsBold];;:(ListLabelMap.Items[i]).Font.Size:=Round((12+delSizeLabel)*cur_step);(ListLabelMap.Items[i]).Font.Style:=[fsBold];;:(ListLabelMap.Items[i]).Font.Size:=Round((12+delSizeLabel)*cur_step);(ListLabelMap.Items[i]).Font.Style:=(ListLabelMap.Items[i]).Font.Style-[fsBold];;;;:=0;:=0;i:=0
to ListLabelMap.Count-1
do(ListLabelMap.Items[i]).Top:=totalHeight;maxWidth<TLabel(ListLabelMap.Items[i]).Width
then:=TLabel(ListLabelMap.Items[i]).Width;:=totalHeight+TLabel(ListLabelMap.Items[i]).Height;;i:=0
to ListLabelMap.Count-1
do(ListLabelMap.Items[i]).Width:=maxWidth;.Width:=maxWidth;.Height:=totalHeight;;TFormMap.PanelLabelMouseDown(Sender:
TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);, delRight, delTop,
delBottom, delX, delY : Integer;;(Sender).Perform(WM_SYSCOMMAND, $F012,
0);:=PanelLabel.Left -
ScrollBoxWmf.HorzScrollBar.Position;:=-(PanelLabel.Left+PanelLabel.Width) +
(ScrollBoxWmf.HorzScrollBar.Position+ScrollBoxWmf.Width);:=PanelLabel.Top-ScrollBoxWmf.VertScrollBar.Position;:=-(PanelLabel.Top+PanelLabel.Height)
+
(ScrollBoxWmf.VertScrollBar.Position+ScrollBoxWmf.Height);:=0;:=0;delLeft<0
then:=delLeftdelRight<0:=-delRight;delTop<0 then:=delTopdelBottom<0:=-delBottom;.HorzScrollBar.Position:=ScrollBoxWmf.HorzScrollBar.Position+delX;.VertScrollBar.Position:=ScrollBoxWmf.VertScrollBar.Position+delY;;TFormMap.EdMashFirKeyPress(Sender:
TObject; var Key: Char);not (Key in ['0'..'9']+[#8]) then:=#0;;TFormMap.DataSourceLayerHdrDataChange(Sender:
TObject;: TField);:
String;.Text:=DataModuleMap.AdoDataSetLayerHdr.FieldByName('DISPLAY_NAME').AsString;not
DataModuleMap.AdoDataSetLayerHdr.IsEmpty
then:=DataModuleMap.AdoDataSetLayerHdr.FieldByName('ID').AsString:='-1';
Приложение
Б
В приложении Б представлен исходный код разработанных функций и процедур
на языке программирования Visual Basic
Public koefX, koefY As DoublemaxX, maxY, minX, minY As
DoublevisNomSkv As Booleanfolder As StringlenText = 4 / 25.4lenCentr = 0.8 /
25.4DrawMap()Dir As StringcollFName As New Collection=
ThisDocument.PathSearchFiles(idm,
collFName)DrawKontur(collFName)SubSearchFiles(ByVal idm As String, Coll As
Collection)i As IntegersFileName As Stringfso As FileSystemObjectfso = New
FileSystemObjecti = 1 To 16= folder + CStr(i)fso.FileExists(sFileName) = True
Then.Add Item:=sFileNameIf= folder +
"lineust"fso.FileExists(sFileName) Then.Add Item:=sFileNameIfSubSub
ReadParamMap()xmlDoc As New MSXML.DOMDocumentiNode As IXMLDOMNode.Load (folder
+ "option.xml")iRoot = xmlDoc.FirstChildiNode =
iRoot.childNodes.Item(FindIndexTag(iRoot, "gran_img"))=
CDbl(iNode.Attributes.getNamedItem("right").nodeValue)=
CDbl(iNode.Attributes.getNamedItem("left").nodeValue)=
CDbl(iNode.Attributes.getNamedItem("top").nodeValue)=
CDbl(iNode.Attributes.getNamedItem("bottom").nodeValue)iNode =
iRoot.childNodes.Item(FindIndexTag(iRoot, "nom_skv"))=
CBool(iNode.Attributes.getNamedItem("visible").nodeValue)= (maxX -
minX) / 190= (maxY - minY) / 260koefX < koefY Then= koefY=
koefXIfSubDrawKontur(Coll As Collection)shapeObj As ShapeshapeCell As CelltipL,
pos, k, pointStart, k1, NumPoint As Integerrast, koorX, koorY, predX, predY As
DoubleznLine, Str As StringoGnk As New GnkoGnkVn As New GnkVnoGran As New
GranoIzoPunkt As New IzolPunktoVnk As New VnkoVnkVn As New VnkVnoZam As New
ZamoKoor As New KooroSkv As New SkvoHeadMap As New HeadMapoLegendMap As New
LegendMapCollKoor As New CollectionshapeGroupLine, shapeGroup As
ShapeshapeSelection, shapeLine, shapeText As
Selection.DeselectAllshapeSelection = ActiveWindow.SelectionshapeLine =
ActiveWindow.SelectionshapeText = ActiveWindow.Selectioni = 1 To
Coll.CountColl.Item(i) = folder + "lineust" Then= 20=
Split(Coll.Item(i), "\")= a(UBound(a))IfColl.Item(i) For Input As
#1While InStr(Str, "->") = 0#1, StrWhile Not EOF(1)= True= 0#1,
Str= InStr(Str, " ")= ConvertX(CDbl(Left(Str, pos - 1)))=
Trim(Right(Str, Len(Str) - pos))= InStr(Str, " ")pos = 0 Then=
Len(Str) + 1If= ConvertY(CDbl(Left(Str, pos - 1)))= InStr(Str, " ")=
Trim(Right(Str, Len(Str) - pos))tipL = 5 ThenCollKoor = NothingoKoor =
Nothing.x = koorX.y = koorY.Add Item:=oKoorIf= koorX= koorYCase
tipL2.Init4.Init6.Init9.Init10, 12.Init11, 13.Init14.Init16Not EOF(1) Then#1,
StrIfvisNomSkv ThenoSkv.DrawSkv(shapeLine, shapeText, koorX, koorY,
znLine)oSkv.DrawSkv(shapeLine, shapeText, koorX, koorY,
"")IfSelecttipL <> 16 Then#1, Str= tipL= 1While b = True And
InStr(Str, "->") = 0EOF(1) Then= FalseIf= InStr(Str, "
")= ConvertX(CDbl(Left(Str, pos - 1)))= Trim(Right(Str, Len(Str) - pos))=
InStr(Str, " ")pos = 0 Then= Len(Str) + 1If= ConvertY(CDbl(Left(Str,
pos - 1)))znLine <> "" And tipL = 5 ThenoKoor = Nothing.x =
koorX.y = koorY.Add Item:=oKoorIfCase tipL3, 5, 8, 7, 20DrawObiknLine(shapeLine,
koorX, koorY, predX, predY, k1)2oVnk.DrawFigure(shapeLine, koorX, koorY, predX,
predY)4oGran.DrawLine(shapeLine, koorX, koorY, predX,
predY)6oZam.DrawLine(shapeLine, koorX, koorY, predX,
predY)9oVnkVn.DrawFigure(shapeLine, koorX, koorY, predX, predY)10,
12oGnk.DrawFigure(shapeLine, koorX, koorY, predX, predY)11,
13oGnkVn.DrawFigure(shapeLine, koorX, koorY, predX,
predY)14oIzoPunkt.DrawFigure(shapeLine, koorX, koorY, predX, predY)Select=
koorX= koorYb = True Then#1, Str= NumPoint + 1IfshapeLine.Count > 0
ThenshapeGroupLine = shapeLine.Group.Select shapeGroupLine,
visSelect.DeselectAllIfznLine <> "" And tipL = 5
ThenDrawText(shapeText, CollKoor, NumPoint, znLine)IfIftipL = 5
ThenshapeGroupLine = shapeSelection.Group.Name =
"Линии".DeselectAll.Select shapeGroupLine, visSelectshapeGroupLine =
shapeText.Group.Name = "Глубины изолиний".Select shapeGroupLine,
visSelect.DeselectAll.DeselectAllIftipL = 16 ThenshapeGroupLine =
shapeLine.Group.Name = "Пиктограммы".DeselectAll.Select
shapeGroupLine, visSelectshapeText.Count <> 0 ThenshapeGroupLine =
shapeText.Group.Name = "Номера скважин".Select shapeGroupLine,
visSelect.DeselectAllIf.DeselectAllIfshapeSelection.Count > 0
ThenshapeSelection.Count = 1 ThenshapeGroup =
shapeSelection.Item(1).DeselectAllshapeGroup = shapeSelection.Group.DeselectAllIfIfCase
tipL6.Name = "Замещения"5.Name = "Изолинии"2.Name =
"ВНК"3.Name = "Разлом"4.Name = "Линия
выклинивания"7.Name = "Гран лиц участков" 8
shapeGroup.Name = "Границы категорий
запасов"
Case 9.Name = "ВНК внутр"10.Name =
"ГВК"11.Name = "ГВК внутр"12.Name = "ГНК"13.Name
= "ГНК внутр"14.Name = "Изолинии пунктир"16.Name =
"Скважины"20.Name = "Линии
устья"Select#1.DrawHead.DrawLegendColl = NothingCollKoor =
NothingSubFunction ConvertX(ByVal koorX As Double) As Double= (koorX - minX) /
koefX / 25.4FunctionFunction ConvertY(ByVal koorY As Double) As Double= (koorY
- minY) / koefY / 25.4FunctionDrawObiknLine(ByVal shapeLine As Selection, ByVal
koorX, koorY, predX, predY As Double, ByVal tipL As Integer)shapeObj As
ShapeshapeCell As CellshapeObj = ActivePage.DrawLine(predX, predY, koorX,
koorY)Case tipL7, 8shapeCell = shapeObj.Cells("LineColor").Formula =
"RGB(0,255,0)"3shapeCell =
shapeObj.Cells("LineColor").Formula =
"RGB(255,0,0)"20shapeCell = shapeObj.Cells("LineColor").Formula
= "RGB(0,0,255)"Select.Select shapeObj, visSelectSubDrawText(ByVal
shapeText As Selection, ByVal CollKoor As Collection, ByVal NumPoint As
Integer, ByVal znLine As String)predX, predY, koorX, koorY As Doublerast,
rastPred, tmp, delX, delY, koef As DoubleshapeObj As Shapek1 As IntegerNumPoint
= 2 Then= CollKoor.Item(1).x= CollKoor.Item(1).y= CollKoor.Item(2).x=
CollKoor.Item(2).y= 2shapeObj = ActivePage.DrawLine(predX, predY, koorX +
lenText, koorY).Select shapeObj, visSelect= CollKoor.Item(Round(NumPoint / 2) -
1).x= CollKoor.Item(Round(NumPoint / 2) - 1).y= CollKoor.Item(Round(NumPoint /
2)).x= CollKoor.Item(Round(NumPoint / 2)).y= Round(NumPoint / 2)= pointStart=
Sqr((koorX - predX) * (koorX - predX) + (koorY - predY) * (koorY - predY))While
rast < (lenText) And pointStart < CollKoor.Count= pointStart + 1=
CollKoor.Item(pointStart).x= CollKoor.Item(pointStart).y= Sqr((koorX - predX) *
(koorX - predX) + (koorY - predY) * (koorY - predY))koorX < predX Then=
koorX= predX= tmp= koorY= predY= tmpIfDefineDelXY(predX, predY, koorX, koorY)rast
< lenText Then= lenText / rast= (predY - koorY) * koef= (koorX - predX) *
koefshapeObj = ActivePage.DrawLine(predX, predY, predX + delX, predY -
delY).Text = znLine.LineStyle = "Text Only".TextStyle =
"MapZnLine"shapeObj = ActivePage.DrawLine(predX, predY, koorX,
koorY).Text = znLine.LineStyle = "Text Only".TextStyle =
"MapZnLine"If.Select shapeObj, visSelectIfSubDefineDelXY(predX,
predY, koorX, koorY As Double)ugol, delX, delY, k As Double= (koorY - predY) /
(predX - koorX)k <> 0 Then= Atn(-1 / k)= Pi / 2If= Sin(ugol) * lenCentr=
Cos(ugol) * lenCentrpredY > koorY Then= predX + delX= predY - delY= koorX +
delX= koorY - delY= predX - delX= predY + delY= koorX - delX= koorY +
delYIfSubFindIndexTag(ByVal iNode As IXMLDOMNode, Name As String) As Integeri
As Integerz As Boolean= 0= Truei < iNode.childNodes.Length And
ziNode.childNodes.Item(i).nodeName = Name Then= FalseIf= i + 1z = True Then=
-1= i - 1IfFunction