Содержание

Описание формата загрузки и выгрузки формат GJR(GeoJSONRelation)

Формат

Формат загрузки Airlay GJR(GeoJson Relation) основан на формате RFC7946 GeoJson. Были добавлены в формат relations и необязательность задачи геометрии для объектов, которые строятся на основе других объектов через relations.

Поля

«geometry»: данное поле задаётся в рамках RFC7946. Предпочтительный формат «Point», «LineString», «Polygon», «MultiPolygon». Но, возможно использование «GeometryCollection» это можно использовать для построения сложных геометрических объектов состоящих из множества различных объектов, но являющийся в атрибутивном отношении одним. К примеру можно задать точку, полигон и линия в одном объекте с одними атрибутивными значениями. Не все части ГИС поддерживают работу с «GeometryCollection».

«Polygon» должен быть обязательно зацикленным начинаться и заканчиваться на одну и ту же координату, не иметь самопересечений. «LineString» - должна состоять хотя бы из 2 точек. Координаты первые координаты -180 180; вторые -90 90;

Координаты могут быть не заданы при наличии объектов «relations» тогда геометрия наследуется у объектов от которых зависит и, которые находятся ниже по иерархии. К примеру опоры для линии. Если же не заданы «relations», «geometry» то объект уходит в «toDoList» c WARNING-ом. И сохраняется как relation.

Системные поля

«relations»: Объект задаёт связи между объектами.

«deleted»: Необязательное поле, если true, объект будет удален из базы данных.

«objectId»: Уникальный идентификатор объекта, алгоритм ищет объект с этим id в файле и затем в связанных слоях, если объект не обнаружен то во время загрузки появится WARNING о том что связь не была создана.

Иерархия между объектами строится за счёт relations. Если в объекте указан relations на другие объекты то текущий объект находиться в иерархии выше чем указанные в нём объекты.

Формат Features

3) Features - коллекция в которой хранятся геометрические объекты с их свойствами в формате GeoJSON с нашими полями в systemProperties.

JSON

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "key": "value"
      },
      "system": {
        "relations": [
          {
            "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa1c9"
          },
          {
            "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa142"
          }
        ],
        "operation": "delete"/"create"/"relationUpdate"/"coordinatesUpdate"
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              42.73633,
              44.40153
            ],
            [
              42.73696,
              44.40228
            ],
            [
              42.73797,
              44.40185
            ],
            [
              42.73732,
              44.4011
            ],
            [
              42.73633,
              44.40153
            ]
          ]
        ]
      }
    }
  ]
}

Для удаления объекта, значение properties.id(уникальное поле) должно соответствовать удаляемому объекту:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "id": "value"
      },
      "system": {
        "relations": [
          {
            "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa1c9"
          },
          {
            "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa142"
          }
        ],
        "operation": "delete"/"create"/"update"/"relationUpdate"/"coordinatesUpdate"
      },
      "geometry": {
        "type": "Polygon"
      }
    }
  ]
}

Иерархическая связность объектов.

Данный параметр является необязательным в формате и используется для специфических бизнес задач.

Для добавления иерархических связей, необходимо задать массив связей «hierarchy». Один набор данных может содержать несколько различных связей.

Объект иерархии содержит:

«name» : string уникальное название иерархии и массив связей «links».

«links» содержит объекты связей уникальный идентификатор «objectId», с кем связан объект и тип связи.

«children» задание дочернего объекта, который содержится в родительском(текущем объекте).

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "id": "value"
      },
      "system": {
        "relations": [
          {
            "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa1c9"
          },
          {
            "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa142"
          }
        ],
        "hierarchy" : [
           {
              "name" : "direct",
              "links" : [
                {
                  "type" : "children",
                  "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa1c9"
                },
                {
                  "type" : "children",
                  "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa1c9"
                }
              ]           
           },
           {
              "name" : "cim",
              "links" : [
                {
                  "type" : "children",
                  "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa1c9"
                },
                {
                  "type" : "children",
                  "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa1c9"
                }
              ]           
           },
        ]
        "operation": "delete"/"create"/"update"/"relationUpdate"/"coordinatesUpdate"
      },
      "geometry": {
        "type": "Polygon"
      }
    }
  ]
}

