Смекни!
smekni.com

Разработка геоинформационной системы (стр. 4 из 10)

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

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

- voidsave (MStringname) – функция сохранения в файл;

- boolload (MStringname) – функция загрузки из файла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Класс 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) – функция создания матрицы в памяти;

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

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

- voidSave (MStringfilename) – функция сохранения в файл;

- boolLoad (MStringfilename) – функция загрузки матрицы в память;

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

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

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

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

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

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

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

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

- shortGetHeight (inti, intj) – функция, которая возвращает высоту в клетке;

- voidSetHeight (MPointpoint, shortheight) – функция, устанавливающая высоту в клетке, соответствующей точке;

- voidSetHeight (inti, intj, shortheight) – функция устанавливающая высоту в клетке;

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

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

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

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

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

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

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

- voidExpand (inti, intj, intstate) – функция распространяющая заливку из клетки до границ объекта.

Последовательность вызова классов во времени представлена на диаграмме последовательностей (см. черт. РТДП 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

voidMapView:drawMap()

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

voidMapView:updateHeights()

перерисовка (отображение) матриц превышений и корректировки на текущем отображаемом фрагменте карты производится, только если открыта карта или матрицы превышений и корректировки (используем логические переменные mapOpen и matrixOpen). С помощью класса библиотеки картографии MRect получаем границы карты, которые соответствуют видимой области (MRectbounds = 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; doublelogy = 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 в конец файла, создавая таким образом файл нужного размера, заполненный нулями.