Главное меню

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



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

 

Программа расчёта расстояний между единственным объектом одной темы и всеми объектами другой темы

Эта программа применима только в том случае, когда можно пренебречь неоднородностью масштаба в пределах карты. Её вполне можно применять, если расстояния между объектами составляют десятки или первые сотни километров. При больших расстояниях требуется другая методика. Но для случаев масштабов, например, Кольского полуострова, Республики Карелии или нескольких смежных регионов средних размеров (Ленинградская, Новгородская, Псковская области) она может применяться. Размерность объектов несущественна: это могут быть точки, линейные или площадные объекты, но в случае обработки результатов геоэкологических исследований чаще всего тема многих объектов будет темой точек отбора проб.

theView=MsgBox.List(ViewList, "", "Выберите Вид")
thePrj = theView.GetProjection Определение проекции Вида
list_of_themes=theView.getThemes Получение списка тем Вида
Theme1 = MsgBox.List(list_of_themes, "*.shp", "Выберите тему с одним объектом") Выбор темы с одним объектом
Ftab1=Theme1.GetFtab Получение атрибутивной таблицы темы одного объекта
Shape1=Ftab1.findfield("Shape") Получение идентификатора поля Shape этой таблицы
obj1 = Ftab1.returnvalue(Shape1, 0) Получение этого единственного пространственного объект
obj1pr = obj1.ReturnProjected(thePrj) Проецирование объекта
Theme2 = MsgBox.List(list_of_themes, "*.shp", "Выберите тему объектов") Выбор темы многих объектов, для которых будут рассчитаны расстояния до одного объекта первой темы
Ftab2=Theme2.GetFtab Получение атрибутивной таблицы темы многих объектов
Shape2=Ftab2.findfield("Shape") Получение идентификатора поля Shape этой таблицы
Ftab2.SetEditable(true) Установка возможности редактирования этой таблицы
fields = List.Make Создание пустого списка
fields.Add(Field.Make("Rasst_km", #FIELD_DECIMAL , 8, 2)) Создание поля Rasst_km и его добавление в список
FTab2.AddFields(fields) Добавление поля Rasst_km в таблицу FTab2
RasstField = FTab2.FindField("Rasst_km") Создание идентификатора поля Rasst_km
for each rec in Ftab2 Цикл по всем записям таблицы Ftab2
obj2 = Ftab2.returnvalue(Shape2, rec) Получение текущего объекта таблицы
obj2pr = obj2.ReturnProjected(thePrj) Проецирование объекта
rasst=obj2pr.Distance(obj1pr) Расчёт расстояния между проецированными объектами
FTab2.SetValueNumber(RasstField, rec, rasst) Запись результата в таблицу FTab2
end
FTab2.Flush Запись изменений таблицы theFTab в файлы, являющиеся её источниками
FTab2.SetEditable(false) Запрещение редактирования таблицы theFTab

Теперь рассмотрим вопрос, как измерять большие расстояния, когда уже нельзя пренебрегать шарообразностью Земли и как проводить линии кратчайших расстояний. Естественно, что кратчайшее расстояние между двумя точками – это прямая линия. Однако на поверхности сферы могут быть только кривые линии. Наикратчайшей будет линия, представляющая собой отрезок окружности с наибольшим радиусом, т.е. радиусом самой сферы. Таким образом, кратчайшая линия между двумя точками на сфере образуется пересечением сферы плоскостью, проходящей через эти две точки и центр сферы. Нетрудно убедиться, что радиус окружности, сегментом которой является линия на поверхности сферы между двумя точками, является радиусом самой сферы.

Существует Гномоническая проекция, обладающая замечательным свойством: в ней прямые линии между двумя точками являются линиями пересечения сферы плоскостями, проходящими через центр сферы, и, таким образом, линиями кратчайших расстояний. Карта в этой проекции образуется следующим образом. Плоскость карты касается сферы в какой-либо одной точке. Из центра сферы проводятся лучи, проецирующие точки с поверхности сферы на плоскость карты. Линия кратчайшего расстояния между двумя точками имеет название ортодромии. Естественно, что на картах других проекций ортодромия уже не будет иметь вид прямой линии. При проектировании дороги, трубопровода, ЛЭП, маршрута движения морского или воздушного судна сначала следует создавать линейный объект, представляющий собой ортодромию между двумя точками. Уже затем этот маршрут корректируется в зависимости от других факторов: степени сложности прокладки дороги и т.п., соображений охраны окружающей среды и т.д.

Однако ортодромия характеризуется переменным азимутом. Вспомним, что азимут – это угол между данным направлением и направлением на географический полюс (истинный азимут) или на магнитный полюс (магнитный азимут). Естественно, что бессмысленно менять азимут маршрута движения или строительства объекта через каждый километр. Необходимо перенести ортодромию на карту такой проекции, в которой прямыми являются линии постоянного азимута (направления) и аппроксимировать ломаной линией, состоящей из отрезков прямых. Размеры этих отрезков зависят от того, какое отклонение от ортодромии, вернее, увеличение маршрута допустимо. Естественно, что для электронной карты следует просто изменить проекцию. Соединяющая две точки линия постоянного направления носит название локсодромии. Она совпадает с ортодромией только в тех случаях, когда две точки расположены на экваторе или одном меридиане. Во всех остальных случаях локсодромия длиннее ортодромии.

Проекция, в которой локсодромии изображаются прямыми линиями, это Меркаторская проекция. В ней создаются морские навигационные карты. Это цилиндрическая проекция. В ней сфера «обёрнута» цилиндром таким образом, что ось цилиндра совпадает с осью вращения Земли, цилиндр либо касается сферы на экваторе, либо «прорезает» сферу по двум равноотстоящим от экватора параллелям. Экватор (или две параллели) – это место истинного масштаба. Параллели и меридианы образуют в ней прямоугольную сетку, причём масштаб резко увеличивается к полюсу, который в принципе в этой проекции отобразить невозможно. Внешний вид Мира в этой проекции очень приятен сердцу русского человека: Кольский полуостров по площади соизмерим с Францией, Новая Земля превосходит Италию, а Северная – Британские острова, Таймыр даже больше Индостана. Ложкой дёгтя служит то, что Аляска по размеру близка половине остальных США (возникает резкое осуждение Александра II за её продажу), а Гренландия чуть меньше Сибири и больше Африки. Все эти «географические фокусы» объясняются просто: масштаб очень сильно увеличивается от экватора к полюсу. Так, на параллели 60º (параллель Санкт-Петербурга) линейный масштаб по сравнению с экватором увеличивается в 2 раза, на параллели 70º (немного севернее Мурманска) – в 2.92 раза, а на параллели 80º (юг Земли Франца-Иосифа) в 5.76 раза. Соответственно масштаб площадей на 60-ой параллели увеличится в 4 раза, 70-й – в 8.55 раз, а на 80-й – в 33.16 раз!

Может возникнуть вопрос: «Зачем нужна проекция со столь колоссальными искажениями?». Ответ простой – она очень удобна для навигационных целей. Чтобы добраться из точки А в точку Б, достаточно провести на карте в Меркаторской проекции линию между этими точками и измерить угол между этой прямой и вертикальной линией сетки (меридианом), т.е. азимут с точки А на точку Б. Затем остаётся двигаться постоянно по этому азимуту и Вы обязательно попадёте в точку Б. Правда, этот путь будет длиннее, чем по ортодромии.

Подытожим алгоритм создания кратчайших линий. Сначала она строится в гномонической проекции. Чтобы затем при преобразованиях проекций линия не «съехала в сторону», имеет смысл выполнение операции сгущения вертексов с помощью функции ReturnDensified. Эта функция создаёт новый линейный объект, в котором вертексы расставлены через заданное пользователем расстояние:

«Идентификатор нового объекта» = «Идентификатор старого линейного объекта». ReturnDensified(«Размер шага»).

В результате ни один сегмент нового линейного объекта не будет длиннее, чем «Размер шага». Также эта функция понадобится для создания объектов малой протяжённости. Затем проекция Вида преобразуется в Меркаторскую. Создаётся новый слой одного линейного объекта – близкой к ортодромии ломаной линии. Каждый её сегмент – линия постоянного направления. Штурману или прорабу придётся теперь менять азимут движения в вертексах этой линии. Длина отрезков ломаной определяется из соображений достаточности близости к ортодромии, чтобы с одной стороны увеличение расстояния по сравнению с ортодромией было не существенно, а с другой количество точек смены направления не было чрезмерным. Далее уже к этому линейному объекту применяется функция сгущения вертексов таким образом, чтобы длина сегментов позволяла рассматривать их как отрезки прямой на плоскости. Затем этот каждый сегмент преобразуется в отдельный объект и к слою применяется программа расчёта длин объектов с подгонкой проекции для каждого объекта. Разумеется, если нам нужно получить не протяжённость маршрута, а кратчайшее расстояние между объектами, то программа расчёта длин применяется к первоначальной линии, созданной в гномонической проекции.

Для наглядности выполним следующий эксперимент. Его можно сделать в копиях проектов world.apr или russia.apr. Представим, что нам нужно проложить курс полёта самолёта из Санкт-Петербурга в Магадан. Оба города расположены на 60-ой параллели. Поэтому первая идея, которая может придти в голову: «Лететь строго на восток». В этом случае локсодромия совпадает с 60-ой параллелью. Установим проекцию Вида на Меркаторскую и создадим новую тему с одним объектом – локсодромией, т.е. прямой линией от Санкт-Петербурга до Магадана. Теперь преобразуем проекцию в Гномоническую. Мы обнаружим, что локсодромия превратилась в кривую и что она отнюдь не является кратчайшим расстоянием. Создадим новую линейную тему – кратчайшего пути в Гномонической проекции, т.е. ортодромию. Мы увидим, что эта прямая сильно «забирается» на север: она проходит над северной оконечностью полуострова Ямал и островом Диксон в Карском море. Преобразуйте проекцию обратно в Меркаторскую. Вы увидите, что локсодромия снова стала прямой, а ортодромия превратилась в кривую, которая кажется гораздо длиннее локсодромии. Создайте ломаную линию, аппроксимирующую ортодромию – вдоль этой линии должен лететь самолёт.

Задание № 14.1.

Работаем с копией проекта с:\esri\esridata\russia.apr.

Рассчитать с помощью приведенной программы вычисления площадей площадь каждого из регионов Российской Федерации.

Вычислить расстояние от Москвы до каждого региона Российской Федерации.

Вычислить расстояние от Санкт-Петербурга до остальных центров регионов Северо-Западного федерального округа.

Краткие указания к выполнению задания.

Создайте тему одного объекта – Москвы. В теме «Населенные пункты» выберите Москву и преобразуйте тему в шейпфайл с одним этим объектом. Добавьте созданный шейпфайл в Вид как новый слой. Закройте Вид, в окне Проекта сделайте активным тип документов «Тексты программ», далее нажмите кнопку «Новый». После этого Вам необходимо загрузить из отдельного текстового файла или набрать в ручную программу, измеряющую площади объектов. Откомпилируйте ее и запустите, последовательно выбирайте Вид «Российская Федерация» и тему «Административные регионы», когда программа Вас об этом спросит. Итак, площади посчитаны и записаны в виртуальную таблицу темы «Административные регионы». Далее Вам необходимо открыть новое окно для следующей программы и загрузить в него или набрать вручную программу измерения расстояний от единственного объекта до многих объектов другой темы. Откомпилируйте ее и запустите, последовательно выбирайте Вид «Российская Федерация», темы «Москва» и «Административные регионы». Выполните расчёт расстояний в разных проекциях карты. Сравните результаты.