{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/geoapify/json-schema/geoapify-geometry-operation-request-schema.json",
  "title": "GeometryOperationRequest",
  "x-generated": "2026-11-05",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/geoapify-geometry-operations-api-openapi.yml#/components/schemas/GeometryOperationRequest",
  "type": "object",
  "required": [
    "operation"
  ],
  "allOf": [
    {
      "if": {
        "required": [
          "operation"
        ],
        "properties": {
          "operation": {
            "const": "length"
          }
        }
      },
      "then": {
        "$ref": "#/$defs/LengthOperationRequest"
      }
    }
  ],
  "properties": {
    "operation": {
      "type": "string",
      "enum": [
        "intersection",
        "difference",
        "union",
        "voronoi",
        "contains",
        "crosses",
        "disjoint",
        "intersects",
        "pointOnLine",
        "valid",
        "within",
        "along",
        "area",
        "bbox",
        "buffer",
        "center",
        "centerMean",
        "centerMedian",
        "centerOfMass",
        "clustersDbscan",
        "clustersKmeans",
        "concave",
        "convex",
        "distance",
        "length",
        "envelope",
        "greatCircle",
        "grid",
        "randomPoint",
        "randomLineString",
        "randomPolygon",
        "lineIntersect",
        "nearestPointOnLine",
        "pointsWithinPolygon",
        "pointToLineDistance",
        "pointToPolygonDistance",
        "tin",
        "tesselate",
        "simplify",
        "transformRotate",
        "transformScale",
        "transformTranslate"
      ],
      "description": "Geometry operation to perform. Use `length` to measure a LineString or MultiLineString."
    },
    "params": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "units": {
          "$ref": "#/$defs/GeometryLengthUnit"
        },
        "steps": {
          "type": "integer",
          "minimum": 1
        },
        "minPoints": {
          "type": "integer",
          "minimum": 1
        },
        "numberOfClusters": {
          "type": "integer",
          "minimum": 1
        },
        "tolerance": {
          "type": "number",
          "minimum": 0
        },
        "highQuality": {
          "type": "boolean"
        },
        "mutate": {
          "type": "boolean"
        },
        "origin": {
          "oneOf": [
            {
              "type": "string",
              "enum": [
                "center",
                "centroid",
                "sw",
                "se",
                "nw",
                "ne"
              ]
            },
            {
              "$ref": "#/$defs/Position"
            }
          ]
        }
      }
    },
    "polygons": {
      "type": "array",
      "minItems": 2,
      "maxItems": 100,
      "items": {
        "$ref": "#/$defs/AnyGeometry"
      }
    },
    "points": {
      "type": "array",
      "minItems": 1,
      "maxItems": 1000,
      "items": {
        "$ref": "#/$defs/PointGeometry"
      }
    },
    "geometry": {
      "$ref": "#/$defs/AnyGeometry"
    },
    "geometry1": {
      "$ref": "#/$defs/AnyGeometry"
    },
    "geometry2": {
      "$ref": "#/$defs/AnyGeometry"
    },
    "geometries": {
      "type": "array",
      "minItems": 1,
      "maxItems": 100,
      "items": {
        "$ref": "#/$defs/AnyGeometry"
      }
    },
    "point": {
      "$ref": "#/$defs/PointGeometry"
    },
    "point1": {
      "$ref": "#/$defs/PointGeometry"
    },
    "point2": {
      "$ref": "#/$defs/PointGeometry"
    },
    "line": {
      "description": "LineString or MultiLineString used by line operations, including `length`.",
      "$ref": "#/$defs/LineGeometry"
    },
    "line1": {
      "$ref": "#/$defs/AnyGeometry"
    },
    "line2": {
      "$ref": "#/$defs/AnyGeometry"
    },
    "polygon": {
      "$ref": "#/$defs/AnyGeometry"
    },
    "bbox": {
      "oneOf": [
        {
          "type": "array",
          "minItems": 4,
          "maxItems": 4,
          "items": {
            "type": "number"
          }
        },
        {
          "type": "object",
          "required": [
            "lon1",
            "lat1",
            "lon2",
            "lat2"
          ],
          "properties": {
            "lon1": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            },
            "lat1": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            },
            "lon2": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            },
            "lat2": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          }
        }
      ]
    },
    "distance": {
      "type": "number"
    },
    "maxDistance": {
      "type": "number",
      "minimum": 0
    },
    "angle": {
      "type": "number"
    },
    "factor": {
      "type": "number"
    },
    "direction": {
      "type": "number"
    },
    "type": {
      "type": "string",
      "enum": [
        "hex",
        "point",
        "square",
        "triangle"
      ]
    },
    "cellSide": {
      "type": "number",
      "exclusiveMinimum": 0
    },
    "count": {
      "type": "integer",
      "minimum": 1
    }
  },
  "$defs": {
    "AnyGeometry": {
      "type": "object",
      "additionalProperties": true,
      "required": [
        "type",
        "coordinates"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "Point",
            "LineString",
            "Polygon",
            "MultiPoint",
            "MultiLineString",
            "MultiPolygon"
          ]
        },
        "coordinates": {
          "type": "array"
        }
      }
    },
    "GeometryLengthUnit": {
      "type": "string",
      "enum": [
        "meters",
        "metres",
        "millimeters",
        "millimetres",
        "centimeters",
        "centimetres",
        "kilometers",
        "kilometres",
        "miles",
        "nauticalmiles",
        "inches",
        "yards",
        "feet",
        "radians",
        "degrees"
      ],
      "default": "kilometers",
      "description": "Length unit. Defaults to `kilometers`. `degrees` and `radians` return angular length rather than physical length."
    },
    "LengthOperationParameters": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "units": {
          "$ref": "#/$defs/GeometryLengthUnit"
        }
      }
    },
    "LengthOperationRequest": {
      "type": "object",
      "required": [
        "operation",
        "line"
      ],
      "properties": {
        "operation": {
          "const": "length"
        },
        "line": {
          "$ref": "#/$defs/LineGeometry"
        },
        "params": {
          "$ref": "#/$defs/LengthOperationParameters"
        }
      }
    },
    "LineGeometry": {
      "oneOf": [
        {
          "$ref": "#/$defs/LineStringGeometry"
        },
        {
          "$ref": "#/$defs/MultiLineStringGeometry"
        }
      ]
    },
    "LineStringGeometry": {
      "type": "object",
      "required": [
        "type",
        "coordinates"
      ],
      "properties": {
        "type": {
          "const": "LineString"
        },
        "coordinates": {
          "type": "array",
          "minItems": 2,
          "items": {
            "$ref": "#/$defs/Position"
          }
        }
      }
    },
    "MultiLineStringGeometry": {
      "type": "object",
      "required": [
        "type",
        "coordinates"
      ],
      "properties": {
        "type": {
          "const": "MultiLineString"
        },
        "coordinates": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "array",
            "minItems": 2,
            "items": {
              "$ref": "#/$defs/Position"
            }
          }
        }
      }
    },
    "PointGeometry": {
      "type": "object",
      "additionalProperties": true,
      "required": [
        "type",
        "coordinates"
      ],
      "properties": {
        "type": {
          "const": "Point"
        },
        "coordinates": {
          "$ref": "#/$defs/Position"
        }
      }
    },
    "Position": {
      "type": "array",
      "minItems": 2,
      "maxItems": 3,
      "prefixItems": [
        {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        {
          "type": "number",
          "minimum": -90,
          "maximum": 90
        },
        {
          "type": "number"
        }
      ],
      "items": false
    }
  }
}