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

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

Учреждение образования

«Гомельский государственный университет имени Франциска Скорины»

Математический факультет

Кафедра математических проблем управления

КУРСОВАЯ РАБОТА

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

Исполнитель:

студент группы ПМ-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,

value2 NUMBER) return NUMBER

Эта функция принимает в качестве входных параметров два числа, ссылаясь на них внутри себя как на VALUE1 и VALUE2. После написания тела функции ее можно вызывать в 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

ПоказатьСвернуть
Заполнить форму текущей работой