{ "openapi": "3.1.0", "info": { "title": "measurements", "description": "HTTP-сервис измерений по GeoTIFF-растрам (DEM/thermal), читаемым напрямую из S3/MinIO через GDAL.\n\nВсе эндпоинты — POST под префиксом `/api`. `path` в теле запроса указывается в формате `:<путь/к/файлу.tif>`; система координат задаётся строкой `proj` (proj4). Пустой `proj` означает, что точки уже в системе координат растра.\n\nАутентификация (JWT в заголовках `authorization`/`identity`) включается переменной `AUTH=1`.", "version": "0.0.1" }, "paths": { "/api/point": { "post": { "summary": "Height/temperature at a single point", "description": "Возвращает высоту (h) и/или температуру (t) в одной точке по DEM/термо-растру из S3.", "operationId": "point_api_point_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TiffPoint" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "additionalProperties": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "type": "object", "title": "Response Point Api Point Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api/points": { "post": { "summary": "Height/temperature at multiple points", "description": "Батч-версия /point: массив высот/температур для списка точек.", "operationId": "points_api_points_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TiffPoints" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "items": { "additionalProperties": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "type": "object" }, "type": "array", "title": "Response Points Api Points Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api/profile": { "post": { "summary": "Elevation profile along a polyline", "description": "Профиль высот вдоль ломаной; между вершинами добавляются промежуточные точки.", "operationId": "profile_api_profile_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TiffProfile" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "items": { "additionalProperties": { "anyOf": [ { "type": "number" }, { "type": "null" } ] }, "type": "object" }, "type": "array", "title": "Response Profile Api Profile Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api/volume": { "post": { "summary": "Volume inside a polygon", "description": "Объём внутри полигона. mode=cv2 (по умолчанию) или pillow (DEM-режим, требует > 2 точек).", "operationId": "volume_api_volume_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TiffVolume" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "anyOf": [ { "additionalProperties": { "type": "number" }, "type": "object" }, { "type": "null" } ], "title": "Response Volume Api Volume Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api/multiple": { "post": { "summary": "Volume difference between two DEMs", "description": "Разница объёмов между master- и slave-растром в пределах полигона.", "operationId": "multiple_api_multiple_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TiffMultiple" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "additionalProperties": { "type": "number" }, "type": "object", "title": "Response Multiple Api Multiple Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api/transform": { "post": { "summary": "GeoTIFF affine transform", "description": "Возвращает 6 коэффициентов GDAL GeoTransform растра.", "operationId": "transform_api_transform_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Tiff" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "prefixItems": [ { "type": "number" }, { "type": "number" }, { "type": "number" }, { "type": "number" }, { "type": "number" }, { "type": "number" } ], "type": "array", "maxItems": 6, "minItems": 6, "title": "Response Transform Api Transform Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api/info": { "post": { "summary": "GeoTIFF metadata", "description": "Метаданные растра (размер, проекция, geotransform и т.п.).", "operationId": "info_api_info_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Tiff" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "type": "object", "title": "Response Info Api Info Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api/statistics": { "post": { "summary": "Raster min/max statistics", "description": "Пара (min, max) значений растра.", "operationId": "statistics_api_statistics_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Tiff" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "prefixItems": [ { "type": "number" }, { "type": "number" } ], "type": "array", "maxItems": 2, "minItems": 2, "title": "Response Statistics Api Statistics Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } }, "/api/bounds": { "post": { "summary": "Tile bounds by zoom range", "description": "Границы тайлов (XYZ) для диапазона zoom_from..zoom_to.", "operationId": "bounds_api_bounds_post", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Tiff" } } }, "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "additionalProperties": { "items": { "items": { "type": "integer" }, "type": "array" }, "type": "array" }, "type": "object", "title": "Response Bounds Api Bounds Post" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } } }, "components": { "schemas": { "HTTPValidationError": { "properties": { "detail": { "items": { "$ref": "#/components/schemas/ValidationError" }, "type": "array", "title": "Detail" } }, "type": "object", "title": "HTTPValidationError" }, "Tiff": { "properties": { "path": { "type": "string", "title": "Path" }, "zoom_to": { "type": "integer", "title": "Zoom To", "default": 21 }, "zoom_from": { "type": "integer", "title": "Zoom From", "default": 14 } }, "type": "object", "required": [ "path" ], "title": "Tiff" }, "TiffMultiple": { "properties": { "master_path": { "type": "string", "title": "Master Path" }, "slave_path": { "type": "string", "title": "Slave Path" }, "proj": { "type": "string", "title": "Proj", "default": "" }, "points": { "items": { "prefixItems": [ { "type": "number" }, { "type": "number" } ], "type": "array", "maxItems": 2, "minItems": 2 }, "type": "array", "title": "Points" } }, "type": "object", "required": [ "master_path", "slave_path", "points" ], "title": "TiffMultiple", "example": [ { "master_path": "geotiff_dems/NTG030521_DEM.tif", "points": [ [ 37.34743572357015, 55.68881158675471 ], [ 37.347128864435845, 55.6888704629146 ], [ 37.34719182945381, 55.68896771656465 ], [ 37.34732057806979, 55.688942063559054 ] ], "proj": "+proj=tmerc +lat_0=0 +lon_0=60.05 +k=1 +x_0=1500000 +y_0=-5911057.63 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs", "slave_path": "geotiff_dems/NTG030521_DEM.tif" } ] }, "TiffPoint": { "properties": { "altitude_path": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Altitude Path" }, "temperature_path": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Temperature Path" }, "proj": { "type": "string", "title": "Proj", "default": "" }, "point": { "prefixItems": [ { "type": "number" }, { "type": "number" } ], "type": "array", "maxItems": 2, "minItems": 2, "title": "Point" } }, "type": "object", "required": [ "point" ], "title": "TiffPoint", "example": [ { "altitude_path": "geotiff_dems/ALTITUDE_DEM.tif", "point": [ 59.95821631734607, 57.9660901731621 ], "proj": "+proj=tmerc +lat_0=0 +lon_0=60.05 +k=1 +x_0=1500000 +y_0=-5911057.63 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs", "temperature_path": "geotiff_dems/THERMAL_DEM.tif" }, { "point": [ 1494214.348999979, 516505.3900003205 ], "proj": "", "temperature_path": "geotiff_dems/THERMAL_DEM.tif" }, { "altitude_path": "geotiff_dems/ALTITUDE_DEM.tif", "point": [ 1494214.348999979, 516505.3900003205 ], "proj": "" } ] }, "TiffPoints": { "properties": { "altitude_path": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Altitude Path" }, "temperature_path": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "title": "Temperature Path" }, "proj": { "type": "string", "title": "Proj", "default": "" }, "points": { "items": { "prefixItems": [ { "type": "number" }, { "type": "number" } ], "type": "array", "maxItems": 2, "minItems": 2 }, "type": "array", "title": "Points" } }, "type": "object", "required": [ "points" ], "title": "TiffPoints", "example": [ { "altitude_path": "geotiff_dems/ALTITUDE_DEM.tif", "points": [ [ 59.95821631734607, 57.9660901731621 ], [ 59.95452603553467, 57.96567474229709 ], [ 59.95563056285039, 57.966613723012216 ] ], "proj": "+proj=tmerc +lat_0=0 +lon_0=60.05 +k=1 +x_0=1500000 +y_0=-5911057.63 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs", "temperature_path": "geotiff_dems/THERMAL_DEM.tif" }, { "points": [ [ 1494221.1549999786, 516495.86600015266 ], [ 1494214.348999979, 516505.3900003205 ] ], "proj": "", "temperature_path": "geotiff_dems/THERMAL_DEM.tif" } ] }, "TiffProfile": { "properties": { "path": { "type": "string", "title": "Path" }, "proj": { "type": "string", "title": "Proj", "default": "" }, "points": { "items": { "prefixItems": [ { "type": "number" }, { "type": "number" } ], "type": "array", "maxItems": 2, "minItems": 2 }, "type": "array", "title": "Points" } }, "type": "object", "required": [ "path", "points" ], "title": "TiffProfile", "example": [ { "path": "geotiff_dems/NTG030521_DEM.tif", "points": [ [ 59.95821631734607, 57.9660901731621 ], [ 59.95452603553467, 57.96567474229709 ] ], "proj": "+proj=tmerc +lat_0=0 +lon_0=60.05 +k=1 +x_0=1500000 +y_0=-5911057.63 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs" }, { "path": "geotiff_dems/BLG_080122_DEM.tif", "points": [ [ 3334617.713961677, 590691.7743950449 ], [ 3334977.6348458366, 590688.296080064 ] ] } ] }, "TiffVolume": { "properties": { "path": { "type": "string", "title": "Path" }, "proj": { "type": "string", "title": "Proj", "default": "" }, "level": { "anyOf": [ { "type": "number" }, { "type": "null" } ], "title": "Level" }, "points": { "items": { "prefixItems": [ { "type": "number" }, { "type": "number" } ], "type": "array", "maxItems": 2, "minItems": 2 }, "type": "array", "title": "Points" }, "mode": { "allOf": [ { "$ref": "#/components/schemas/VolumeMode" } ], "default": "cv2" } }, "type": "object", "required": [ "path", "points" ], "title": "TiffVolume", "example": [ { "path": "geotiff_dems/NTG030521_DEM.tif", "points": [ [ 59.95821631734607, 57.9660901731621 ], [ 59.95452603553467, 57.96567474229709 ], [ 59.95563056285039, 57.966613723012216 ] ], "proj": "+proj=tmerc +lat_0=0 +lon_0=60.05 +k=1 +x_0=1500000 +y_0=-5911057.63 +ellps=krass +towgs84=23.57,-140.95,-79.8,0,0.35,0.79,-0.22 +units=m +no_defs" }, { "mode": "pillow", "path": "geotiff_dems/NTG030521_DEM.tif", "points": [ [ 1494221.1549999786, 516495.86600015266 ], [ 1494214.348999979, 516505.3900003205 ] ], "proj": "" } ] }, "ValidationError": { "properties": { "loc": { "items": { "anyOf": [ { "type": "string" }, { "type": "integer" } ] }, "type": "array", "title": "Location" }, "msg": { "type": "string", "title": "Message" }, "type": { "type": "string", "title": "Error Type" } }, "type": "object", "required": [ "loc", "msg", "type" ], "title": "ValidationError" }, "VolumeMode": { "type": "string", "enum": [ "cv2", "pillow" ], "title": "VolumeMode" } } } }