Копирование

Копирование данных в EverGIS Online осуществляется с помощью задачи типа type=copy:

POST {host}/scheduler/tasks#type=copy
Content-Type: application/json
JSON body
{
  "condition": null,
  "attributeMapping": {
    "property1": "string",
    "property2": "string"
  },
  "source": {
    "serviceName": "string",
    "attributesConfiguration": {
      "idAttribute": "string",
      "titleAttribute": "string",
      "geometryAttribute": "string",
      "tableName": "string",
      "attributes": [
        {
          "attributeName": "string",
          "columnName": "string",
          "alias": "string",
          "subType": "None",
          "isEditable": true,
          "isDisplayed": true,
          "aggregation": "None",
          "expression": "string",
          "stringFormat": {
            "scalingFactor": 0,
            "unitsLabel": "string",
            "format": "string",
            "culture": "string",
            "splitDigitGroup": true,
            "rounding": 0
          }
        }
      ],
      "tableReferences": [
        {
          "tableName": "string",
          "referenceColumn": "string",
          "targetColumn": "string",
          "attributes": [
            {
              "attributeName": "string",
              "columnName": "string",
              "alias": "string",
              "subType": "None",
              "isEditable": true,
              "isDisplayed": true,
              "aggregation": "None",
              "expression": "string",
              "stringFormat": {
                "scalingFactor": 0,
                "unitsLabel": "string",
                "format": "string",
                "culture": "string",
                "splitDigitGroup": true,
                "rounding": 0
              }
            }
          ],
          "tableReferences": [
            {}
          ]
        }
      ]
    }
  },
  "target": {
    "serviceName": "string",
    "attributesConfiguration": {
      "idAttribute": "string",
      "titleAttribute": "string",
      "geometryAttribute": "string",
      "tableName": "string",
      "attributes": [
        {
          "attributeName": "string",
          "columnName": "string",
          "alias": "string",
          "subType": "None",
          "isEditable": true,
          "isDisplayed": true,
          "aggregation": "None",
          "expression": "string",
          "stringFormat": {
            "scalingFactor": 0,
            "unitsLabel": "string",
            "format": "string",
            "culture": "string",
            "splitDigitGroup": true,
            "rounding": 0
          }
        }
      ],
      "tableReferences": [
        {
          "tableName": "string",
          "referenceColumn": "string",
          "targetColumn": "string",
          "attributes": [
            {
              "attributeName": "string",
              "columnName": "string",
              "alias": "string",
              "subType": "None",
              "isEditable": true,
              "isDisplayed": true,
              "aggregation": "None",
              "expression": "string",
              "stringFormat": {
                "scalingFactor": 0,
                "unitsLabel": "string",
                "format": "string",
                "culture": "string",
                "splitDigitGroup": true,
                "rounding": 0
              }
            }
          ],
          "tableReferences": [
            {}
          ]
        }
      ]
    }
  }
}

Параметры

Чтобы создать задачу копирования, необходимо в теле запроса указать следующие параметры:

  • source - описание исходного ресурса, из которого будут скопированы данные (обязательный параметр). Подробнее об описаниях ресурсов;
  • target - описание целевого ресурса, в который будут скопированы данные (обязательный параметр);
  • attributeMapping - сопоставление атрибутов исходного и целевого ресурса;
  • condition - выражение для атрибутивной фильтрации копируемых объектов;

Полный перечень и описание параметров создания задачи копирования

Сопоставление атрибутов

attributeMapping используется в случае, если в исходном и целевом ресурсе названия одного или нескольких атрибутов не совпадают. attributeMapping задаётся в виде JSON-объекта, где ключами являются названия атрибутов исходного ресурса, а значениями - названия соответствующих им атрибутов целевого ресурса:

{
    "sourceAttr1": "targetAttr1",
    "sourceAttr2": "targetAttr2",
    "sourceAttr3": "targetAttr3",
}

Пример

Скопируем в новый слой данные из слоя зданий, созданного в примере. При этом скопируем только те здания, которые были построены не ранее 2000 года и имеют не менее 5 этажей.

