Главное меню

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



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

 

Расчёты протяжённостей пространственных объектов в ГИС ArcView 3.2 выполняется с помощью функции Avenue ReturnLength. Синтаксис её применения в программе:

«Идентификатор результата» =«Идентификатор Shape объекта». ReturnLength

Здесь «Идентификатор результата» - переменная программы, в которую будет записан результат выполнения функции, «Идентификатор Shape объекта» - переменная программы, в которую уже помещён результат выполнения функции ReturnValue, обращающейся к полю Shape виртуальной таблицы атрибутов векторного слоя Ftab, т.е. это хранящийся в памяти компьютера пространственный объект:

«Идентификатор Shape объекта» = «Идентификатор Ftab». ReturnValue(«Идентификатор поля Shape», номер записи).

В терминах программирования говорят, что функция ReturnLength возвращает длину линии, периметр полигона или длину окружность объекта типа Circle (окружность). Аналогичный синтаксис имеет функция ReturnArea, возвращающая площадь полигонального объекта.

Для расчётов расстояний между пространственными объектами служит функция Distance, имеющая следующий синтаксис:

«Идентификатор результата» = «Идентификатор Shape объекта 1». Distance(«Идентификатор Shape объекта 2»)

Все три функции возвращают результат в тех координатах, в которых в памяти компьютера хранятся объекты Shape, т.е. в случае географических координат длины, расстояния и площади будут рассчитываться в градусах и квадратных градусах, что не имеет никакого смысла. Разумеется, можно записать векторные слои в шейпфайлы с координатами объектов в единицах проекции (т.е. метрах, километрах и т.д.), создать новый Вид, импортировать в него новые слои спроецированных объектов и уже к ним применять картометрические функции. Однако в этом случае уже будет невозможно «приноравливать» проекцию для каждого пространственного объекта, такой подход приемлем только в том случае, если масштаб карты в её пределах практически неизменен. К тому придётся «плодить» новые шейпфайлы спроецированных координат и Виды проекта. Поэтому более рационален подход, когда не создаётся новых шейпфайлов и Видов, а создаётся пространственный объект с координатами в единицах проекции только в памяти компьютера, и к этому объекту применяются картометрические функции. Такой подход позволяет изменять перед измерением каждого объекта параметры проекции для исключения искажений масштаба. Разумеется, это подходит только для измерений длин и площадей объектов, для исключения искажений расчётов расстояний между объектами следует создавать линейные объекты кратчайших расстояний между двумя точками, разбивать их на короткие объекты и уже к ним применять функцию ReturnLength.

Проецирование объектов, т.е. создание по старым объектам с координатами в географической системе новых объектов с координатами в декартовых единицах карты возможно с помощью функций QueryShape и ReturnProjected. Использование функции QueryShape «экономит» в программе один оператор. Синтаксис функции таков:

«Идентификатор FTab».QueryShape (номер записи таблицы FTab, «Идентификатор проекции Вида», «Идентификатор Shape-объекта»).

Идентификатор Shape-объекта с занесённым в него пространственным объектом уже должен существовать до посылки запроса QueryShape. Этот запрос находит Shape-объект в записи с данным номером в атрибутивной таблице FTab, проецирует его, т.е. переводит координаты из географических в декартовые в соответствии с характеристиками проекции Вида и помещает результат по адресу идентификатора Shape-объекта. Переменная с характеристиками проекции также должна уже существовать.

С помощью функции ReturnProjected получение спроецированного Shape-объекта осуществляется в два приёма. Сначала функция ReturnValue возвращает Shape-объект в географических координатах. Затем функция ReturnProjected на его основании создаёт новый спроецированный Shape-объект в декартовых координатах (единицах карты):

ShapePr = ShapeGeo. ReturnProjected (aPrj),

где ShapePr - идентификатор спроецированного Shape-объекта, ShapeGeo - идентификатор Shape-объекта в географических координатах, aPrj – идентификатор проекции.

Ниже приводятся листинги программ определения площадей объектов и расстояний между объектами. Текст в начале программ, совпадающий с текстом в начале программы создания маршрутных линейных объектов в теме 10, в котором создаётся список Видов проекта, опущен. Перед запуском программы в Свойствах Вида уже должны быть установлены те единицы карты, в которых должны быть рассчитаны площади объектов и расстояния между объектами.

Программа расчёта площадей объектов с изменениями параметров проекции

