рефераты скачать
 
Главная | Карта сайта
рефераты скачать
РАЗДЕЛЫ

рефераты скачать
ПАРТНЕРЫ

рефераты скачать
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

рефераты скачать
ПОИСК
Введите фамилию автора:


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

 

3. Функциональное проектирование

 

3.1 Проектирование структуры классов

Исходя из выделенных на этапе структурного проектирования блоков разрабатываемого программного модуля, для реализации заданных функции были разработаны описанные ниже классы.

Класс MainWindow – описывает главное окно программного модуля.

Класс MapView – реализует отображения карты в главном окне программного модуля.

Класс Tasks – обрабатывает нажатие функциональных клавиш в главном окне программного модуля.

Класс Heights – реализует работу со списком стандартных высот.

Класс EditDialog – описывает работу диалога редактирования стандартных высот.

Класс Matrix – реализует работу с матрицей превышений и матрицей корректировок.

Класс ComputeDialog – описывает работу диалога расчета матрицы превышений для нескольких листов карт местности.

Класс ComputeThread – реализует процедуру расчета матрицы превышений для нескольких листов карт местности.

Взаимодействие всех классов осуществляется с помощью следующих глобальных переменных объявленных в main.cpp как указатели на объекты соответствующих классов:

-  MKartaInterface *karta – объект, реализующий функции взаимодействия с картой;

-  Matrix *matrix – текущая обрабатываемая матрица превышений;

-  Matrix *correctionMatrix – текущая обрабатываемая матрица корректировок;

-  MainWindow *window – главное окно приложения;

-  Tasks *tasks – объект для обработки нажатия клавиш в главном окне.

Классы, реализующие диалоги программного модуля

Класс MainWindow – с помощью этого класса происходит описание главного окна программного модуля. Основные функции данного класса:

-  MainWindow() – конструктор, который вызывается при создании окна;

-  bool eventFilter (QObject *o, QEvent *e) – функция обработки движения мыши;

-  void onExit() – функция выполняет последовательность операций при закрытии главного окна программы.

Класс EditDialog – с помощью этого класса происходит описание диалога редактирования стандартных высот. Основные функции этого класса:

-  EditDialog() – конструктор, который вызывается при создании диалога;

-  void addButtonClick() – функция обработки добавления элементов в список;

-  void remButtonClick() – функция обработки удаления элементов из списка;

-  void listViewClick (QListViewItem *item) – функция обработки выбора раздела классификатора;

-  void updateTables (QString zs, QString razd) – функция обновления списка высот для знаков выбранного раздела классификатора;

-  void valueChanged (int row, int col) – функция обработки изменения значения высоты в списке.

Класс ComputeDialog – с помощью этого класса происходит описание диалога расчета матрицы превышений для нескольких листов карт местности. Основные функции данного класса:

-  ComputeDialog (QWidget* parent = 0, const char* name = «ComputeDialog», bool modal = FALSE, WFlags fl = 0) – конструктор, который вызывается при создании диалога;

-  void start() – функция обработки запуска процедуры расчета;

-  void stop() – функция обработки остановки процедуры расчета;

При реализации пользовательского интерфейса использованы стандартные элементы управления Windows, каждому из которых в Qt соответствует собственный класс:

-  панель управления – используется для ускоренного доступа к часто используемым функциям – класс QToolBar;

-  главное меню – используется для организации меню – класс QMenuBar;

-  панель состояния – используется для вывода сервисной информации – класс QStatusBar;

-  список – представление данных в виде списка – класс QListView;

-  надпись – используется для подписывания элементов интерфейса – класс QLabel;

-  поле ввода – используется для ввода данных пользователем – класс QLineEdit;

-  кнопка – используется для выполнения пользователем определенных действий – класс QPushButton;

-  индикатор прогресса – класс QProgressBar.

Кроме того, использованы некоторые специальные классы Qt:

-  QMainWindow – для создания главного окна приложения (класс MainWindow);

-  QTable – для организации таблиц с данными;

-  QDialog – для организации окон модальных диалогов (классы EditDialog, ComputerDialog).

С помощью программы Qt Designer, входящей в комплект поставки системы разработки Qt, был разработан вид главного окна программного модуля и диалогового окна для редактирования стандартных высот.

