AnyLogic
Развернуть
Размер шрифта

Программное создание сети ГИС

Иногда вам может понадобиться создать сеть ГИС с помощью программного кода.

Обратите внимание, что созданную программно сеть нельзя будет изменять динамически во время выполнения модели.

В этой статье мы рассмотрим код из следующей модели:

Демо-модель: Create GIS Network by Code Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

Мы создадим ГИС сеть, состоящую из двух ГИС точек, связанных ГИС маршрутом. ГИС маршрут состоит из двух сегментов. В этой демо модели поезд добавляется в ГИС сеть в одной ГИС точке и перемещается по ГИС маршруту в другую ГИС точку.

ГИС сеть создается программно с помощью Java кода в функции createRoute, которая вызывается из действия При запуске агента Main (в секции свойств Действия агента):

Пример кода

// Создание и инициализация ГИС точек
GISPoint gp1 = new GISPoint( map, 60.19, 24.94 );
GISPoint gp2 = new GISPoint( map, 59.92, 25 );
GISPoint gp3 = new GISPoint( map, 59.43, 24.95 );
gp1.initialize();
gp2.initialize();
gp3.initialize();

// Создание сегментов ГИС маршрута
GISMarkupSegmentLine segment1 =
new GISMarkupSegmentLine( gp1.getLatitude(), gp1.getLongitude(), gp2.getLatitude(), gp2.getLongitude() );
GISMarkupSegmentLine segment2 =
new GISMarkupSegmentLine( gp2.getLatitude(), gp2.getLongitude(), gp3.getLatitude(), gp3.getLongitude() );

// Создание и инициализация кривой
Curve curve = new Curve();
curve.addSegment( segment1 );
curve.addSegment( segment2 );
curve.initialize();

// Создание ГИС маршрута
GISRoute gr = new GISRoute( map, curve, gp1, gp3, true );
gr.initialize();

// Создание ГИС сети
GISNetwork n = new GISNetwork( map, "n", true, gp1, gp2, gp3, gr );

Объяснение кода

Создание ГИС точек

Вначале мы создаем три ГИС точки. У конструктора класса GISPoint три аргумента: имя ГИС карты, на которую мы добавляем ГИС точку (в нашей модели это map), а также широта и долгота данной ГИС точки.

GISPoint gp1 = new GISPoint( map, 60.19, 24.94 );
GISPoint gp2 = new GISPoint( map, 59.92, 25 );
GISPoint gp3 = new GISPoint( map, 59.43, 24.95 );

Затем мы инициализируем созданные элементы с помощью функции initialize().

gp1.initialize();
gp2.initialize();
gp3.initialize();

Создание ГИС маршрута

После этого мы создаем ГИС маршрут.

Для этого вначале создаются сегменты ГИС маршрута, затем создается кривая, в которую добавляются эти сегменты, и наконец создается сам ГИС маршрут, в конструктор которого передается эта кривая в качестве одного из аргументов.

Наш ГИС маршрут состоит из двух сегментов. Каждый сегмент маршрута создается с помощью конструктора класса GISMarkupSegmentLine. У этого конструктора четыре аргумента: широта и долгота начальной точки сегмента, а также широта и долгота его конечной точки.

GISMarkupSegmentLine segment1 = new GISMarkupSegmentLine( gp1.getLatitude(), gp1.getLongitude(), gp2.getLatitude(), gp2.getLongitude() );
GISMarkupSegmentLine segment2 = new GISMarkupSegmentLine( gp2.getLatitude(), gp2.getLongitude(), gp3.getLatitude(), gp3.getLongitude() );
Для создания сегментов маршрута ГИС с помощью кода можно также использовать конструктор, принимающий пятый аргумент: isGeodesic. Если этот аргумент равен true, то анимация движения агентов, перемещающихся по карте ГИС, воспроизводится на основе так называемых геодезических линий. Если этот аргумент равен false, то агенты движутся между точками по прямым геометрическим линиям.
Если использовать конструктор без этого аргумента, то по умолчанию рисуются сегменты на основе геодезических линий (т.е. isGeodesic == true.)

Затем мы создаем кривую, добавляем в нее созданные сегменты маршрута в порядке их следования от начальной к конечной точке ГИС маршрута, и инициализируем эту кривую.

Curve curve = new Curve();
curve.addSegment( segment1 );
curve.addSegment( segment2 );
curve.initialize();

После этого мы создаем собственно ГИС маршрут и инициализируем его. У используемого нами конструктора класса GISRoute пять аргументов: ГИС карта, созданная нами кривая, начальная и конечная точки маршрута, а также аргумент типа boolean, определяющий, является ли маршрут двунаправленным (мы разрешаем движение по нему в обоих направлениях, передав этому аргументу значение true).

GISRoute gr = new GISRoute( map, curve, gp1, gp3, true );
gr.initialize();

Создание ГИС сети

Создав все элементы нашей сети, пришло время создать и саму ГИС сеть, добавив в нее эти элементы. В конструкторе класса GISNetwork мы указываем ссылку на ГИС карту, передаем имя сети, делаем сеть видимой, передав значение true аргументу visible, который идет следом, а затем перечисляем все элементы разметки пространства, из которых будет состоять данная ГИС сеть:

GISNetwork n = new GISNetwork(map, "n", true, gp1, gp2, gp3, gr);
Как мы можем улучшить эту статью?