Главное меню

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



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

 

Листинг программы конвертации спроецированных полилиний в полилинии с мерой.

Новая тема (слой) полилиний с мерой будет иметь такой же набор семантических полей и их значений, как и старая тема.

theProject=av.GetProject

Объект - открытый проект

DocList=theProject.GetDocs

Список всех документов проекта

NDoc=DocList.Count

Подсчет числа документов в списке

ViewList=List.Make

Создание списка видов проекта (сперва пустого)

for each dok in 0..(NDoc-1)

tekdoc=DocList.Get(dok)

tipdoc=tekdoc.GetGUI

if (tipdoc="View") then

ViewList.Add(tekdoc)

end

end

Цикл по всем документам списка

theView=MsgBox.List(ViewList, "", "Выберите Вид линейных объектов")

Выбор Вида

list_of_themes=theView.getThemes

Получение списка слоёв (тем)

theTheme = MsgBox.List(list_of_themes, "*.shp", "Выберите линейную тему")

Выбор Темы

theFtab = theTheme.GetFtab

Получение атрибутивной таблицы Темы

theShapeField = theFtab.FindField("Shape")

Создание идентификатора поля Shape

LineFieldsList=theFtab.GetFields

Создание списка полей данной Темы

nLineFields=LineFieldsList.Count

Определение числа элементов этого списка

LineMFieldsList=LineFieldsList.DeepClone

Глубокое клонирование списка полей. Эта операция называется «deep clone» («глубокое клонирование»), потому что не только список, но и каждый элемент списка также клонируется.

LineMFieldsList.Remove(0)

Удаление из списка первого поля – Shape, т.е. старых пространственных объектов. Это поле будет образовано при создании новой FTab, т.е. при создании новых пространственных объектов.

LineMFieldsList.Add

