open/geolocation
Title: Geolocation
Use Case: A schema for storing a GeoJSON Feature object associated with a file, compliant with RFC 7946.
URL: https://dorsalhub.com/schemas/open/geolocation
This schema is used to associate standardized geospatial data with a file.
- GeoJSON Standard: The root object is a valid GeoJSON
Feature(RFC 7946). - Geometry: The Feature must contain a
geometryobject (e.g.,Point,LineString,Polygon), which uses the WGS 84 coordinate reference system. - Properties: It includes a
propertiesobject for metadata (e.g.,timestamp,camera_make,camera_model). - Constraint: It restricts the root to a single Feature and enforces flat properties to prevent recursion attacks.
{
"_license": {
"id": "Apache-2.0",
"notice": "Copyright 2025 Dorsal Hub LTD",
"url": "https://github.com/dorsalhub/open-validation-schemas/blob/main/LICENSE"
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://dorsalhub.com/schemas/open/geolocation",
"title": "Geolocation",
"version": "0.1.0",
"description": "Represent a geographic feature. Defines a subset of GeoJSON (RFC 7946) optimized for predictable parsing and indexing. It restricts the root to a single 'Feature', supports all fixed-depth geometries (Point, Polygon, Multi-types), and enforces flat properties to prevent recursion and nesting attacks.",
"type": "object",
"properties": {
"type": {
"const": "Feature"
},
"id": {
"description": "A unique identifier for the feature.",
"anyOf": [
{ "type": "string", "maxLength": 128 },
{ "type": "number" }
]
},
"bbox": { "$ref": "#/$defs/bbox" },
"geometry": {
"description": "The geometry of the feature. Uses WGS 84 coordinate reference system.",
"anyOf": [
{ "type": "null" },
{
"title": "Point",
"type": "object",
"properties": {
"type": { "const": "Point" },
"coordinates": { "$ref": "#/$defs/position" },
"bbox": { "$ref": "#/$defs/bbox" }
},
"required": ["type", "coordinates"],
"additionalProperties": { "$ref": "#/$defs/foreign-member" }
},
{
"title": "LineString",
"type": "object",
"properties": {
"type": { "const": "LineString" },
"coordinates": {
"type": "array",
"items": { "$ref": "#/$defs/position" },
"minItems": 2,
"maxItems": 10000
},
"bbox": { "$ref": "#/$defs/bbox" }
},
"required": ["type", "coordinates"],
"additionalProperties": { "$ref": "#/$defs/foreign-member" }
},
{
"title": "Polygon",
"type": "object",
"properties": {
"type": { "const": "Polygon" },
"coordinates": { "$ref": "#/$defs/polygon-coords" },
"bbox": { "$ref": "#/$defs/bbox" }
},
"required": ["type", "coordinates"],
"additionalProperties": { "$ref": "#/$defs/foreign-member" }
},
{
"title": "MultiPoint",
"type": "object",
"properties": {
"type": { "const": "MultiPoint" },
"coordinates": {
"type": "array",
"items": { "$ref": "#/$defs/position" },
"maxItems": 10000
},
"bbox": { "$ref": "#/$defs/bbox" }
},
"required": ["type", "coordinates"],
"additionalProperties": { "$ref": "#/$defs/foreign-member" }
},
{
"title": "MultiPolygon",
"type": "object",
"properties": {
"type": { "const": "MultiPolygon" },
"coordinates": {
"type": "array",
"items": { "$ref": "#/$defs/polygon-coords" },
"maxItems": 1000
},
"bbox": { "$ref": "#/$defs/bbox" }
},
"required": ["type", "coordinates"],
"additionalProperties": { "$ref": "#/$defs/foreign-member" }
}
]
},
"properties": {
"description": "An object containing additional properties of the feature. Can be null.",
"anyOf": [
{ "type": "null" },
{
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time"
},
"camera_make": {
"type": "string",
"maxLength": 128
},
"camera_model": {
"type": "string",
"maxLength": 128
}
},
"maxProperties": 100,
"additionalProperties": { "$ref": "#/$defs/foreign-member" }
}
]
}
},
"required": [
"type",
"geometry",
"properties"
],
"additionalProperties": { "$ref": "#/$defs/foreign-member" },
"$defs": {
"position": {
"type": "array",
"items": { "type": "number" },
"minItems": 2,
"maxItems": 3,
"description": "A single position [longitude, latitude, optional altitude]."
},
"linear-ring": {
"type": "array",
"items": { "$ref": "#/$defs/position" },
"minItems": 4,
"maxItems": 10000
},
"polygon-coords": {
"type": "array",
"items": { "$ref": "#/$defs/linear-ring" },
"maxItems": 100
},
"bbox": {
"description": "A bounding box array (RFC 7946, Section 5).",
"type": "array",
"items": { "type": "number" },
"minItems": 4,
"maxItems": 6
},
"foreign-member": {
"description": "Constrained definition of RFC 7946 Foreign Members.",
"anyOf": [
{ "type": "string", "maxLength": 2048 },
{ "type": "number" },
{ "type": "boolean" },
{ "type": "null" },
{
"type": "array",
"maxItems": 100,
"items": {
"anyOf": [
{ "type": "string", "maxLength": 1024 },
{ "type": "number" },
{ "type": "boolean" }
]
}
},
{
"type": "object",
"maxProperties": 20,
"additionalProperties": {
"anyOf": [
{ "type": "string", "maxLength": 2048 },
{ "type": "number" },
{ "type": "boolean" },
{ "type": "null" }
]
}
}
]
}
}
}