Разработка приложения для визуализации картографической информации
Назначение и возможности разработанного приложения для визуализации картографической информации. Хранимые процедуры, функции и триггеры. Взаимодействие пользователя с приложением. Описание экранной формы по работе с картами. Визуализация карты в MS Visio.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.08.2014 |
Размер файла | 2,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
Учреждение образования
«Гомельский государственный университет имени Франциска Скорины»
Математический факультет
Кафедра математических проблем управления
КУРСОВАЯ РАБОТА
Разработка приложения для визуализации картографической информации
Исполнитель:
студент группы ПМ-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, выполняющее визуализацию картографической информации о местности. В частности, на карте отображаются типы контуров карты, информация о местности и легенда карты.
В ходе выполнения курсовой работы были решены следующие задачи:
1) Проработать структура базы данных для визуализации картографической информации
2) Разработать алгоритм рисовки контуров карты
3) Разработать алгоритм отображения отдельных элементов карты
4) Разработать алгоритм для задания параметров каждому контуру карты
5) Разработать алгоритм сохранения картографической информации в XML-документе
6) Разработать алгоритм визуализации картографической информации в MS Visio на языке программирования Visual Basic
7) Наладить работу между приложением и СУБД Oracle.
В описание курсовой работы входят такие главы, как:
1) Назначение и возможности разработанного приложения - содержит описание разработанного приложения для визуализации картографической информации
2) Средства разработки приложения - содержит описание элементов языка PL/SQL
3) Структура баз данных, используемых в приложении - содержит описание используемых таблиц
4) Взаимодействие пользователя с приложением - содержит указания для корректной работы пользователя с приложениями
1. Назначение и возможности разработанного приложения
Разработанное приложение выполнено для осуществления работы с геофизическими данными с последующей их визуализацией.
1.1 Исходные данные
Приложение позволяет создавать и загружать карты местности из цифровых форматов информации о местности.
Формат apr является файлом проекта ArcView. Поддерживается в ArcGis начиная с версии 3.x.
ArcGIS -- семейство программных продуктов американской компании ESRI, одного из лидеров мирового рынка геоинформационных систем. ArcGIS позволяет визуализировать (представить в виде цифровой карты) большие объёмы статистической информации, имеющей географическую привязку. В среде создаются и редактируются карты всех масштабов: от планов земельных участков до карты мира. Также в ArcGIS встроен широкий инструментарий анализа пространственной информации.
Данные содержатся в текстовом формате, поэтому при желании можно его отредактировать в любом текстовом редакторе.
В файле формата apr содержатся перечень слоев, привязки по координатам и множество другой информации.
Каждый слой представляет из себя совокупность нескольких файлов, то есть:
1) Файл с расширением shp. Содержит перечень объектов одного слоя с соответствующими координатами для них. Данные хранятся в бинарном режиме, поэтому редактированию вручную файл не подлежит.
2) Файл с расширением dbf. Формат хранения данных, используемый в качестве одного из стандартных способов хранения и передачи информации системами управления базами данных. Для каждого соответствующего объекта слоя соответствует определенное значение, обозначающее глубину расположения объекта. Имеет возможность редактирования в таких утилитах для таблиц баз как Database Dekstop.
3) Файл с расширением shx. Содержит индексные значения каждого слоя
Для правильного функционирования файлы, соответствующие одному слою, должны иметь одно наименование. Также все файлы должны находиться в том же каталоге, что и apr-файл.
Для корректного отображения карты используются прочитанные из файла формата apr привязки по координатам, так как координаты, прочитанные из файлов формата shp, содержат значения в другой системе координат. приложение визуализация картографический информация
1.2 Возможности приложения
Таким образом приложение осуществляет чтение информации из файлов формата apr, выполняет рисовку карты на экранной форме. Также на карте присутствуют такие элементы как наименование карты и легенда карты, которым можно задавать размеры и осуществлять передвижение их по карте, а также пользователь может решить, отображать ли их вообще.
Имеется возможность отображать скважины, причем существует несколько режимов отображения, то есть либо не отображать вообще, либо комбинировать со следующими режимами:
ѕ Стандартные обозначения скважин
ѕ Цветные пиктограммы каждой из скважин
ѕ Номера скважин рядом пиктограммой скважины
Скважины отображаются таким образом, что если они присутствовали в перечне слоев в файле проекта, то рисуются скважины из этого файла. В противном случае, в зависимости от выбранного пользователем пласта, отображаются скважины, соответствующие этому пласту и выбранному ранее месторождению.
Также для каждого контура имеется возможность задать для них свойство видимости на карте, а также изменить тип линии, цвет линии и ширину.
Имеется возможность сохранять отрисованную карту в формате wmf на диск.
Все временные файлы, создаваемые в процессе приложения хранятся во временной директории каталога Windows.
В связи с тем, что файлы формата wmf предназначены в основном для просмотра на компьютере, а при распечатке изображение дает неточности, то была реализована такая возможность, как прорисовка карты в MS Visio.
2. Средства разработки приложения
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,
sal IN OUT NUMBER,
tax 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,
value_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>>
DECLARE
Метки блоков облегчают чтение кода. В процедуре, содержащей вложенные блоки (блоки внутри других блоков), можно ссылаться на элемент определенного блока, предваряя имя элемента именем блока (например, метка_блока.метка_элемента).
2.2.2 Секция объявлений
Секция объявлений не является обязательной. В случае использования она начинается после секции заголовка и оканчивается перед ключевым, словом BEGIN. Эта секция содержит объявления переменных, констант, курсоров, исключений, функций и процедур PL/SQL, которые будут использоваться в выполняемой секции и секции исключений. Все объявления переменных и констант должны размещаться до объявлений функций или процедур. Объявление сообщает PL/SQL о том, что нужно создать переменную, констан ту, курсор, функцию или процедуру согласно приведенной спецификации.
Когда выполнение базового блока завершается, все элементы, объявленные в секции объявлений, перестают существовать. Элементы, объявленные в секции объявлений базового блока, могут использоваться только в пределах этого блока.
2.2.3 Выполняемая секция
Выполняемая секция начинается с ключевого слова BEGIN и заканчивается либо ключевым словом EXCEPTION, если присутствует секция исключений, либо ключевым словом END, за которым следуют необязательное имя функции или процедуры и точкас запятой. Выполняемая секция содержит один и более PL/SQL-операторов, выполняемых при передаче управления данному блоку. Структура выполняемой секции показана ниже.
BEGIN
один и более PL/'SQL-операторов
[секция исключений]
END [имя функции или процедуры];
В выполняемом коде PL/SQL чаще всего встречается оператор присваивания (:=). Он указывает, что нужно вычислить выражение справа и поместить результат в переменную слева.
2.2.4 Секция исключений
В ходе выполнения PL/SQL-оператора может возникнуть ошибка, которая сделает невозможным дальнейшее выполнение программы. Такие исключительные ситуации называются исключениями (exceptions). Пользователь, вызвавший процедуру, должен быть проинформирован о возникновении исключения, а также о причинах, его вызвавших. Вы можете выдать пользователю содержательное сообщение об ошибке, или предпринять некоторые корректирующие действия и повторить операцию, выполнявшуюся до возникновения ошибки. Вы также можете откатить изменения, которые были произведены в базе данных к этому моменту.
PL/SQL помогает вам во всех этих случаях, предоставляя средства обработки исключений (exception handling). В хорошо написанных приложениях исключения столь важны, что им посвящен специальный раздел в конце этой главы, где о них рассказано более подробно. А здесь, в качестве введения, рассмотрим структуру секции исключений.
EXCEPTION
WHEN имя_исключения
THEN
действия, предпринимаемые при возникновении исключения
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-координата дополнительной точки «привязки» карты |
|
XX_RL_I |
Нет |
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, выполняющее визуализацию картографической информации о местности. В частности, на карте отображаются типы контуров карты, информация о местности и легенда карты.
В ходе выполнения курсовой работы были решены следующие задачи:
1) Проработана структура базы данных для визуализации картографической информации
2) Разработан алгоритм рисовки контуров карты
3) Разработан алгоритм отображения отдельных элементов карты
4) Разработан алгоритм для задания параметров каждому контуру карты
5) Разработан алгоритм сохранения картографической информации в XML-документе
6) Разработан алгоритм визуализации картографической информации в MS Visio на языке программирования Visual Basic
7) Налажена работа между приложением и СУБД Oracle.
Все задачи, поставленные на курсовое проектирование, выполнены полностью.
Список использованных источников
1 Архангельский, А.Я. Программирование в Delphi / А.Я. Архангельский М.: ООО «Бином-Пресс», 2003. - 1152 с.
2 Сухарев, М.В. Основы Delphi. Профессиональный подход/ М.В. Сухарев СПб.: Наука и Техника, 2004. - 600 с.
3 Кенту, М. Delphi 7. Для профессионалов/ М. Кенту СПб.: Питер, 2004. - 1101 с.
4 Архангельский, А.Я. Работа с локальными базами данных в Delphi 5/ А.Я. Архангельский М.: ЗАО «Издательство БИНОМ», 2000. - 192 с.
5 Архангельский, А.Я. Язык SQL в Delphi 5/ А.Я. Архангельский М.: ЗАО «Издательство БИНОМ», 2000. - 208 с.
6 Понамарев, В. Базы данных в Delphi 7. Самоучитель/ В. Понамарев СПб.: Питер, 2003. - 224 с.
7 Аллен, К. 101: Oracle PL/SQL / К. Ален М.: Издательство «Лори», 2001. - 369 с.
8 Луни, К., Брила, Б. 101: Oracle Database 10g Настольная книга администратора / К. Луни, Б. Брила М.: Издательство «Лори», 2008. - 729 с.
9 Клайн, К. SQL. Справочник. 2-е издание/ К. Клайн М.: КУДИЦ-ОБРАЗ, 2006. - 832 с.
10 Браун, С. Visual Basic 6. Учебный курс/ С. Браун СПб.: Питер, 2007. - 576 с.
Приложение А
В приложении А представлен исходный код разработанных функций и процедур в среде Delphi
procedure TFormMap.FormCreate(Sender: TObject);
begin
mfOrig:=TMetafile.Create;
GranImg:=TGranImg.Create;
DateTimeLoad.Date:=Today;
ListParamTypeLine:=TListParamTypeLine.Create(True);
DataModuleMap.ADODataSetMapSlv.Active:=True;
DataModuleMap.ADODataSetMapSlvm.Active:=True;
DataModuleMap.ADODataSetWellHdr.Active:=False;
ListNomSkv:=TStringList.Create;
ClearDataPanel;
end;
procedure TFormMap.FormDestroy(Sender: TObject);
begin
mfOrig.Free;
GranImg.Free;
DataModuleMap.ADODataSetLayerHdr.Active:=False;
DataModuleMap.ADODataSetMapSlv.Active:=False;
DataModuleMap.ADODataSetMapSlvm.Active:=False;
DataModuleMap.ADODataSetWellHdr.Active:=False;
ListParamTypeLine.Free;
ListNomSkv.Free;
end;
procedure TFormMap.DrawLabelToLine(koor : TKoor; ugol : Integer; str : String; var mc : TMetafileCanvas);
var
lf : TLogFont;
begin
if str<>'0' then
begin
FillChar(lf, SizeOf(lf), 0);
with lf do
begin
lfHeight := 60;
lfWidth := 30;
lfEscapement := ugol;
lfWeight := 0;
end;
mc.Font.Handle := CreateFontIndirect(lf);
mc.Font.Color:=clBlack;
mc.TextOut(koor.x,koor.y,str);
end;
end;
procedure TFormMap.AllShpToTextFile;
var
i : Integer;
begin
for i:=0 to ListParamTypeLine.Count-1 do
ShpToTextFile(i);
end;
procedure TFormMap.ShpToTextFile(i : Integer);
var
pShapefile : IShapefile;
pShape : IShape;
pTable : MapWinGis_TLB.ITable;
cb : ICallBack;
strX,strY, filename, znLine, filedbf : String;
j,m,q, numShapes : Integer;
koorX,koorY : Double;
f : TextFile;
typeLine : Integer;
begin
pShapefile:=CoShapefile.Create;
pTable:=MapWinGis_TLB.CoTable.Create;
typeLine:=ListParamTypeLine.GetTypeLine(i);
filename:=ListParamTypeLine.GetFullName(i);
filedbf:=ChangeFileExt(filename,'.dbf');
case typeLine of
-1,1..16:
begin
if ((typeLine=16) and (bSkv=True)) or (typeLine<>16) then
begin
if not pShapefile.Open(filename,cb) then
MessageBox(0,PChar('Не удалось открыть файл '+filename), 'Внимание',MB_OK or MB_ICONHAND)
else
if not pTable.Open(filename,cb) then
MessageBox(0,PChar('Не удалось открыть файл '+filedbf), 'Внимание',MB_OK or MB_ICONHAND)
else
begin
numShapes:=pShapefile.NumShapes;
filename:=ListParamTypeLine.GetFileName(i);
filename:=DirTempFolder+filename;
AssignFile(f,filename);
ReWrite(f);
Writeln(f,'FFASCI 0 1 "LINES" 0 1e+10');
Writeln(f,'FFATTR 0 1');
for j:=0 To numShapes-1 do
begin
pShape:=pShapefile.Shape[j];
Writeln(f,'->'+IntToStr(j+1));
znLine:=pTable.CellValue[0,j];
for q:=0 to pShape.numPoints-1 do
begin
koorX:=pShape.Point[q].x;
koorY:=pShape.Point[q].y;
StrX:=FloatToStr(koorX);
for m:=StrLen(PChar(StrX)) to 11 do
StrX:=StrX+' ';
StrY:=FloatToStr(koorY);
for m:=StrLen(PChar(StrY)) to 11 do
StrY:=StrY+' ';
Writeln(f,StrX,StrY,znLine);
end;
end;
CloseFile(f);
end;
pShapefile.Close;
end;
end;
end;
end;
function TFormMap.FileToHex(fname : String) : String;
var
fStream : TFileStream;
total,col_byte : Integer;
s : String;
Buf : array [1..100] of Char;
Buf2 : array [1..200] of Char;
begin
if not FileExists(fname) then
begin
ShowMessage('Ошибка открытия файла '+ fname);
Result:='';
end
else
begin
fStream:=TFileStream.Create(fname,fmOpenRead);
s:='';
total:=0;
col_byte:=100;
while total<fStream.Size do
begin
if fStream.Size-col_byte-total<0 then
col_byte:=fStream.Size-total;
fStream.Read(Buf,col_byte);
BinToHex(@Buf,@Buf2,col_byte);
s:=s+Copy(Buf2,1,col_byte*2);
total:=total+col_byte;
end;
fStream.Free;
Result:=s;
end;
end;
procedure TFormMap.LoadWmfToScr(filename : String);
var
k1 : Double;
mf : TMetafile;
mfc : TMetafileCanvas;
RectM : TRect;
begin
mf:=TMetafile.Create;
mf.LoadFromFile(filename);
mf.Width:=abs(mf.Width);
k1:=mf.Width/mf.Height;
RectM:=Rect(0,0,ImageWmf.Width,Round(ImageWmf.Width/k1));
mfOrig.Width:=ImageWmf.Width;
mfOrig.Height:=Round(ImageWmf.Width/k1);
mfc:=TMetafileCanvas.Create(mfOrig,0);
mfc.StretchDraw(RectM,mf);
mfc.Free;
mf.Free;
PanelImg.Height:=mfOrig.Height;
ImageWmf.Picture.Metafile:=mfOrig;
end;
function TFormMap.LoadShp(filename : String; kodmest : Integer; InnerCall : Boolean = False) : String;
begin
fileext:=ExtractFileExt(filename);
Self.Caption:='Загрузка карты';
kod_mest:=kodmest;
TypeAction:=taInsert;
cur_step:=1;
folder:=ExtractFilePath(filename);
if fileext='.apr' then
begin
GetInfoFromApr(filename);
GetInfoFromReadme;
end;
AddPanelToListTypeLine;
namewmf:=DirTempFolder+LEMapName.Text+'.wmf';
if not InnerCall then
StartDBParam;
StartTypeLine;
ParamPanelLabel;
ParamPanelLegend;
ReDrawAll;
ParamPanelLegend;
AllShpToTextFile;
FillTreeKont;
DataSourceMapSlv.DataSet.RecNo:=ListParamTypeLine.GetTypeLine(0);
if not InnerCall then
ShowModal;
Result:=StrXml;
end;
procedure TFormMap.FileSaveAs(oldName,newName : String);
var
fstream1, fstream2 : TFileStream;
begin
fstream1:=TFileStream.Create(oldName,fmOpenRead);
fstream2:=TFileStream.Create(newName,fmCreate);
fstream2.CopyFrom(fstream1,fstream1.Size);
fstream1.Free;
fstream2.Free;
end;
procedure TFormMap.ClearDataPanel;
var
iGuid : TGuid;
begin
CreateGuid(iGuid);
DirTempFolder:=DirTempFolder+GUIDToString(iGuid)+'\';
CreateDir(DirTempFolder);
DateTimeLoad.Date:=Today;
if DataModuleMap.DataSourceLayerHdr.DataSet.Active then
DataModuleMap.DataSourceLayerHdr.DataSet.First;
PanelLabel.Visible:=False;
PanelLegend.Visible:=False;
BBigImg.Enabled:=True;
BSmallImg.Enabled:=True;
TrackBarLabel.Position:=5;
TrackBarLegend.Position:=5;
FillComboBox;
end;
procedure TFormMap.TBLoadClick(Sender: TObject);
begin
if OpenDialogApr.Execute then
begin
ClearDataPanel;
LoadShp(OpenDialogApr.FileName,0,True);
end;
end;
function TFormMap.CheckOutputData : Boolean;
var
bCheck : Boolean;
begin
bCheck:=True;
If (Trim(LEMapName.Text)='') or
(Trim(LEAvtor.Text)='')
then
bCheck:=False;
Result:=bCheck;
end;
procedure TFormMap.TBSaveClick(Sender: TObject);
begin
if not CheckOutputData then
MessageBox(0,'Данные не корректны!','Внимание',MB_OK or MB_ICONSTOP)
else
begin
ReDrawAll;
PanelToTextFile;
AddAllParamToWmf(nameWmf);
MapToXml(nameWmf);
Close;
end;
end;
function TFormMap.GenerateIdm : String;
var
idm : TGuid;
strGuid : String;
pos1,i : Integer;
begin
CreateGuid(idm);
strGuid:=GUIDToString(idm);
strGuid:=Copy(strGuid,2,36);
for i:=0 to 3 do
begin
pos1:=Pos('-',strGuid);
strGuid:=Copy(strGuid,1,pos1-1)+Copy(strGuid,pos1+1,StrLen(PChar(strGuid))-pos1);
end;
Result:=strGuid;
end;
procedure TFormMap.BSmallImgClick(Sender: TObject);
var
k : Double;
begin
cur_step:=cur_step-step;
if not WmfZoom then
cur_step:=cur_step+step
else
begin
k:=cur_step/(cur_step+step);
DrawPanelLabel(k);
DrawPanelLegend(k);
end;
end;
procedure TFormMap.BBigImgClick(Sender: TObject);
var
k : Double;
begin
cur_step:=cur_step+step;
if not WmfZoom then
cur_step:=cur_step-step
else
begin
k:=cur_step/(cur_step-step);
DrawPanelLabel(k);
DrawPanelLegend(k);
end;
end;
procedure TFormMap.AddNameMapToWmf(var mfc : TMetafileCanvas; mfWidth, mfHeight : Integer);
var
s, maxStr : string;
i,x_new, y_new, maxSymbol, k, totalHeight, delX : Integer;
lf : TLogFont;
labeltmp : TLabel;
begin
x_new:=Round(mfWidth*(PanelLabel.Left/PanelImg.Width));
y_new:=Round(mfHeight*(PanelLabel.Top/PanelImg.Height));
maxSymbol:=0;
for i:=0 to ListLabelMap.Count-1 do
begin
s:=TLabelMap(ListLabelMap.Items[i]).Caption;
k:=StrLen(PChar(s));
if maxSymbol<k then
begin
maxSymbol:=k;
maxStr:=s;
end;
end;
totalHeight:=0;
labeltmp:=TLabel.Create(nil);
delX:=Round(mfWidth*PanelLabel.Width*0.5/PanelImg.Width);
for i:=0 to ListLabelMap.Count-1 do
begin
labeltmp.Font.Assign(TLabelMap(ListLabelMap.Items[i]).Font);
labeltmp.Caption:='H';
labeltmp.AutoSize:=True;
with lf do
begin
lfWidth := Round(mfWidth*(labeltmp.Width/PanelImg.Width));
lfHeight := Round(mfHeight*(labeltmp.Height/PanelImg.Height));
end;
mfc.Font.Handle := CreateFontIndirect(lf);
case TLabelMap(ListLabelMap.Items[i]).TypeLabel of
tlMest, tlMap, tlZaleg : mfc.Font.Style:=[fsBold];
tlMashtab : mfc.Font.Style:=mfc.Font.Style-[fsBold]-[fsItalic];
end;
mfc.TextOut(Round(x_new+delX-mfc.TextWidth(TLabelMap(ListLabelMap.Items[i]).Caption)/2),
y_new+totalHeight,
TLabelMap(ListLabelMap.Items[i]).Caption);
totalHeight:=totalHeight+mfc.TextHeight('H');
end;
labeltmp.Free;
ListLabelMap.Free;
end;
procedure TFormMap.SetListStr(var ListNameMap : TObjectList; s : string; TypeLabel : TTypeLabel);
var
num_total,len,pos1,num_str : integer;
s1,str : string;
begin
num_total:=0;
len:=StrLen(PChar(s));
pos1:=1;
while (num_total<=len-1) and (pos1>0) do
begin
num_str:=0;
str:='';
repeat
pos1:=Pos(' ', s);
s1:=Copy(s,1,pos1);
str:=str+s1;
s:=Copy(s,pos1+1,StrLen(PChar(s))-pos1);
num_str:=num_str+StrLen(PChar(s1));
if pos1=0 then
str:=str+s;
until (num_str>maxSymb) or (pos1=0);
num_total:=num_total+StrLen(PChar(str));
ListLabelMap.Add(TLabelMap.Create(nil));
TLabelMap(ListLabelMap.Last).Caption:=str;
TLabelMap(ListLabelMap.Last).TypeLabel:=TypeLabel;
end;
end;
function TFormMap.WmfZoom : Boolean;
var
mfCur : TMetafile;
mfc : TMetafileCanvas;
RectM : TRect;
begin
mfCur:=TMetafile.Create;
if (cur_step>=1) and (cur_step<=6*step) then
begin
mfCur.Width:=Round(mfOrig.Width*cur_step);
mfCur.Height:=Round(mfOrig.Height*cur_step);
RectM:=Rect(0,0,mfCur.Width,mfCur.Height);
mfc:=TMetafileCanvas.Create(mfCur,0);
mfc.StretchDraw(RectM,mfOrig);
mfc.Free;
PanelImg.Width:=mfCur.Width;
PanelImg.Height:=mfCur.Height;
ImageWmf.Picture.Metafile:=mfCur;
Result:=True;
end
else
Result:=False;
mfCur.Free;
end;
procedure TFormMap.DefineUgol(ListKoor : TObjectList; str : string;
var koor : TKoor; numstart : integer;
var ugol : Double);
var
rast,widthStr,heightStr,rastPred,rast1,rast2 : Double;
x,y,delX,delY,numBest,k,num1,num2 : integer;
mf : TMetafile;
mfc : TMetafileCanvas;
lf : TLogFont;
begin
mf:=TMetafile.Create; //определение ширины метки
mfc:=TMetafileCanvas.Create(mf,0);
FillChar(lf, SizeOf(lf), 0);
with lf do
begin
lfHeight := 60;
lfWidth := 30;
lfWeight := 0;
end;
mfc.Font.Handle := CreateFontIndirect(lf);
widthStr:=mfc.TextWidth(str);
heightStr:=mfc.TextHeight(str);
mfc.Free;
mf.Free;
k:=numStart;
rast:=0;
rastPred:=0;
while (rast<widthStr) and (k<ListKoor.Count-1) do
begin
Inc(k);
rastPred:=rast;
x:=TKoor(ListKoor.Items[k]).X;
y:=TKoor(ListKoor.Items[k]).Y;
rast:=sqrt(sqr(koor.x-x)+sqr(koor.y-y));
end;
if (rast-widthStr)>(widthStr-rastPred) then
begin
rast1:=rastPred;
num1:=k-1;
end
else
begin
rast1:=rast;
num1:=k;
end;
k:=numStart;
rast:=0;
while (rast<widthStr) and (k>0) do
begin
Dec(k);
rastPred:=rast;
x:=TKoor(ListKoor.Items[k]).x;
y:=TKoor(ListKoor.Items[k]).y;
rast:=sqrt(sqr(koor.x-x)+sqr(koor.y-y));
end;
if (rast-widthStr)>(widthStr-rastPred) then
begin
rast2:=rastPred;
num2:=k+1;
end
else
begin
rast2:=rast;
num2:=k;
end;
if abs(rast1-widthStr)>abs(rast2-widthStr) then
numBest:=num2
else
numBest:=num1;
x:=TKoor(ListKoor.Items[numBest]).x;
y:=TKoor(ListKoor.Items[numBest]).y;
if x-koor.x<>0 then
ugol:=ArcTan((koor.y-y)/(x-koor.x))
else
ugol:=0;
delY:=Round(heightStr/2*cos(ugol));
delX:=Round(heightStr/2*sin(ugol));
If x>koor.x Then
begin
koor.x := koor.x - delX;
koor.y := koor.y - delY;
end
Else
begin
koor.x := x - delX;
koor.y := y - delY;
end;
ugol:=ugol*180/Pi;
end;
procedure TFormMap.DrawElem(pShape : IShape;
startShp, endShp,typeLine : Integer;
var mc : TMetafileCanvas;
znLine : String);
var
numstart,predX, predY,x,y,j: integer;
ListKoor : TObjectList;
koor : TKoor;
ugol : Double;
begin
ListKoor:=TObjectList.Create(True);
predX :=Round(pShape.Point[startShp].x-GranImg.left);
predY :=Round(GranImg.bottom-pShape.Point[startShp].y);
ListKoor.Add(TKoor.Create(predX,predY));
for j:=startShp+1 to endShp-1 do
begin
x := Round(pShape.Point[j].x-GranImg.left);
y := Round(GranImg.bottom-pShape.Point[j].y);
ListKoor.Add(TKoor.Create(x,y));
ListParamTypeLine.DrawShape(mc,x,y,predX,predY);
predX:=x;
predY:=y;
end;
if typeLine=5 then
begin
numstart:=Round((endShp-startShp)/2)-1;
if numstart=0 then
numstart:=1;
koor:=TKoor.Create( TKoor(ListKoor.Items[numstart]).x,
TKoor(ListKoor.Items[numstart]).y);
DefineUgol(ListKoor,znLine,koor,numstart,ugol);
DrawLabelToLine(koor,Round(ugol*10),znLine,mc);
koor.Free;
end;
ListKoor.Free;
end;
procedure TFormMap.DrawElemEdit(pShape : IShape;
startShp, endShp,typeLine : Integer;
var mc : TMetafileCanvas;
znLine : String);
var
numstart,predX, predY,x,y,j: integer;
ListKoor : TObjectList;
koor : TKoor;
ugol : Double;
begin
ListKoor:=TObjectList.Create(True);
predX :=Round(pShape.Point[startShp].x-GranImg.left);
predY :=Round(GranImg.bottom-pShape.Point[startShp].y);
ListKoor.Add(TKoor.Create(predX,predY));
for j:=startShp+1 to endShp-1 do
begin
x := Round(pShape.Point[j].x-GranImg.left);
y := Round(GranImg.bottom-pShape.Point[j].y);
ListKoor.Add(TKoor.Create(x,y));
ListParamTypeLine.DrawShapeEdit(mc,x,y,predX,predY);
predX:=x;
predY:=y;
end;
if typeLine=5 then
begin
numstart:=Round((endShp-startShp)/2)-1;
if numstart=0 then
numstart:=1;
koor:=TKoor.Create( TKoor(ListKoor.Items[numstart]).x,
TKoor(ListKoor.Items[numstart]).y);
DefineUgol(ListKoor,znLine,koor,numstart,ugol);
DrawLabelToLine(koor,Round(ugol*10),znLine,mc);
koor.Free;
end;
ListKoor.Free;
end;
procedure TFormMap.DrawPanelLabel(k : Double=1);
var
i: integer;
maxWidth, totalHeight : integer;
begin
if ListLabelMap=nil then ListLabelMap:=TObjectList.Create(True);
ListLabelMap.Clear;
SetListStr(ListLabelMap,LEMest.Text, tlMest);
SetListStr(ListLabelMap,LEZaleg.Text, tlZaleg);
SetListStr(ListLabelMap,LEMapName.Text, tlMap);
ListLabelMap.Add(TLabelMap.Create(nil));
TLabelMap(ListLabelMap.Last).Caption:='Масштаб '+EdMashFir.Text+':'+EdMashSec.Text;
TLabelMap(ListLabelMap.Last).TypeLabel:=tlMashtab;
PanelLabel.Color:=clWhite;
PanelLabel.Top:=Round(PanelLabel.Top*k);
PanelLabel.Left:=Round(PanelLabel.Left*k);
for i:=0 to ListLabelMap.Count-1 do
begin
TLabel(ListLabelMap.Items[i]).Parent:=PanelLabel;
TLabel(ListLabelMap.Items[i]).Alignment:=taCenter;
TLabel(ListLabelMap.Items[i]).Left:=0;
TLabel(ListLabelMap.Items[i]).AutoSize:=True;
TLabel(ListLabelMap.Items[i]).Visible:=True;
TLabel(ListLabelMap.Items[i]).Enabled:=False;
case TLabelMap(ListLabelMap.Items[i]).TypeLabel of
tlMest:
begin
TLabel(ListLabelMap.Items[i]).Font.Size:=Round((18+delSizeLabel)*cur_step);
TLabel(ListLabelMap.Items[i]).Font.Style:=[fsBold];
end;
tlZaleg:
begin
TLabel(ListLabelMap.Items[i]).Font.Size:=Round((14+delSizeLabel)*cur_step);
TLabel(ListLabelMap.Items[i]).Font.Style:=[fsBold];
end;
tlMap:
begin
TLabel(ListLabelMap.Items[i]).Font.Size:=Round((12+delSizeLabel)*cur_step);
TLabel(ListLabelMap.Items[i]).Font.Style:=[fsBold];
end;
tlMashtab:
begin
TLabel(ListLabelMap.Items[i]).Font.Size:=Round((12+delSizeLabel)*cur_step);
TLabel(ListLabelMap.Items[i]).Font.Style:=
TLabel(ListLabelMap.Items[i]).Font.Style-[fsBold];
end;
end;
end;
maxWidth:=0;
totalHeight:=0;
for i:=0 to ListLabelMap.Count-1 do
begin
TLabel(ListLabelMap.Items[i]).Top:=totalHeight;
if maxWidth<TLabel(ListLabelMap.Items[i]).Width then
Подобные документы
Функциональные возможности библиотеки OpenGL. Разработка процедуры визуализации трехмерной сцены, интерфейса пользователя и подсистемы управления событиями с целью создания приложения для построения динамического изображения 3D-модели объекта "Самолет".
курсовая работа [1,7 M], добавлен 28.06.2011Принципы программирования и приоритеты использования библиотеки OреnG1, ее архитектура, описание математического аппарата и проекции. Разработка процедуры визуализации трехмерной сцены, подсистемы управлениями событиями и руководства пользователя.
курсовая работа [1,0 M], добавлен 26.06.2011Назначение разработанных программных средств. Визуализации иклинометрии и каротажа. Изучение структуры баз данных, используемых в приложении. Встроенные типы данных Oracle и описание разработанных методов. Взаимодействие пользователя с экранной формой.
курсовая работа [1,1 M], добавлен 14.08.2014Назначение и возможности разработанного приложения для контроля активности сетевых и периферийных устройств предприятия. Язык программирования Java. Распределенные многоуровневые приложения. Структура базы данных, интерфейс разработанного приложения.
курсовая работа [1,0 M], добавлен 16.12.2012Программирование приложения с использованием библиотеки OpenGL и функции для рисования геометрических объектов. Разработка процедуры визуализации трехмерной сцены и интерфейса пользователя. Логическая структура и функциональная декомпозиция проекта.
курсовая работа [1,1 M], добавлен 23.06.2011Разработка автоматизированной системы управления отдела бухгалтерии по расчету зарплаты. Назначение разработанного приложения, схема его основной функциональности. Структура базы данных с описанием таблиц. Схема диалога пользователя с приложением.
курсовая работа [971,6 K], добавлен 29.12.2013Лазерные средства отображения информации. Особенности сопряжения имитационной модели Matlab-Simulink и программное обеспечение визуализации. Возможности средств разработки виртуальных миров, использующих VRML, для визуализации моделирования системы.
курсовая работа [1,6 M], добавлен 01.12.2014Основы программирования с использованием библиотеки OpenGL. Приложение для построения динамического изображения модели объекта "Батискаф": разработка процедуры визуализации трехмерной схемы, интерфейса пользователя и подсистемы управления событиями.
курсовая работа [1,4 M], добавлен 26.06.2011Анализ предметной области. Этапы организации хранилища информации об оплате услуг. Проектирование базы данных. Модели представления системы. Обобщенный алгоритм работы клиента. Контекстные диаграммы, таблицы, хранимые процедуры, интерфейс пользователя.
дипломная работа [2,0 M], добавлен 17.07.2017Возможности библиотеки OpenGL, создание матрицы и эффекта тумана. Разработка процедуры визуализации трехмерной модели "Корабль", интерфейса пользователя и подсистемы управления событиями. Логическая структура и функциональная декомпозиция проекта.
курсовая работа [507,2 K], добавлен 02.07.2011