Движение агентов в пространстве ГИС

Чтобы задать движение агентов в пространстве ГИС, вызовите функцию moveTo(), указав пункт назначения как аргумент функции. Существует несколько нотаций этой функции для различных случаев применения. Агенты в пространстве ГИС перемещаются по существующей транспортной сети: различным дорогам на карте. Если вы задали свою сеть с помощью объектов разметки пространства ГИС, агент будет перемещаться по нарисованным ГИС маршрутам. В ином случае, агент получит маршрут, отправив запрос на сервер поставщика маршрутов. Если между двумя точками не существует готового маршрута, агент сначала достигает ближайшей точки существующей сети по прямой линии, а затем движется по маршрутам к пункту назначения. Таким же образом, если маршруты транспортной сети не могут быть определены до самого места назначения, агент движется по сети до ближайшей к цели точки, а затем движется напрямую к цели.  

Движение в местоположение на карте

Чтобы задать пункт назначения для агента в ГИС пространстве, вам не обязательно добавлять какие-либо объекты разметки пространства ГИС на карту, вы можете использовать встроенный поиск по карте, который получает данные с сервера. Проще всего отправить агента в какое-то конкретное место на карте можно с помощью функции moveTo(String geographicPlace). Например, для грузовика truck вы можете вызвать функцию truck.moveTo("Лондон"). В этом случае грузовик поедет в указанное место по существующему маршруту (как правило, по существующей дороге). Маршрут для модели будет также загружен с сервера.

Движение в ГИС Точку

Если вы хотите уменьшить количество обращений на сервер при каждом перемещении агентов по карте, вы можете создать сеть объектов разметки пространства ГИС, чтобы отметить все местоположения и маршруты на карте, требуемые для модели, и затем послать агента в любую созданную вами ГИС Точку или ГИС Регион с помощью функции moveTo(node), например, truck.moveTo(gisPointLondon)

Движение в точку с заданными координатами

Вы можете задать движение агента в точку с заданными координатами:

moveTo(double latitude, double longitude)- вызывает движение в определенную точку на карте
Параметры:
latitude - координата широты, измеряемая в градусах (-90 ... (South) ... 0 ... (North) ... +90))
longitude - координата долготы, измеряемая в градусах (-180 ... (West) ... 0 ... (East) ... +180)) 

Движение в местоположение другого агента

Чтобы задать движение одного агента в местоположение другого, вызовите функцию moveTo(agent), где agent - имя другого агента. 

Если вам требуется переместить агента к ближайшему агенту другой популяции, вызовите функцию: moveToNearestAgent(population), где population - имя популяции агентов. Например, вы хотите, чтобы агент truck направился к ближайшей заправочной станции. Если заправочные станции заданы как популяция gasStations, вы можете просто вызвать следующую функцию для грузовика
truck.moveToNearestAgent(gasStations);

Перемещение агента за заданное время 

Для всех функций агента moveTo() существуют аналогичные функции moveToInTime(), которые предоставляют возможность задавать для агента конкретное время, за которое он должен достичь пункта назначения. При вызове функции moveToInTime(), агент будет перемещаться со скоростью, которая потребуется, чтобы достичь пункта назначения за время, указанное в качестве аргумента функции.

Пример: 
truck.moveToInTime(londonAgent, 25)
- Вызов этой функции инициирует движение агента truck в местоположение агента londonAgent, расстояние до которого он должен преодолеть за 25 единиц модельного времени.

Вы можете задавать время в пути не только в единицах модельного времени, но и в любых реальных единицах времени, указывая их как последний аргумент функции. Это может быть одна из следующих констант: 

MILLISECOND

SECOND

MINUTE

HOUR

DAY

WEEK

MONTH

YEAR

миллисекунда

секунда

минута

час

день

неделя

месяц

год


Пример:
 
truck.moveToInTime("London", 25, MINUTE) - Вызов этой функции инициирует движение агента truck в город на карте London, расстояние до которого он должен преодолеть за 25 минут.

Управление движением

Вы можете контролировать движение агента с помощью следующих функций. Далее, имеются методы для получения информации о текущем местоположении и расстоянии:

stop() останавливает агента (если он двигался); агент остается при этом в том же месте, и действие При достижении точки назначения не выполняется.

boolean isMoving()проверяет, движется ли агент в данный момент времени.

double timeToArrival()если агент движется, то возвращает время (в единицах модельного времени), нужное ему для того, чтобы прибыть в место назначения, с учетом того, что скорость не изменится. Если агент не движется, возвращает 0.

double distanceTo(Agent other)возвращает расстояние до указанного агента other (в метрах)

double getGISHeading() - возвращает текущий угол поворота агента (в радианах, по часовой стрелке, нулевому углу соответствует положение часовой стрелки, показываюшей на двенадцать часов)..

double getLat()возвращает широту текущего местоположения, измеряемую в градусах (-90 ... (South) ... 0 ... (North) ... +90)).

double getLon() - возвращает долготу текущего местоположения, измеряемую в градусах  (-180 ... (West) ... 0 ... (East) ... +180)).

double getX() - аналогична функции getLat()

double getY() - аналогична функции getLon()

double getTargetLat()возвращает широту местоположения цели агента, если он движется, иначе его текущую широту в ГИС пространстве, измеряемую в градусах (-90 ... (South) ... 0 ... (North) ... +90).

double getTargetLon() - возвращает долготу местоположения цели агента, если он движется, иначе его текущую долготу в ГИС пространстве, измеряемую в градусах (-180 ... (West) ... 0 ... (East) ... +180).

double getTargetX() - аналогична функции getTargetLat()

double getTargetY() - аналогична функции getTargetLon()

Мгновенное перемещение / Расположение агентов в новом месте

Вы можете мгновенно перемещать агентов в новое местоположение (агент перемещается т.н. "прыжком") с помощью функции jumpTo(). Если эта функция вызывается, когда агент уже находится в движении, то он перестает двигаться и затем "прыгает" в новое местоположение. Обратите внимание, что функция jumpTo() отличается от функции setLocation(). Функция setLocation() используется, чтобы задать начальное расположение агентов на карте ГИС еще до запуска самого эксперимента модели, и поэтому обычно задается в коде агента верхнего уровня При запуске. А функция jumpTo() используется, чтобы перемещать агентов во время запуска модели. 

У функции jumpTo(), как и у функций moveTo() и moveToInTime(), есть несколько нотаций:

jumpTo(String geographicPlace) - немедленно помещает агента в заданное место на карте. Когда вы вызываете эту функцию, AnyLogic находит место на карте по указанному имени (то есть, использует первый результат из списка результатов поиска) и помещает туда агента.
Пример: truck.jumpTo("London");

jumpTo(node)
- немедленно помещает агента в заданную ГИС точку или ГИС регион. 
Пример:
 truck.jumpTo(londonNode);

jumpTo(double latitude, double longitude)немедленно помещает агента в точку с заданными координатами.
Параметры:
latitude - координата широты, измеряемая в градусах (-90 ... (South) ... 0 ... (North) ... +90))
longitude - координата долготы, измеряемая в градусах (-180 ... (West) ... 0 ... (East) ... +180)) 
Пример: truck.jumpTo(51.3 , 0.7);