Руководства по API Mapflow

Как запустить массовую обработку с помощью API Mapflow

Если вам нужно обработать или обновить несколько полигонов, загружать их один за другим с помощью пользовательских инструментов Интернета или ГИС может быть скучно. В этом случае вам лучше подумать об использовании Mapflow API обработки Mapflow. В этом примере предположим, что у нас есть список полигонов, обозначающих границы населенных пунктов, и мы хотим извлечь такие объекты, как «здания», с помощью API обработки Mapflow.

1. To make it more realistic let’s download some populated places borders for the sample area in Uzbekistan using Openstreetmap. To do this we can make a query with Overpass Turbo API like this: We can use QuickOSM plugin in QGIS which is very friendly when it comes to downloading a managable volume of data from Openstreetmap.

быстроосмм

Авторизация с помощью токена Mapflow

Для дальнейшей авторизации воспользуемся токеном Mapflow.

import base64

token = input("token:") # Your Mapflow token goes here. Obtain it at https://app.mapflow.ai/account/api

username, password = base64.b64decode(token).decode().split(':')
print(username, password)

Теперь вы получаете свой токен, декодированный как имя пользователя и пароль, и используете его для авторизации с запросами.

Создайте проект (это необязательно)

Подсказка

Возможно, будет полезно организовать обработку с помощью проектов. Для этого создайте новый проект со следующим методом API.

import requests
import json

url = "https://api.mapflow.ai/rest/projects"
headers = {
    'Content-Type': 'application/json'
    }

payload = json.dumps({
        "name": "My new project"  # Your project name
    })

response = requests.request("POST", url, headers=headers, auth=(username,password), data=payload)

if  response.status_code == 200:
    print(response.text)
else:
    print(f"Request failed")
    print(response.text)

Здесь мы получаем ответ, содержащий идентификатор проекта, который мы можем использовать для создания обработок в этом конкретном проекте.

Пример ответа:

    {
    "id": "fb49b97e-51ec-4b31-872f-d1411284de85",
    "name": "My new project",
    ...
}

Дополнительную информацию см. в Проекты — API

Подготовьте AOI для обработки.

Давайте сохраним интересующие области со свойствами в виде файла GeoJSON, поскольку это простой и понятный формат, который можно использовать в любом приложении или программном обеспечении ГИС. Затем мы открываем этот файл и создаем словарь Python для перебора всех функций GeoJSON, которые мы собираемся использовать в качестве геометрии AOI для создания обработки. Так:

with open('<path to the file>', 'r') as file:  # Define your GeoJSON file path
geojson_data = json.load(file)

for feature in geojson_data['features']:
    name = feature['properties']['name']   # Extract the "name" property from OSM data
    print(name);

Давайте проверим, создали ли мы массив данных из нашего файла и отобразим все объекты по их именам. На следующем шаге мы будем использовать свойство name для определения обработки. «Имя» не является обязательным, но потом с результатами удобнее работать.

Запустите обработку

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

url = "https://api.mapflow.ai/rest/processings"

for feature in geojson_data['features']:
    name = feature['properties']['name']
    geometry = feature['geometry']
    payload = json.dumps({
        "name": name,
        "projectId": "fb49b97e-51ec-4b31-872f-d1411284de85",  # Here is your project Id to link the processing to the specific project.
        "wdName": "🏠 Buildings",
        "geometry": geometry
    })
    response = requests.request("POST", url, headers=headers, auth=(username,password), data=payload)

    if  response.status_code == 200:
        print(f"Request successful: {name}")
    else:
        print(f"Request failed for feature: {name}")
        print(response.text)

Если все было сделано правильно – отобразится список успешно созданных обработок.

Загрузите все результаты с помощью API Mapflow.

Когда все обработки завершены, вы можете легко загрузить результаты для каждой из них.

Если у вас есть одна обработка с несколькими AOI (по умолчанию количество AOI в одной обработке ограничено 10), вы можете запустить один вызов API для загрузки результатов:

curl --location 'https://api.mapflow.ai/rest/processings/<ID>/result' \
--header 'Authorization: Basic <YOUR API TOKEN>' -O <YOUR PATH TO FILE>.geojson

В случае нескольких обработок может оказаться полезным запустить небольшой скрипт.

  1. Получите список всех «идентификаторов» и «имен», обработав:

import requests
import json

url = "https://api.mapflow.ai/rest/projects/fb49b97e-51ec-4b31-872f-d1411284de85/processings"

response = requests.request("GET", url, auth=(username,password))

json_data = response.json()

values = []
for item in json_data:
    if "id" in item and "name" in item:
        values.append((item["id"], item["name"]))

if  response.status_code == 200:
    for id, name in values:
        print(f"{id}, {name}")
else:
    print(response.text)

Пример ответа:

5f748822-c94a-4233-ae1e-7622973bf9b5, Бой
87f258e6-c1ce-4deb-8155-ccd6b21ac237, Авазли
1e24c0e5-9b6f-4a26-9970-82dfb1f67807, Avazali
0316606a-4c04-4196-bdab-6495af4bb7b0, Авлиятепа
38435f06-6b85-420e-86f8-3ebef4755480, Акбуйра
33ffec93-ef2b-4ead-a51e-30cad1bcb71d, Аксулат
c8f73cf5-8a44-4c36-8b2e-49b27f7f5da5, Актепа
6eaca828-41ec-4ce5-aea4-b9f039211bbe, Арабхана
...
  1. Сохраните результаты для всех перечисленных обработок:

output_json = '<path to the folder>' # Define local folder to save files

for id, name in values:
    response = requests.request("GET", url + id + '/result', headers=headers)

    if  response.status_code == 200:
        with open(output_json_file + name + '.geojson', 'w') as geojson:
            geojson.write(response.text)
            print(f"File saved")
    else:
        print(f"Request failed")
        print(response.text)