Python

def login(username, password): # производит авторизацию и возвращает объект сессии
    authUrl = f'{host}/account/login/'
    login_data = {
        "username": username,
        "password": password
        }
    headers = {'Content-type': 'application/json'}

    # создание объекта сессии
    s = requests.Session()

    # авторизация и получение JWT-токена
    s.post(url=authUrl, data=json.dumps(login_data), headers=headers)

    return s

host = 'https://evergis.ru/sp'
username = 'username'
password = 'password'

# авторизация
session = login(username, password)

# задаём имена и описания исходного и целевого слоёв
sourceName = f'{username}.buildings_layer'
targetName = f'{username}.buildings_layer_copy'

source = {
    'type': 'layerTaskDataStorage',
    'serviceName': sourceName
}

target = {
    'type': 'layerTaskDataStorage',
    'serviceName': targetName,
    'createNewService': True
}

# атрибутивный запрос
condition = "year >= #'2000-01-01T00:00:00.000+03:00' && floors >= 5"

copyProps = {
    'source': source,
    'target': target,
    'condition': condition
}

# выполнение запроса
copyTaskUrl = f'{host}/scheduler/tasks'
params={'type': 'copy'}
headers = {'Content-type': 'application/json'}
taskProps = session.post(url=copyTaskUrl, params=params, data=json.dumps(copyProps), headers=headers).json()
taskProps
Просмотреть ответ сервера
{'taskId': 'a248c545-8a15-4f67-b97d-bf5fbe61be9f',
 'status': 'Scheduled',
 'taskResult': None}


Проверим прогресс задачи:

taskId = taskProps['taskId']
checkTaskUrl = f'{host}/scheduler/tasks/{taskId}/progress'

taskStatus = session.get(url = checkTaskUrl).json()
taskStatus
Просмотреть ответ сервера
{'id': 'a248c545-8a15-4f67-b97d-bf5fbe61be9f',
 'status': 'Completed',
 'taskResult': {'message': None,
  'stepResults': [{'stepName': None,
    'inputSource': None,
    'outSource': None,
    'startedTime': '2023-12-12T23:57:52.6243769Z',
    'endedTime': '2023-12-12T23:57:52.635895Z',
    'batchErrors': None,
    'batchCount': 1,
    'inputObjectCount': 0,
    'errorCount': 0,
    'outputObjectCount': 0,
    'resultDetails': None},
   {'stepName': None,
    'inputSource': None,
    'outSource': None,
    'startedTime': '2023-12-12T23:57:52.659113Z',
    'endedTime': '2023-12-12T23:57:52.6591355Z',
    'batchErrors': None,
    'batchCount': 1,
    'inputObjectCount': 0,
    'errorCount': 0,
    'outputObjectCount': 0,
    'resultDetails': None},
   {'stepName': None,
    'inputSource': None,
    'outSource': None,
    'startedTime': '2023-12-12T23:57:52.8735937Z',
    'endedTime': '2023-12-12T23:57:52.9378787Z',
    'batchErrors': None,
    'batchCount': 1,
    'inputObjectCount': 2,
    'errorCount': 0,
    'outputObjectCount': 2,
    'resultDetails': None}],
  'inputObjectCount': 2,
  'errorCount': 0,
  'outputObjectCount': 2},
 'stepCount': 0,
 'currentStepId': 0,
 'currentStepAlreadyDone': 0,
 'currentStepObjectCount': 0,
 'resultDetails': None}

URL и JSON запроса

Для работы с запросом в Postman или аналогичном приложении

POST https://evergis.ru/sp/scheduler/tasks#type=copy
Content-Type: application/json

JSON body:

{
    "source": {
        "type": "layerTaskDataStorage", 
        "serviceName": "username.buildings_layer"
    }, 
    "target": {
        "type": "layerTaskDataStorage", 
        "serviceName": "username.buildings_layer_copy", 
        "createNewService": true
    }, 
    "condition": "year >= #\'2000-01-01T00:00:00.000+03:00\' && floors >= 5"
}