Программа Qt Designer предназначена для разработки и реализации графического пользовательского интерфейса приложения. С ее помощью также можно сгенерировать программный код, обеспечивающий реализацию функций разработанного интерфейса. В отличие от Microsoft Visual Studio, помещающего описание ресурсов диалогового окна в текстовый файл с расширением.rc, среда разработки Qt создает файл с расширением.ui и помещает в него описание диалогового окна в формате, совместимом с XML. Этот файл включается в makefile данного проекта, создающий на его основе соответствующие файлы заготовок и реализации класса диалогового окна.

Вид главного окна приложения с описанием элементов представлен на рисунке 3.1.


Рисунок 3.1. Главное окно программы


Вид диалогового окна для редактирования списка стандартных высот с

описанием элементов представлен на рисунке 3.2.

Рисунок 3.2. Диалоговое окно для редактирования списка стандартных высот

Классы, реализующие функции программного модуля

Класс ComputeThread – с помощью этого класса происходит расчет матрицы превышений для нескольких листов карт местности. Основные функции этого класса:

-  ComputeThread (QObject *obj) – конструктор, который вызывается при создании объекта;

-  void start() – функция запуска процедуры расчета;

-  void stop() – функция остановки процедуры расчета;

-  void run() – функция выполнения процедуры расчета.

Класс Heights – с помощью этого класса происходит работа со списком стандартных высот. Основные функции этого класса:

-  void save (MString name) – функция сохранения в файл;

-  bool load (MString name) – функция загрузки из файла;

-  void clear() – функция обеспечивающая удаление всех объектов, очистку списка;

-  iterator find (const HObj &o) – функция обеспечивающая поиск объекта в списке;

-  void insert (const HObj &o) – функция обеспечивающая вставку объекта в список;

-  void erase (const HObj &o) – функция обеспечивающая удаление объекта;

Структура HObj реализует объекты составляющие список стандартных высот. Для каждого объекта хранятся код, название и высота (превышение). Конструктор обеспечивает первоначальную инициализацию данных.

Класс MapView – с помощью этого класса реализуется отображение карты в главном окне программного модуля. Основные функции этого класса:

-  mousePressEvent() – функция обработки нажатие мыши при построении матрицы корректировки;

-  void zoom (int left, int top, int right, int bottom) – функция обработки процедуры зуммирования;

-  void prevView() – функция обработки процедуры возврата к предыдущему виду;

-  void defaultView() – функция обработки процедуры отображения всей карты;

-  void updateHeights() – функция осуществляющая перерисовку (отображение) матриц превышений и корректировки на текущем отображаемом фрагменте карты;

-  void drawMap() – функция обработки процедуры отрисовки карты

Класс Tasks – с помощью этого класса происходит обработка нажатия функциональных кнопок в главном окне программного модуля. Основные функции этого класса:

-  void loadMap() – функция, обрабатывающая нажатие кнопки открыть карту;

-  void openFolder() – функция, обрабатывающая нажатие кнопки открыть папку;

-  void loadKls() – функция, обрабатывающая нажатие кнопки открыть классификатор;

-  void loadHeights() – функция, обрабатывающая нажатие кнопки открыть список стандартных высот;

-  void loadMatrix() – функция, обрабатывающая нажатие кнопки открыть матрицу превышений;

-  void loadCorrectionMatrix() – функция, обрабатывающая нажатие кнопки открыть матрицу корректировок;

-  void newHeights() – функция, обрабатывающая нажатие кнопки создать список стандартных высот;

-  void newCorrectionMatrix() – функция, обрабатывающая нажатие кнопки создать матрицу корректировок;

-  void editHeights() – функция, обрабатывающая нажатие кнопки редактирование списка стандартных высот;

-  void saveHeights() – функция, обрабатывающая нажатие кнопки сохранить список стандартных высот;

-  void saveMatrix() – функция, обрабатывающая нажатие кнопки сохранить матрицу превышений;

-  void calculateMatrix() – функция, обрабатывающая нажатие кнопки расчет матрицы превышений;

Класс Matrix – с помощью этого класса происходит реализация расчета матрицы превышений и создание матрицы корректировок.

-  void CreateFile (MRect rect, MString filename, double st = STEP, int y = 0, int x = 0) – функция создания матрицы на жестком диске;

-  void Create (MRect rect, double st = STEP, int y = 0, int x = 0) – функция создания матрицы в памяти;

-  void Destroy() – функция обработки процедуры удаления матрицы;