MayBeLineString

«MayBeLineString», который задаёт проверку, если это LineString, то делаем его LineString, если можно построить MultiLineString то используем его, если есть в ссылках точки, то тоже пытаемся их строить. Для типов LineString и MultiLineString, если мы не можем однозначно построить объект то выдаём ошибку и не строим.

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "id": "value"
      },
      "system": {
        "relations": [
          {
            "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa1c9"
          },
          {
            "objectId": "37afa850-82bc-4692-b7c7-e7a1bc4aa142"
          }
        ],        
        "operation": "delete"/"create"/"update"/"relationUpdate"/"coordinatesUpdate"
      },
      "geometry": {
        "type": "MayBeLineString"
      }
    }
  ]
}

LineString и MultiLineString

«LineString», если собственной геометрии не задано, то обязан ссылаться только на Point объекты, в противном случаи идёт ошибка. Если образуется MultiLineString объект, выдавать ошибку.

«MultiLineString», если собственной геометрии не задано, то обязан ссылаться только на LineString или другие MultiLineString объекты, в противном случаи идёт ошибка.

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "id": "value"
      },
      "system": {
        "relations": [
          {
            "objectId": "37afa850-line-id-1"
          },
          {
            "objectId": "37afa850-multiline-id-1"
          }
        ],        
        "operation": "delete"/"create"/"update"/"relationUpdate"/"coordinatesUpdate",
        //Если задан полигон
        "barycenter": 
         {
          "type": "Point", 
          "coordinates": [42.73633, 44.40153]
         },
         //Если задан мульти полигон полигон
         "barycenter": 
         {
          "type": "MultiPoint", 
          "coordinates": [
           [42.73633, 44.40153],
           [42.83633, 44.50153]
          ]
         }
      },
      "geometry": {
        "type": "MultiLineString"
      }
    },
    {
      "type": "Feature",
      "properties": {
        "id": "37afa850-line-id-1"
      },
      "system": {
        "relations": [
          {
            "objectId": "37afa850-point-id-1"
          },
          {
            "objectId": "37afa850-point-id-2"
          }
        ],        
        "operation": "delete"/"create"/"update"/"relationUpdate"/"coordinatesUpdate"
      },
      "geometry": {
        "type": "LineString"
      }
    },
    {
      "type": "Feature",
      "properties": {
        "id": "37afa850-point-id-1"
      },
      "system": {
        "relations": [
        ],        
        "operation": "delete"/"create"/"update"/"relationUpdate"/"coordinatesUpdate"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          85.3538402166585,
          51.9571677261215
        ]
      }
    }
  ]
}

Опции для задания стилей

В поле «system» можно дополнительно передать объект опции «options», который может содержать стили слоя для объекта. При задании конкретных стилей, объект перезапишет нужные стили в слое. Следовательно, можно задать не все стили в опциях, а только необходимые.

"options" : {
        "lineOptions" : {
            "color" : "#006b00",
            "weight" : 3,
            "opacity" : 1,
            "maxZoom" : 30,
            "minZoom" : 10,
            "dashArray" : 0,
            "isDash" : false
        },
        "multiPolygonOptions" : {
            "color" : "#006b00",
            "weight" : 4,
            "opacity" : 1,
            "fillOpacity" : 0.5,
            "maxZoom" : 30,
            "minZoom" : 10,
            "convertToPointZoom" : 0,
            "dashArray" : 0,
            "isDash" : false
        },
        "pointOptions" : {
            "markerType" : "marker",
            "maxZoom" : 30,
            "minZoom" : 10,
            "iconOptions" : {
                "iconUrl" : "https://unpkg.com/leaflet@1.3.4/dist/images/marker-icon.png",
                "iconSize" : [ 
                    25, 
                    41
                ],
                "iconAnchor" : [ 
                    20, 
                    40
                ]
            },
            "markerOptions" : {
                "type" : "circle",
                "radius" : 4,
                "numberOfSides" : 3,
                "rotation" : 0,
                "color" : "#006b00",
                "weight" : 4,
                "fillOpacity" : 0.5,
                "fillColor" : "#006b00",
                "dashArray" : 0,
                "isDash" : false
            }
        }
    }