====== Описание формата загрузки и выгрузки формат 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 } } }