-  void Calculate() – функция расчёта матрицы превышений;

-  void Save (MString filename) – функция сохранения в файл;

-  bool Load (MString filename) – функция загрузки матрицы в память;

-  bool Open (MString filename) – функция открытия матрицы из файла на жестком диске;

-  void Clear() – функция заполняющая матрицу нулями;

-  MPoint GetPoint (int i, int j) – функция, которая возвращает точку, соответствующую i-ой строке и j-ому столбцу матрицы;

-  void GetPos (MPoint point, int &i, int &j) – функция, определяющая позицию клетки матрицы, которая соответствует точке на карте;

-  int GetX() – функция, определяющая количество столбцов матрицы;

-  int GetY() – функция, определяющая количество строк матрицы;

-  double GetStep() – функция, определяющая шаг матрицы;

-  short GetHeight (MPoint point) – функция, которая возвращает высоту в точке;

-  short GetHeight (int i, int j) – функция, которая возвращает высоту в клетке;

-  void SetHeight (MPoint point, short height) – функция, устанавливающая высоту в клетке, соответствующей точке;

-  void SetHeight (int i, int j, short height) – функция устанавливающая высоту в клетке;

-  void ReadBmhHeader (FILE *file) – функция, которая читает заголовок из файла BMH;

-  void WriteBmhHeader (FILE *file) – функция, которая записывает заголовок в файл BMH;

-  void Fill (MPtArray *ar) – функция, которая заполняет локальную матрицу обрабатываемого топографического объекта;

-  int GetNumFilledPoints() – функция, определяющая количество заполненных клеток;

-  void AddHeight (MTopobject *tpo, short height) – функция, добавляющая высоты топографического объекта в матрицу;

-  void AddLineObject (MTopobject *tpo, short height) – функция, добавляющая высоты линейного объекта в матрицу;

-  void AddPloObject (MTopobject *tpo, short height) – функция добавляющая высоты площадного объекта в матрицу;

-  void Expand (int i, int j, int state) – функция распространяющая заливку из клетки до границ объекта.

Последовательность вызова классов во времени представлена на диаграмме последовательностей (см. черт. РТДП 5.000.005).

Описание используемых функции библиотеки картографии

Класс MKartaInterface предоставляет набор функций необходимых для работы с ядром библиотеки картографии.

Основные функции класса MKartaInterface:

-  bool LoadMap (MString map_name);

загружает карту (upt-файл) указанную в параметре map_name.

-  bool SetKlassifikator (MString kls_name);

загружает классификатор (kls-файл) указанный в параметре kls_name.

-  void SetWidget (QWidget* widget);

устанавливает widget на который должна отрисовываться карта.

-  void DrawMap (bool toScreen = true);

отрисовывает карту, параметр toScreen определяет, будет ли карта отрисовываться на экран (true), либо в pixmap (false).

-  MPoint LogicToGeo (QPoint& lPoint, bool bInMapCoo = false);

-  QPoint GeoToLogic (MPoint& gPoint);

пересчитывают точку из логических (экранных) координат в географические и обратно.

-  MRect LogicToGeo (QRect& lrect, bool bInMapCoo = false);

-  QRect GeoToLogic (MRect& lrect);

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

-  MPoint GeoToGauss (MPoint& pt, double meredian = 1000);

-  MPoint GaussToGeo (MPoint& pt, double meredian = 1000);

пересчитывают точку из географических координат в зонную систему координат Гаусса-Крюгера и обратно.

-  MPoint GeoToGaussStandart (MPoint& pt, double meredian = 1000);

-  MPoint GaussToGeoStandart (MPoint& pt, double meredian = 1000);

пересчитывают точку из географических координат в стандартную систему координат Гаусса-Крюгера и обратно.

-  MPoint GeoToGaussLocal (MPoint& pt);

-  MPoint GaussLocalToGeo (MPoint& pt);

пересчитывают точку из географических координат в местную систему координат Гаусса-Крюгера и обратно.

-  void ZoomTo (MRect& rect);

зуммирует карту до заданного в параметре rect прямоугольника охвата.

-  void ScrollByGeo (double x, double y);

скроллирует карту на смещение заданное в координатах карты.

-  void ScrollByLogic (int x, int y);

скроллирует карту на смещение заданное в координатах окна отрисовки.

-  bool SetMatrixFile (MString path);

устанавливает путь к файлу матрицы высот.

