openapi: 3.1.0
info:
  title: measurements
  description: 'HTTP-сервис измерений по GeoTIFF-растрам (DEM/thermal), читаемым напрямую из S3/MinIO
    через GDAL.


    Все эндпоинты — POST под префиксом `/api`. `path` в теле запроса указывается в формате `<bucket>:<путь/к/файлу.tif>`;
    система координат задаётся строкой `proj` (proj4). Пустой `proj` означает, что точки уже в системе
    координат растра.


    Аутентификация (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