(Field.Make("Dlina",#FIELD_DECIMAL,10,2))

Создание поля для записи длин объектов. Это нужно для контроля при создании таблицы маршрутной темы событий.

AtrNamesList=List.Make

Создание листа имен атрибутивных полей

IdenList=List.Make

Создание листа идентификаторов атрибутивных полей

for each pole in 1..(nLineFields-1)

Цикл по всем полям таблицы, начиная со второго, т.к. первое поля с номером 0 - Shape. Поскольку первый элемент любого списка имеет номер 0, то номер последнего элемента на 1 меньше, чем число элементов списка

tekpole=LineFieldsList.Get(pole)

Получение очередного поля из списка

tekName=tekpole.AsString

Получение имени поля - превращение поля в объект строкового типа

AtrNamesList.Add(tekName)

Добавление имени поля в список имен атрибутивных полей

iden=theFtab.findfield(tekName)

Получение идентификатора текущего поля

IdenList.Add(iden)

Добавление идентификатора поля в список

end

nIdenList=IdenList.Count

Определение числа элементов списка идентификаторов полей

lineMName=MsgBox.Input("*.shp", "Введите имя

нового шейпфайла (темы)", ".shp")

Задание в диалоговом окне имени нового шейпфайла - объект строкового типа

lineMName=lineMName.AsFileName

Превращение объекта строкового типа в объект типа имя файла

lineMName.SetExtension("shp")

Установка расширения файла "shp".

lineMFTab = FTab.MakeNew(lineMName, PolylineM)

Создание новой виртуальной таблицы объектов типа PolylineM

nlineMfields=LineMFieldsList.Count

Определение числа полей в списке полей для новой темы

lineMFTab.AddFields(LineMFieldsList)

Добавление атрибутивных полей в таблицу lineMFTab

lineMShape = lineMFTab.FindField("Shape")

Создание идентификатора поля "Shape" таблицы lineMFTab создаваемой темы

IdenLineMList=List.Make

Создание листа идентификаторов атрибутивных полей для новой темы

for each pole in 0..(nLineMFields-1)

Цикл по всем атрибутивным полям списка полей вновь создаваемой темы типа PolylineM

teklineMpole=LineMFieldsList.Get(pole)

Получение текущего поля из списка

teklineMName=teklineMpole.AsString

Его превращение в объект типа "строка"

lineMiden=lineMFtab.findfield(teklineMName)

Создание идентификатора текущего поля

IdenLineMList.Add(lineMiden)

Добавление идентификатора поля в список

end

nIdenMList=IdenLineMList.Count

Определение числа элементов списка идентификаторов атрибутивных полей создаваемой темы типа PolylineM

List_V_in_rec=List.Make

Создание списка значений атрибутивных полей исходной темы в конкретной записи (строке) таблицы theFtab

Rasst=List.Make

Создание списка расстояний

SpisList=List.Make

Создание списка списков значений полей в записях

SpisRasst=List.Make

Создание списка списков расстояний

Points=List.Make

Создание списка точек

For each rec in theFtab

Цикл по всем записям таблицы объектов исходной линейной темы

for each atrpole in 0..(nIdenList-1)

Цикл по полям данной записи

tekiden=IdenList.Get(atrpole)

Получение идентификатора поля

tekzn = theFtab.returnvalue(tekiden, rec)

Получение значения поля в данной записи

List_V_in_rec.Add(tekzn)

Добавка значения поля в список значений полей записи

end

Rasst.Add(0)

Добавка в список расстояний значения 0, т.к. первая точка линии имеет нулевое расстояние до начала линии, т.е. до самой себя

theShape = theFtab.ReturnValue(theShapeField,rec)

Получение линейного объекта линейной темы

LinePoints=theShape.AsMultiPoint

Превращение линейного объекта в многоточечный

Tochki = LinePoints.AsList

Превращение многоточечного объекта в список точек

ntochek=Tochki.Count

Определение числа точек в списке

for each uz in 0..(ntochek-1)

Цикл по всем точкам списка

uzel=Tochki.Get(uz)

Получение точки из списка

Points.Add(uzel)

Добавление точки в список

end

Points.RemoveDuplicates

Удаление из списка возможных дубликатов

chis_t=Points.Count

Определение числа точек в списке

theTmpDirName=FileName.GetTmpDir

Получение текущего каталога

litlFN = theTmpDirName.MakeTmp("litl", "shp")

Создание имени временного файла, в который будут записаны Line-объекты из одного объекта исходного слоя (Line-объект - прямая линия между двумя точками)

litlFTab = FTab.MakeNew(litlFN, PolyLine)

Создание таблицы Line-объектов

fields = List.Make

Создание списка полей для временной таблицы

fields.Add(Field.Make("N_otr", #FIELD_SHORT, 4,

0))

Создание и добавление в список полей поля N_otr. Это поле нужно только для того, чтобы в таблице было хотя бы одно атрибутивное поле.

litlFTab.AddFields(fields)

Добавка в таблицу полей из списка, т.е. одного поля

litlshape = litlFTab.FindField("Shape")

Создание идентификатора поля Shape

otrField = litlFTab.FindField("N_otr")

Создание идентификатора поля N_otr

startpoint=Tochki.Get(0)

Создание объекта - начальной точки Line-объекта

for each t in 1..(chis_t-1)

Цикл по всем точкам списка, начиная со второй

finishpoint=Points.Get(t)

Создание объекта - конечной точки Line-объекта

otrezok = Line.Make(startpoint,finishpoint)

Создание Line-объекта

otrez=otrezok.AsPolyline

Превращение Line-объекта в объект типа Polyline

rec_otr = litlFTab.AddRecord

Добавление новой записи в таблицу litlFTab

litlFTab.SetValue(litlShape, rec_otr, otrez)

'Запись в поле Shape виртуальной таблицы litlFTab объекта otrez, т.е. прямой типа Polyline.

litlFTab.SetValueNumber(otrfield, rec_otr, t)

Запись в поле N_otr номера объекта - прямой линии. Этого можно было бы не делать, но сделано для упрощения отладки программы.

litlFtab.flush

Запись изменений в таблице litlFtab в файлы её источников

startpoint=finishpoint

Конечная точка созданного Line-объекта становится начальной точкой следующего Line-объекта

end

dist=0

Обнуление переменной, в которой хранится расстояния до начального

For each litlrec in litlFtab

Цикл по всем записям таблицы litlFtab

litlShapePr = litlFTab.ReturnValue

(litlFTab.FindField("Shape"), litlrec)

Получение пространственного

спроецированного объекта из поля Shape и записи номер litlrec

litlLength = litlShapePr.ReturnLength

Определение длины отрезка

dist=dist+litlLength

Определение расстояния от начала объекта Polyline исходной темы до точки, являющейся концом данного отрезка прямой.

Rasst.Add(dist)

Добавка расстояния в список

end

List_V_in_rec.Add(dist)

Добавка в список значений полей в данной записи длины объекта Polyline

SpisList=SpisList.Add(Points)

Добавка в список списка точек будущей полилинии

NewPolyline=PolyLine.Make(SpisList)

Создание нового объекта типа Polyline в соответствии со списком списков точечных объектов SpisList.

NewPolylineM=NewPolyline.AsPolyLineM

Преобразование объекта Polyline в объект PolylineM.

В нем уже есть места для размещения данных о расстояниях от вертексов полилинии (точек концов и начал отрезков прямых) до её начала, однако там пока нет реальных значений расстояний.

SpisRasst=SpisRasst.Add(Rasst)

Добавка списка расстояний данного объекта Polyline в общий список списков расстояний. В данном случае в списке списоков SpisRasst имеется всего один список расстояний - Rasst. Этого требует грамматика языка Avenue.

NewPolylineM=NewPolyLineM.SetM(SpisRasst)

Сброс значений мер (расстояний от вертексов объекта PolyLineM до его начала) в сам объект NewPolyLineM.

rec_lineM=lineMFTab.AddRecord

Добавление в таблицу lineMFTab новой записи

lineMFtab.SetValue(lineMShape,rec_lineM,

NewPolylineM)

Запись в поле Shape таблицы lineMFtab объекта NewPolyLineM в данной новой записи rec_lineM.

For each atrpole in 0..(nIdenMList-1)

Цикл по всем атрибутивным полям таблицы вновь создаваемой темы типы PolyLineM.

tekpolelinM=LineMFieldsList.Get(atrpole)

Получение имени текущего поля

teklineidenM=IdenLineMList.Get(atrpole)

Получение атрибута поля

znach=List_V_in_rec.Get(atrpole)

Получение значения данного поля в списке значений атрибутивных полей таблицы theFtab исходной темы типа PolyLine в записи номер rec

pole_class = tekpolelinM.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

lineMFTab.SetValueNumber

(teklineidenM, rec_lineM, znach)

Запись в числовое поле, если тип текущего поля – числовой

Else

lineMFTab.SetValue

(teklineidenM,rec_lineM,znach)

в любом другом случае запись в нечисловое поле

end

end

List_V_in_rec.Empty

Rasst.Empty

Tochki.Empty

fields.Empty

SpisList.Empty

SpisRasst.Empty

Points.Empty

Удаление из списка всех элементов

end

lineMFtab.Flush

Запись изменений в таблице lineMFtab в файлы её источников

strlineMName = lineMName.AsString

Получение имени файла как строкового объекта

lineMSrcName = SrcName.Make(strlineMName)

Создание объекта типа SrcName. Объекты этого типа идентифицируют данные, используемые для создания темы в ArcView. SrcName-объект представляет собой 'имя файла с полным путём к нему. Он определяет источник пространственных данных, хранящийся на диске, и поддерживает следующие типы: покрытия, слои библиотеки, шейп-файлы и растровые файлы. Объект SrcName создается из строки, содержащей элементы, идентифицирующие данные

if (lineMSrcName = nil) then

Проверка: а создан ли файл?

msgbox.Error( "Invalid SrcName", "")

Сообщение, если файл не создан

exit

Выход из программы

end

lineMTheme = Theme.Make(lineMSrcName)

Создание Темы объектов PolyLineM по объекту SrcName

theView.AddTheme(lineMTheme)

Добавка созданной Темы в Вид

lineMTheme.SetVisible(true)

Установка режима видимости новой Темы

theView.Invalidate

Обновление отображения Вида в окне