-  int GetHight (MPoint& pt);

возвращает высоту рельефа в точке, заданной параметром pt.

-  int GetHightObjects (MPoint& pt);

возвращает высоту объекта местности относительно рельефа в точке, заданной параметром pt.

Иерархия основных классов библиотеки картографии представлена на плакате (см. плакат РТДП 5.000.004).


4. Разработка программных модулей

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

Алгоритмы ключевых процедур и функций класса MapView

void MapView:drawMap()

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

void MapView:updateHeights()

перерисовка (отображение) матриц превышений и корректировки на текущем отображаемом фрагменте карты производится, только если открыта карта или матрицы превышений и корректировки (используем логические переменные mapOpen и matrixOpen). С помощью класса библиотеки картографии MRect получаем границы карты, которые соответствуют видимой области (MRect bounds = karta->GetZoombounds()), далее вычисляем индексы ячеек матрицы, соответствующие углам карты (matrix->GetPos (MPoint(bounds.left, bounds.bottom), i1, j1); matrix->GetPos (MPoint(bounds.right, bounds.top), i2, j2);). Рассчитываем шаг матрицы double step. В logx и logy – содержится количество пикселей, которым соответствует шаг матрицы (double logx = width() / karta->GetZoombounds().Width() * step; double logy = height() / karta->GetZoombounds().Height() * step;). Матрицу превышений и матрицу корректировок отрисовываем таким образом: если масштаб крупный (шаг матрицы больше 5 пикселей), то рисуем прямоугольник, в противном случае ставим точку.

void MapView:mousePressEvent (QMouseEvent *e)

корректировка в точке матрицы осуществляется только, если была нажата правая клавиша мыши (e->button() == Qt: RightButton) и открыты карта и матрица корректировки (используем логические переменные mapOpen && correctionMatrixOpen). С помощью функций класса MKartaInterface LogicToGeo и GeoToGauss производим преобразование логических координат мыши в географические координаты (MPoint point = karta->LogicToGeo(pos); point = karta->GeoToGauss(point);). Далее проверяем, если точка щелчка мыши находится в области матрицы корректировок, то вызывается диалог, в поле ввода которого вводим значение корректировки высоты. Значение высоты записываем в матрицу корректировок (correctionMatrix->SetHeight (point, height)) и вызываем перерисовку (отображение) матрицы корректировки (updateHeights()).

void MapView:zoom (int left, int top, int right, int bottom)

точки противоположных углов прямоугольника переводим из логических координат мыши в координаты карты

(QPoint first = QPoint (left, top);

QPoint second = QPoint (right, bottom);

MPoint p1 = karta->LogicToGeo(first);

MPoint p2 = karta->LogicToGeo(second);)

Формируем прямоугольник с помощью класса библиотеки картографии MRect (MRect rect = MRect (p1, p2)) и вызываем функцию ZoomTo (в качестве параметра передаем в нее сформированный прямоугольник rect). Для перерисовки карты вызываем функцию drawMap().

Алгоритмы ключевых процедур и функций класса Matrix

void Matrix: CreateFile (MRect rect, MString filename, double st, int y, int x)

создание матрицы на жестком диске осуществляется, если была удалена предыдущая матрица (Destroy()), далее увеличиваем границы матрицы так, чтобы они были кратны шагу (NormalizeRect(rect)), записываем заголовок в файл ВМН (WriteBmhHeader(mem)) и записываем 0 в конец файла, создавая таким образом файл нужного размера, заполненный нулями.

fseek (mem, 48 + cx * cy * sizeof(short) – 1, SEEK_SET);

char c = 0;

fwrite (&c, 1, 1, mem);

short Matrix: GetHeight (MTopobject *tpo)

высота топографического объекта добавляется в матрицу из UTP-файла (MString str = tpo->GetDataPole(1)), если в данных объекта отсутствует значение высоты, оно берется из списка стандартных высот (heights [tpo->m_kkod])

void Matrix: Save (MString filename)

сохранение в файл матрицы осуществляется в случае, если файл успешно создан на диске: FILE *file = fopen (filename, «wb»). Для сохранения матрицы сначала записываем заголовок файла ВМН (WriteBmhHeader(mem)) и сохраняем матрицу или в оперативную память (если memMode == INMEMORY) или в файл на жесткий диск (если memMode == INFILE).

void Matrix: Calculate()

