Главное меню

Карта сайта
Главная
Курсовые работы
Отчеты по практикам
Лабораторные работы
Методические пособия
Рефераты
Дипломы
Лекции



Применение геоинформационных систем в геоэкологических исследованиях

Основной фрагмент программы создания темы линий из темы отдельных точек

Начало программы – «традиционное»: выбор в диалоговом режиме Вида, а в нём – темы точек pointTheme, получение из неё таблицы атрибутов pointFtab.

pointFtab=pointTheme.getftab
pointShape=pointFtab.findfield("Shape")
pointSrcName=pointFTab.GetSrcName
Получение источника таблицы
str_pointFileName=pointSrcName.GetName Получение имени файла источника
StrLineName="line_"+str_pointFileName Создание имени нового файла. Разумеется, можно имя нового линейного файла задавать в диалоговом режиме, однако предлагаемый способ сохраняет преемственность имён файлов.
PointFieldsList=pointFtab.GetFields Создание списка полей темы точек
nPointFields=PointFieldsList.Count Определение числа полей в списке
LineFieldsList=PointFieldsList.DeepClone Глубокое клонирование списка

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

LineFieldsList.Remove(0) Убираем первое поле – Shape, т.к. в новой таблице оно будет создано
AtrNamesList=List.Make Создание списка имен атрибутивных полей
IdenList=List.Make Создание списка идентификаторов атрибутивных полей
for each pole in 1..(nPointFields-1) Цикл по всем атрибутивным полям таблицы точек, первое поле Shape пропущено
tekpole=PointFieldsList.Get(pole) Получение текущего поля из списка
tekName=tekpole.AsString Превращение его в строковый объект
AtrNamesList.Add(tekName) Добавление имени поля в список имен атрибутивных полей
iden=pointFtab.findfield(tekName) Получение идентификатора текущего поля
IdenList.Add(iden) Его добавление в списка идентификаторов атрибутивных полей
end Конец цикла
nIdenList=IdenList.Count Подсчёт числа идентификаторов. Создание новой темы объектов Line (т.е. прямых отрезков) с атрибутикой Point
lineName=StrlineName.AsFileName Создание объекта «имя файла»
lineName.SetExtension("shp") Задание ему расширения "shp"
lineFTab = FTab.MakeNew(lineName, Polyline) Создание новой атрибутивной таблицы объектов типа Polyline: каждый из них будет состоять из одного объекта Line
nlinefields=LineFieldsList.Count Подсчёт числа полей в списке атрибутивных полей новой таблицы линейных объектов
lineFTab.AddFields(LineFieldsList) Добавление списка атрибутивных полей в новую атрибутивную таблицу линейных объектов
lineShape = lineFTab.FindField("Shape") Получение идентификатора поля Shape новой атрибутивной таблицы линейных объектов
IdenLineList=List.Make Создание листа идентификаторов атрибутивных полей для новой темы
for each pole in 0..(nLineFields-1) Начало цикла по всему списку атрибутивных полей создаваемой линейной темы
teklinepole=LineFieldsList.Get(pole) Получение текущего поля из списка
teklineName=teklinepole.AsString Получение имени поля как строкового объекта
lineiden=lineFtab.findfield(teklineName) Получение идентификатора этого поля
IdenLineList.Add(lineiden) Его добавление в лист идентификаторов
end Конец цикла
nIdenLineList=IdenLineList.Count Определение числа идентификаторов атрибутивных полей новой линейной темы
Spis_List_V_in_rec=List.Make Создание списка списков значений атрибутивных полей
Points=List.Make Создание списка точечных объектов
for each rec_point in pointftab Начало цикла по записям таблицы точечной темы
List_V_in_rec=List.Make Создание списка значений атрибутивных полей в данной записи
for each atrpole in 0..(nIdenList-1) Начало цикла получения значений полей записи
tekiden=IdenList.Get(atrpole) Получение текущего идентификатора поля
tekzn = pointFtab.returnvalue(tekiden, rec_point) Получение значения поля
List_V_in_rec.Add(tekzn) Его добавление в список значений полей записи
end Конец цикла по полям
obj_point = pointftab.returnvalue(pointShape,

rec_point)

Получение объекта - точки
Points.Add(obj_point) Добавление точки в список точек
Spis_List_V_in_rec.Add(List_V_in_rec) Добавление списка значений атрибутивных полей текущей записи в список
end Конец цикла по записям таблицы точечной темы
npoints=Points.Count Определение числа точек
for each tochka in 0..(npoints-2) Начало цикла по точкам списка от первой до предпоследней
ntochka=Points.Get(tochka) Получение текущей точки – начальной точки объекта Line
ktochka=Points.Get(tochka+1) Получение следующей точки – конечной точки объекта
linia=PolyLine.Make({{ntochka,ktochka}}) Создание линии
rec_line=lineFTab.AddRecord Добавление новой записи в таблицу линейных объектов
lineFTab.SetValue(lineShape, rec_line, linia) Запись в поле Shape таблицы созданной линии
tekznachlist=Spis_List_V_in_rec.Get(tochka) Получение списка значений атрибутивных полей
ntekznlst=tekznachlist.Count Определение числа значений в списке
for each atrpole in 0..(nIdenLineList-2) Начало цикла по идентификаторам атрибутивных полей линейной темы
tekpolelin=LineFieldsList.Get(atrpole) Получение текущего поля
teklineiden=IdenLineList.Get(atrpole) Получение идентификатора текущего поля
znach=tekznachlist.Get(atrpole) Получение значения текущего поля
pole_class = tekpolelin.GetType Получение типа текущего поля
if ((Pole_class=#FIELD_BYTE) or
(Pole_class=#FIELD_DECIMAL) or
(Pole_class=#FIELD_DOUBLE) or
(Pole_class=#FIELD_FLOAT) or
(Pole_class=#FIELD_LONG) or
(Pole_class=#FIELD_SHORT)) then
lineFTab.SetValueNumber
(teklineiden,rec_line,znach)

Запись значения в таблицу линейной темы в зависимости от типа поля

else

lineFTab.SetValue(teklineiden,rec_line,znach)

end
end Конец цикла по идентификаторам
end Конец цикла по точкам списка
lineFTab.Flush Запись составляющих атрибутивной таблицы линейной темы в файлы
lineFTab.Refresh Обновление таблицы по данным на диске
lineName = lineName.AsString
lineSrcName = SrcName.Make(lineName)
lineTheme = Theme.Make( lineSrcName )
lineThemeName = lineSrcName.GetName
nsimv=lineThemeName.Count
Создание линейной темы и её добавление в Вид
lineThemeName = lineThemeName.Left(nsimv-4)
lineTheme.SetName(lineThemeName)lineThemeName
Убираем в названии темы расширение
theView.AddTheme(lineTheme) Добавление темы в Вид
lineTheme.SetVisible(true) Установка её видимой
theView.Invalidate Обновление изображения Вида

Иной встречающийся случай: по последовательности точек создать полигон. Здесь программа существенно упрощается, так как нет необходимости копирования значений семантических полей. Здесь просто следует создать хотя бы одно семантическое поле, например, строковое и записать потом в него идентификатор полигона, например, задаваемый с помощью диалогового окна MsgBox и метода Input: «Идентификатор введённого строкового значения» = MsgBox. Input(«Строка подсказки», «Заголовок диалогового окна», «Строковое значение по умолчанию»). Синтаксис создания полигона ничем не отличается от создания линейного объекта.

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

Рассмотрим программу создания темы линейных объектов с характеристиками пересекаемых объектов площадной темы и сохранением полей исходной линейной темы. «Традиционное» начало программы опущено.