{

"$schema":"http://json-schema.org/draft-04/schema#",
"title":"TopoJSON object",
"description":"Schema for a TopoJSON object",
"type":"object",
"required":[
    "type"
],
"properties":{
    "bbox":{
        "$ref":"#/definitions/bbox"
    }
},
"oneOf":[
    {
        "$ref":"#/definitions/topology"
    },
    {
        "$ref":"#/definitions/geometry"
    }
],
"definitions":{
    "bbox":{
        "title":"TopoJSON bounding box",
        "description":"A bounding box as defined by TopoJSON",
        "type":"array",
        "items":{
            "$ref":"#/definitions/bbox/definitions/dimension"
        },
        "minItems":2,
        "maxItems":2,
        "definitions":{
            "dimension":{
                "type":"array",
                "description":"This array should have an entry per dimension in the geometries",
                "items":{
                    "type":"number"
                }
            }
        }
    },
    "geometry":{
        "title":"Geometry objects",
        "description":"A Geometry object as defined by TopoJSON",
        "type":"object",
        "required":[
            "type"
        ],
        "properties":{
            "id":{
                "type":[
                    "string",
                    "integer"
                ]
            },
            "properties":{
                "type":"object"
            }
        },
        "oneOf":[
            {
                "title":"Point",
                "description":"A Point Geometry object as defined by TopoJSON",
                "required":[
                    "type",
                    "coordinates"
                ],
                "properties":{
                    "type":{
                        "enum":[
                            "Point"
                        ]
                    },
                    "coordinates":{
                        "$ref":"#/definitions/geometry/definitions/position"
                    }
                }
            },
            {
                "title":"MultiPoint",
                "description":"A MultiPoint Geometry object as defined by TopoJSON",
                "required":[
                    "type",
                    "coordinates"
                ],
                "properties":{
                    "type":{
                        "enum":[
                            "MultiPoint"
                        ]
                    },
                    "coordinates":{
                        "type":"array",
                        "items":{
                            "$ref":"#/definitions/geometry/definitions/position"
                        }
                    }
                }
            },
            {
                "title":"LineString",
                "description":"A LineString Geometry object as defined by TopoJSON",
                "required":[
                    "type",
                    "arcs"
                ],
                "properties":{
                    "type":{
                        "enum":[
                            "LineString"
                        ]
                    },
                    "arcs":{
                        "type":"array",
                        "items":{
                            "type":"integer"
                        }
                    }
                }
            },
            {
                "title":"MultiLineString",
                "description":"A MultiLineString Geometry object as defined by TopoJSON",
                "required":[
                    "type",
                    "arcs"
                ],
                "properties":{
                    "type":{
                        "enum":[
                            "MultiLineString"
                        ]
                    },
                    "arcs":{
                        "type":"array",
                        "items":{
                            "type":"array",
                            "items":{
                                "type":"integer"
                            }
                        }
                    }
                }
            },
            {
                "title":"Polygon",
                "description":"A Polygon Geometry object as defined by TopoJSON",
                "required":[
                    "type",
                    "arcs"
                ],
                "properties":{
                    "type":{
                        "enum":[
                            "Polygon"
                        ]
                    },
                    "arcs":{
                        "TODO":"Check if arcs refer to valid LinearRings",
                        "type":"array",
                        "items":{
                            "type":"array",
                            "items":{
                                "type":"integer"
                            }
                        }
                    }
                }
            },
            {
                "title":"MultiPolygon",
                "description":"A MultiPolygon Geometry object as defined by TopoJSON",
                "required":[
                    "type",
                    "arcs"
                ],
                "properties":{
                    "type":{
                        "enum":[
                            "MultiPolygon"
                        ]
                    },
                    "arcs":{
                        "type":"array",
                        "items":{
                            "type":"array",
                            "items":{
                                "type":"array",
                                "items":{
                                    "type":"integer"
                                }
                            }
                        }
                    }
                }
            },
            {
                "title":"GeometryCollection",
                "description":"A MultiPolygon Geometry object as defined by TopoJSON",
                "required":[
                    "type",
                    "geometries"
                ],
                "properties":{
                    "type":{
                        "enum":[
                            "GeometryCollection"
                        ]
                    },
                    "geometries":{
                        "type":"array",
                        "items":{
                            "$ref":"#/definitions/geometry"
                        }
                    }
                }
            }
        ],
        "definitions":{
            "position":{
                "type":"array",
                "items":{
                    "type":"number"
                },
                "minItems":2
            }
        }

    },
    "topology":{
        "title":"Topology",
        "description":"A Topology object as defined by TopoJSON",
        "type":"object",
        "required":[
            "objects",
            "arcs"
        ],
        "properties":{
            "type":{
                "enum":[
                    "Topology"
                ]
            },
            "objects":{
                "type":"object",
                "additionalProperties":{
                    "$ref":"#/definitions/geometry"
                }
            },
            "arcs":{
                "$ref":"#/definitions/topology/definitions/arcs"
            },
            "transform":{
                "$ref":"#/definitions/topology/definitions/transform"
            },
            "bbox":{
                "$ref":"#/definitions/bbox"
            }
        },
        "definitions":{
            "transform":{
                "type":"object",
                "required":[
                    "scale",
                    "translate"
                ],
                "properties":{
                    "scale":{
                        "type":"array",
                        "items":{
                            "type":"number"
                        },
                        "minItems":2
                    },
                    "translate":{
                        "type":"array",
                        "items":{
                            "type":"number"
                        },
                        "minItems":2
                    }
                }
            },
            "arcs":{
                "type":"array",
                "items":{
                    "type":"array",
                    "items":{
                        "oneOf":[
                            {
                                "$ref":"#/definitions/topology/definitions/position"
                            },
                            {
                                "type":"null"
                            }
                        ]
                    },
                    "minItems":2
                }
            },
            "position":{
                "type":"array",
                "items":{
                    "type":"number"
                },
                "minItems":2
            }
        }
    }
}

}