Руководства по 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.
Создайте проект (это необязательно)
Подсказка
Возможно, будет полезно организовать обработку с помощью проектов. Для этого создайте новый проект со следующим методом 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
В случае нескольких обработок может оказаться полезным запустить небольшой скрипт.
Получите список всех «идентификаторов» и «имен», обработав:
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, Арабхана
...
Сохраните результаты для всех перечисленных обработок:
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)