Данный вариант программы осуществляет расчёт площадей на карте в Стереографической проекции, применяемой для визуализации Северного Ледовитого океана и прилегающих территорий. В случае применения программы к Видам с другой проекцией следует модифицировать программу. Если же изменениями масштаба в пределах карты можно пренебречь, то программа упрощается, из неё удаляется блок, ответственный за пересчёт параметров проекции.

Выбор Вида с помощью диалогового окна:

theView=MsgBox.List(ViewList, "", "Выберите Вид")
thePrj=theView.GetProjection Запись проекции Вида и всех её параметров в объект thePrj. Этот объект понадобится только в том случае, если не будет производиться «подгонка» параметров проекции для каждого объекта
list_of_themes=theView.getThemes Получение списка всех тем (слоёв) Вида
theTheme = MsgBox.List(list_of_themes, "*.shp", " Выберите тему") Выбор темы
theFtab = theTheme.GetFtab Получение атрибутивной таблицы темы
theShapeField = theFtab.FindField("Shape") Создание идентификатора значений поля Shape в конкретных записях таблицы theFtab
theFTab.SetEditable(true) Установка возможности редактирования таблицы
fields = List.Make Создание пустого списка. Создание числового поля Area_km и его добавление в список. Естественно, предполагается, что единицы карты – километры. В случае метров уберите в названии поля символ «k».
fields.Add(Field.Make("Area_km", #FIELD_DECIMAL , 11, 2))
theFTab.AddFields(fields) 'Добавление списка полей fields с характеристиками поля Area_km в таблицу theFTab
AreaField = theFTab.FindField("Area_km") Создание идентификатора значений поля Area_km в конкретных записях таблицы theFTab. Создание пространственного объекта по данным, взятым в поле Shape первой записи таблицы theFTab, пока ещё в географических координатах
theShapePr = theFTab.ReturnValue(theShapeField, 0)
for each rec in theFTab Начало цикла по всем записям таблицы theFTab
theShape = theFTab.ReturnValue
(theShapeField, rec)
Получение пространственного объекта в текущей записи таблицы с номером rec
theMP=theShape.AsMultiPoint Превращение площадного theShape в многоточечный объект theMP – последовательность вертексов границы полигона
theVertexList = theMP.AsList Превращение многоточечного объекта в список точек вертексов
nvert=theVertexList.Count Подсчёт числа вертексов
for each t in 0..(nvert-1) Начало цикла по всем вертексам списка
tekt = theVertexList.Get(t) Получение текущей точки списка
tekx = tekt.GetX Получение значения координаты X точки списка - долготы
teky = tekt.GetY Получение значения координаты Y точки списка - широты
if (t=0) then
minx=tekx
maxx=tekx
miny=teky
maxy=teky
end
Если точка в списке первая, то минимальные и максимальные значения принимаются равными текущим
if (tekx<minx) then
minx=tekx
end
if (tekx>maxx) then
maxx=tekx
end
if (teky<miny) then
miny=teky
end
if (teky>maxy) then
maxy=teky
end
Переопределения крайних значений в случае необходимости
end Окончание цикла по всем вертексам объекта
sredy = (maxy+miny)/2
sredx= (maxx+minx)/2
Определение средних значений широты и долготы текущего объекта
r = Rect.MakeXY(-180,-90,180,90) Создание объекта прямоугольник на весь Земной шар
p = Stereographic.Make(r) Создание проекции
p.SetCentralMeridian(sredx) Установка центрального меридиана проекции на значение средней долготы текущего объекта
p.SetReferenceLatitude(sredy) Установка широты полюса истинных координат проекции значение средней широты текущего объекта
theView.SetProjection(p) Установка этой проекции для данного Вида. Таким образом, теперь плоскость проекции касается сферы в середине текущего объекта
theFTab.QueryShape(rec, p, theShapePr) Создание спроецированного объекта theShapePr по данным поля Shape текущей записи таблицы theFTab с номером rec и текущей проекцией p. Теперь объект theShapePr имеет декартовы координаты в километрах
tek_area=theShapePr.ReturnArea Получение значения площади
theFTab.SetValueNumber(AreaField, rec, tek_area)

end

Запись вычисленного значения в поле с идентификатором AreaField (т.е. Area_km) таблицы theFTab

Окончание цикла по всем записям таблицы theFTab

theFTab.Flush Запись изменений таблицы theFTab в файлы, являющиеся её источниками
theFTab.SetEditable(false) Запрещение редактирования таблицы theFTab

В случае необходимости расчётов длин линейных объектов необходимо только изменить названия полей результатов и функцию ReturnArea на ReturnLength.