Применение геоинформационных систем в геоэкологических исследованиях |
Страница 33 из 49
Листинг программы конвертации спроецированных полилиний в полилинии с мерой. Новая тема (слой) полилиний с мерой будет иметь такой же набор семантических полей и их значений, как и старая тема. 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 Обновление отображения Вида в окне
|