при расчете матрицы первоначально создаем матрицу с размерами равными размерам карты (Create (pKarta->m_geobounds)), далее подсчитываем количество точек у всех топографических объектов, участвующих в расчете (это нужно, чтобы выводить полосу прогресса). Для формирования матрицы превышений, перебирая каждый объект каждого слоя карты, получаем высоту объекта. Если значение высоты не равно нулю, добавляем значение в формируемую матрицу превышений (с помощью функции AddHeight). При этом в матрице заполняются все клетки, покрываемые площадью рассматриваемого объекта.

void Matrix: AddHeight (MTopobject *tpo, short height)

для добавления высоты топографического объекта в матрицу первоначально необходимо проверить тип топографического объекта (tpo->m_pZnak->GetYaz()->GetType()). Если объект площадной, то выполняется добавление высоты площадного объекта в матрицу (AddPloObject (tpo, height)), если объект линейный, то выполняется добавление высоты линейного объекта в матрицу (AddLineObject (tpo, height)), если объект точечный, то сравниваем текущую высоту с высотой в ячейке, если текущая высота больше (height > GetHeight(point), то устанавливаем в ячейке текущую высоту (SetHeight (point, height))

void Matrix: AddLineObject (MTopobject *tpo, short height)

добавление высоты линейного топографического объекта в матрицу осуществляется следующим образом: в цикле по сегментам линейного объекта проверяем покрывает ли ячейка матрицы сегмент, если покрывает, то устанавливаем в ячейке текущую высоту (SetHeight (point, height)), если не покрывает, то рассчитываем количество ячеек покрывающих данный сегмент, и в цикле для каждой ячейки устанавливаем текущую высоту топографического объекта.

void Matrix: AddPloObject (MTopobject *tpo, short height)

добавление высоты площадного топографического объекта в матрицу осуществляется следующим образом: сначала создается локальная матрица топографического объекта (по размеру охватывающего прямоугольника объекта). Затем в локальной матрице площадного объекта заполняются ячейки, покрывающие контур объекта – используется функция AddLineObject (tpo, BORDER). Затем заполняются остальные ячейки локальной матрицы с использованием функции Fill (MPtArray *ar). На последнем этапе в цикле по всем ячейкам сформированной локальной матрицы все «внутренние» (не-OUTSIDE) ячейки заполняются значениями высоты площадного объекта, но только в том случаи если текущее значение высоты больше значения высоты в ячейке

if (height > GetHeight(point))

SetHeight (point, height);

void Fill (MPtArray *ar)

заполнение локальной матрицы обрабатываемого топографического объекта продолжается до тех пор, пока не будут заполнены все точки (GetNumFilledPoints() < numPoints). Первоначально в цикле do while выбираем случайную ячейку со значением высоты EMPTY (не заполненная) и вычисляем соответствующую точку объекта (MPoint pt = GetPoint (i, j)). Затем распространяем вокруг этой клетки значение высоты объекта с помощью функции Expand(), учитывая при этом, является точка внутренней (INSIDE) или наружной (OUTSIDE) по отношению к объекту.

if (PointInRegion (pt, ar)) Expand (i, j, INSIDE);

else    Expand (i, j, OUTSIDE);

void Expand (int i, int j, int state)

распространение заливки из клетки до границ объекта происходит следующим образом: сначала устанавливаем значение в клетке (SetHeight (i, j, state)), затем в цикле заполняем соседние клетки, обход осуществляется по кругу, вначале по часовой стрелке, потом – против, после каждой итерации увеличиваем радиус круга. Если после обхода не заполнено ни одной точки, значит распространяться «заливке» уже некуда, выходим из цикла.

 

5. Программа и методика испытаний

 

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

Основным методом отладки и обнаружения ошибок является тестирование – важнейший фактор, определяющий стоимость и длительность разработки комплекса программ. Затраты на тестирование составляют до 40% от общего времени на разработку программы.

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

Страницы: 1, 2, 3, 4, 5, 6


рефераты скачать
НОВОСТИ рефераты скачать
рефераты скачать
ВХОД рефераты скачать
Логин:
Пароль:
регистрация
забыли пароль?

рефераты скачать    
рефераты скачать
ТЕГИ рефераты скачать

Рефераты бесплатно, реферат бесплатно, рефераты на тему, сочинения, курсовые работы, реферат, доклады, рефераты, рефераты скачать, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.