Главное меню

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



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

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

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

Задание № 15.1.

Работаем с копией проекта с:\esri\esridata\russia.apr. Предположим, планируется прокладка газопроводов:

Надым – Нумто – Селиярово - Цингалы – Тобольск – Тюмень;

Яптиксале – Лаборовая – Хальмер-Ю – Хорей-Вер – Нарьян-Мар – Архангельск.

Построить их маршруты на карте программным способом.

Построить программно полигон по точкам: Великий Новгород – Вологда – Ярославль – Владимир – Тверь – Смоленск – Псков - Великий Новгород.