Theme1 = MsgBox.List(list_of_themes, "*.shp", "Выберите тему 1") Ftab1=Theme1.getftab |
|
FieldsList1=Ftab1.GetFields nFields1=FieldsList1.Count |
создаем список полей 1-ой темы |
IdenList1=List.Make for each pole in 1..(nFields1-1) tekpole=FieldsList1.Get(pole) tekName=tekpole.AsString iden=Ftab1.findfield(tekName) IdenList1.Add(iden) end Shape1=Ftab1.findfield("Shape") |
создание листа идентификаторов атрибутивных полей |
List1=List.Make |
создание листа объектов темы 1 |
SpisListAtr1=List.Make for each rec_1 in ftab1 obj1 = ftab1.returnvalue(Shape1, rec_1) List1.Add(obj1) |
создание списка позаписных списков значений атрибутивных полей темы 1 |
List_V_in_rec=List.Make for each pole in 0..(nFields1-2) tekiden=IdenList1.Get(pole) tekzn = ftab1.returnvalue(tekiden, rec_1) List_V_in_rec.Add(tekzn) end SpisListAtr1.Add(List_V_in_rec) end nsumobs=List1.Count |
создание списка значений атрибутивных полей в данной записи |
SumFieldsList=FieldsList1.DeepClone |
глубокое клонирование списка полей первой темы |
SumFieldsList.Remove(0) |
убрали первое поле - Shape |
SumIdenList=IdenList1.DeepClone |
глубокое клонирование списка идентификаторов полей первой темы |
SumObjList=List1.DeepClone |
глубокое клонирование списка объектов первой темы |
SumSpisListAtr=SpisListAtr1.DeepClone skl=1 sech=true while (true) if (skl>1) then sech=MsgBox.YesNo("Пересечь с очередной темой?", "Пересечение плошадных тем", true) end if (not sech) then break end Theme2 = MsgBox.List(list_of_themes, "*.shp", "Выберите тему 2") Ftab2=Theme2.getftab |
глубокое клонирование списка позаписных списков значений атрибутивных полей темы 1 |
FieldsList2=Ftab2.GetFields nFields2=FieldsList2.Count |
создаем список полей 2-ой темы |
CopyFieldsList2=FieldsList2.DeepClone |
глубокое клонирование списка полей второй темы |
CopyFieldsList2.Remove(0) |
убрали первое поле – Shape |
IdenList2=List.Make for each pole in 1..(nFields2-1) tekpole=FieldsList2.Get(pole) tekName=tekpole.AsString iden=Ftab2.findfield(tekName) IdenList2.Add(iden) end Shape2=Ftab2.findfield("Shape") |
создание листа идентификаторов атрибутивных полей |
List2=List.Make |
создание листа объектов темы 2 |
SpisListAtr2=List.Make for each rec_2 in ftab2 obj2 = ftab2.returnvalue(Shape2, rec_2) List2.Add(obj2) |
создание списка позаписных списков значений атрибутивных полей темы 2 |
List_V_in_rec=List.Make for each pole in 0..(nFields2-2) tekiden=IdenList2.Get(pole) tekzn = ftab2.returnvalue(tekiden, rec_2) List_V_in_rec.Add(tekzn) end SpisListAtr2.Add(List_V_in_rec) end nobs2=List2.Count |
создание списка значений атрибутивных полей в данной записи |
n_el_splatr1=SumSpisListAtr.Count |
создание списка пересеченных объектов определение числа элементов списка позаписных списков значений атрибутивных полей темы 1 |
nsumf=SumFieldsList.Count |
определение числа полей |
PeresekObjList=List.Make |
создание списка пересеченных объектов |
SpisListPerAtr=List.Make |
создание списка позаписных списков значений атриб. полей пересеченных объектов |
sovm=false for each obs in 0..(nsumobs-1) sum_ob=SumObjList.Get(obs) for each ob2 in 0..(nobs2-1) them2_ob=List2.Get(ob2) AreaSect=sum_ob.ReturnIntersection(them2_ob) prov1=AreaSect.IsEmpty if (prov1=false) then if (sovm=false) then sovm=true end |
проверка пересечений объектов суммарного списка с объектами новой темы |
AreaSectList=AreaSect.Explode N_polig=AreaSectList.Count if (N_polig=1) then PeresekObjList.Add(AreaSect) else for each kusok in 0..(N_polig-1) PoligPart=AreaSectList.Get(kusok) PeresekObjList.Add(PoligPart) end end |
проверка полученного полигона на многосвязность |
for each lst in 0..(n_el_splatr1-1) if (lst=obs) then TekAtrZnList1=SumSpisListAtr.Get(lst) end end |
получение списка значений атрибутивных полей суммарной темы |
for each lst in 0..(nobs2-1) if (lst=ob2) then TekAtrZnList2=SpisListAtr2.Get(lst) end end |
получение списка значений атрибутивных полей пересекаемой темы |
AddAtrZnList=TekAtrZnList1+TekAtrZnList2 |
сложение двух списков |
CopyAddAtrZnList=AddAtrZnList.DeepClone for each kusok in 0..(N_polig-1) SpisListPerAtr.Add(CopyAddAtrZnList) end end end end skl=2 |
глубокое клонирование суммарного списка |
if (sovm=true) then |
пересоздание суммарных списков |
SumObjList.Empty SumObjList.Merge(PeresekObjList) nsumobs=SumObjList.Count |
пересоздание списка объектов |
SumSpisListAtr.Empty SumSpisListAtr.Merge(SpisListPerAtr) |
пересоздание списка позаписных списков значений атриб. полей |
CopyIdenList2=IdenList2.DeepClone SumIdenList.Merge(CopyIdenList2) |
пересоздание списка идентификаторов полей |
SumFieldsList.Merge(CopyFieldsList2) end end |
пересоздание списка полей |
nsumf=SumFieldsList.Count |
определение числа полей |
nsumobs=SumObjList.Count |
определение числа объектов |
defaultName="пересек.shp" defaultName=defaultName.AsFileName SumName=FileDialog.Put(defaultName,"*.shp", "Результирующий суммарный шейпфайл") if (SumName = nil) then exit end SumName.SetExtension("shp") SumFTab = FTab.MakeNew(SumName,Polyline) SumFTab.AddFields(SumFieldsList) SumShape=SumFtab.findfield("Shape") |
создание новой темы объектов пересечения с суммарной атрибутикой |
IdenSumList=List.Make for each pole in 0..(nsumf-1) teksumpole=SumFieldsList.Get(pole) teksumName=teksumpole.AsString sumiden=SumFtab.findfield(teksumName) IdenSumList.Add(sumiden) end |
создание листа идентификаторов атрибутивных полей для новой темы |
for each obs in 0..(nsumobs-1) per_obj=SumObjList.Get(obs) rec_sum=SumFTab.AddRecord SumFTab.SetValue(SumShape,rec_sum,per_obj) tek_ListAtrZn=SumSpisListAtr.Get(obs) for each pole in 0..(nsumf-1) tekpolesum=SumFieldsList.Get(pole) znach=tek_ListAtrZn.Get(pole) teksumiden=IdenSumList.Get(pole) pole_class=tekpolesum.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 SumFTab.SetValueNumber(teksumiden, rec_sum, znach) else SumFTab.SetValue(teksumiden, rec_sum, znach) end end end |
заполнение записей новой темы |
SumFtab.Flush strSumName = SumName.AsString SumSrcName = SrcName.Make(strSumName ) if (SumSrcName = nil) then msgbox.Error( "Invalid SrcName", "") exit end SumTheme = Theme.Make(SumSrcName) theView.AddTheme(SumTheme) SumTheme.SetVisible(true) theView.Invalidate |
|