====== Описание формата загрузки и выгрузки формат GJR(GeoJSONRelation) ======
==== Navigation ====
* [[ru:first|Главная]]
* [[ru:airlay:glossary|Glossary]]
* [[ru:airlay:examples|Примеры данных]]
==== Формат ====
Формат загрузки Airlay GJR(GeoJson Relation) основан на формате [[https://tools.ietf.org/html/rfc7946|RFC7946 GeoJson]]. Были добавлены в формат **relations** и необязательность задачи геометрии для объектов, которые строятся на основе других объектов через **relations**.
==== Поля ====
"**geometry**": данное поле задаётся в рамках [[https://tools.ietf.org/html/rfc7946|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
}
}
}