рефераты скачать

МЕНЮ


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

-  набор предопределенных GUI-элементов, называемых «widgets», которые могут быть легко использованы для создания видимых элементов;

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

В качестве языка программирования выбран C++ как язык, наилучшим образом сочетающий в себе поддержку объектно-ориентированной технологии программирования и возможности написания кода на достаточно низком уровне, что позволяет достичь оптимального быстродействия разрабатываемого программного обеспечения. Одним из современных инструментальных средств для разработки Windows-приложений является пакет Microsoft Visual C++ 6.0. Visual C++ предоставляет удобную среду визуального объектно-ориентированного программирования, что и обусловило выбор именно этого пакета в качестве среды разработки.

2.2 Логическая структура библиотеки картографии

Библиотека картографии предназначена для работы с цифровой картой местности (ЦКМ) и представляет собой набор классов и функций, обеспечивающих визуализацию и работу с картой, а также обеспечение решения расчетных задач на фоне карты.

Программное обеспечение состоит из следующих элементов:

-  набор классов и функций, составляющих ядро библиотеки;

-  класс MKartaInterface, предоставляющий функции управления картой.

Для хранения карты на диске используются файлы в формате UTP. Формат UTP предполагает наличие utp-файла, а также kls-файл, содержащий классификатор. Также возможно использование bmh-файла с матрицей высот.

Логически карта состоит из паспорта, ссылки на классификатор (в виде термина) и одного или нескольких слоёв, каждый из которых, в свою очередь, состоит из объектов.

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

Слой – самая крупная структурная единица в структуре карты, представляющая собой хранилище объектов. Структурно состоит из паспорта слоя и списка объектов.

В картографии понятие «объект» обозначает наиболее элементарную часть в структуре карты, соответствующую единичному географическому явлению на местности.

Как информационная структура, объект представляет собой хранилище сведений об изображаемом явлении, включающее:

-  указание на способ изображения данного явления, т.е. его условный знак;

-  данные о расположении явления (пространственные данные, контур);

-  дополнительные сведения о нем (атрибуты).

 

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)

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


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