Skip to content

New architecture: use of GNM RU

MikhanGusev edited this page Nov 8, 2014 · 20 revisions

##Приблизительная схема нового движка

###До работы сервиса

  1. Модификация исходных данных Модификация шейп-файлов с исходными данными (добавление / изменение объектов на станциях)
  2. Модификация сетевых данных Чтобы не делать Python-байндинги на основные методы по созданию или изменению сети, можно вызывать приложение gnmmanage для подготовки графов разных профилей. Требуется вызов следующих команд: create, import, rule, autoconnect.
  3. Запуск питоновского процесса для обработки запросов пользователей
  4. [Питон] Инициализация сети gnm.GdalNetwork
  5. [Питон] gnm.GdalStdAnalyser.PrepareGraph(gnm.GdalNetwork). В памяти окажется граф пригодный для анализа.

###Работа сервиса

  1. Запрос пользователя с указанием GFID входа и выхода, профиля, ...
  2. Парсинг запроса на сервере, получение параметров.
  3. [Питон] gnm.GdalStdAnalyser.Dijkstra(параметры). Получение массива GFID объектов кратчайшего пути.
  4. [Питон] gnm.GdalNetwork.GetFeatureByGFID() для каждого требуемого объекта и требуемый постпроцессинг: суммарное кол-во ступеней, ... Использование некого питоновского скрипта для этого.
  5. Формирование JSON (GeoJSON) для ответа на клиент
  6. Разбор полученного JSON на клиенте и: отрисовка, вывод информации по пути, ...

##Список Python методов GNM на примере их использования

from osgeo import gnm

  1. GdalOpenNetwork. Открытие сети по заданному пути path. Возвращает открытую сеть.

    network = gnm.GdalOpenNetwork(path)

  2. new_GdalStdAnalyser. Инициализация класса для анализа. Возвращает объект с пустым графом.

    analyser = gnm.new_GdalStdAnalyser()

  3. GdalStdAnalyserPrepareGraph. Подготовка граф сети network для анализа c заполнением внутренних массивов analyser. Возвращает 0, если блокировка прошла успешно, иначе возвращает код ошибки.

    err = gnm.GdalStdAnalyserPrepareGraph(analyser,network)

  4. GdalStdAnalyserDijkstra. Расчёт кратчайшего пути для графа в объекте analyser от вершины from до вершины to по алгоритму Дейкстры. Возвращает кортеж (tuple), элементы которого - кортежи, содержащие каждый по паре чисел: GFID (уникальный идентификатор) вершины и GFID ребра, ведущего к этой вершине. Элементы в возвращаемом кортеже упорядочены по пути, где первая пара - это (from, -1), а последняя - (to, <некое ребро>). Если путь был не найден, то кортеж будет пустым.

    path = gnm.GdalStdAnalyserDijkstra(analyser,from,to)

  5. GdalGetFeatureByGFID. Получение объекта с идентификатором gfid сети network. Возвращает объект типа Feature (OGRFeature), см http://gdal.org/python/ в разделе osgeo.ogr. Можно использовать для: чтения геометрий и атрибутов объекта сети.

    from osgeo import ogr

    feature = gnm.GdalGetFeatureByGFID(network,gfid)

  6. GdalGetDataset. Получение источника данных, лежащего в основе сети network. Возвращает объект типа DataSource (GDALDataset или OGRDataSource?), см http://gdal.org/python/ в разделе osgeo.ogr. Можно использовать для: чтения системных слоёв (например _gnm_graph, _gnm_rules, _gnm_meta) или слоёв с данными (классовых слоёв).

    dataset = gnm.GdalGetDataset(network)

  7. GdalStdAnalyserBlockVertex, GdalStdAnalyserUnblockVertex. Блокировка / разблокировка вершины vertex (передаётся её GFID) в графе объекта analyser. Такая вершина не будет / будет участвовать в трассировке сети, например при вызове метода GdalStdAnalyserDijkstra (если вершина заблокирована - это аналогично разрыву в графе). Возвращает 0, если блокировка прошла успешно, иначе возвращает код ошибки.

    err = gnm.GdalStdAnalyserBlockVertex(analyser,vertex)

    err = gnm.GdalStdAnalyserUnblockVertex(analyser,vertex)

Синтаксис правил GNM

class1,class2,class3 - любые имена классов (не системные слои OGRLayer в данной сети), даже повторяющиеся или отсутствующие; field1 - любое название поле (атрибута), даже отсутствующее; constant1 - любая вещественная константа; string1 - любая строка.

Правила для задания весов рёбер при соединении объектов классов. При ручном или автоматическом соединении веса будут браться из соответствующих атрибутов соединяемых объектов и/или вычисляться из заданных константных значений. Если правила для каких-либо классов не заданы, то веса берутся равными 0 при автоматическом соединении и равные заданным - при ручном.

CLASS class1 COSTS field1

CLASS class1 COSTS constant1

CLASS class1 COSTS field1 + constant1

CLASS class1 COSTS field1 - constant1

CLASS class1 COSTS field1 * constant1

CLASS class1 COSTS field1 / constant1

Правила для задания обратных весов рёбер при соединении объектов классов. Аналогично COSTS. Внимание: метод GdalStdAnalyserDijkstra не учитывает обратные веса в графе, т.к. обход вершин в этом методе может быть только от начальной к конечной.

CLASS class1 INVCOSTS field1

CLASS class1 INVCOSTS constant1

CLASS class1 INVCOSTS field1 + constant1

CLASS class1 INVCOSTS field1 - constant1

CLASS class1 INVCOSTS field1 * constant1

CLASS class1 INVCOSTS field1 / constant1

Правила для задания направлений рёбер при соединении объектов классов. При ручном или автоматическом соединении объектов направление ребра берётся из атрибута field1 соединяемых объектов. Возможные значения: 0 - двунаправленное ребро, 1 - однонаправленное (от начальной вершины к конечной).

CLASS class1 DIRECTS field1

Правила для задания ролей, которые можно учесть при анализе. Аналогично простым текстовым меткам для всего класса, могут быть использованы для различного рода анализа, например для указания, что тот или иной объект играет роль "источника" в водопроводной сети.

CLASS class1 BEHAVES string1

Правила возможности соединения объектов классов. Указывают какие классы с какими (CONNECTS ... WITH) и через какие (VIA) соединять разрешено. class1 и class2 играют роли вершин (те, кого соединяют), а class3 - ребра (тот, через кого соединяют) в будущем возможном соединении. Если ни одного правила для конкретного класса во всей сети не задано, то такой объект может быть соединён со всеми и через все.

NETWORK CONNECTS class1 WITH class2

NETWORK CONNECTS class1 WITH class2 VIA class3