diff --git a/counterexamples/divisions/division/bad-admin-level.yaml b/counterexamples/divisions/division/bad-admin-level.yaml new file mode 100644 index 000000000..1bafc41e5 --- /dev/null +++ b/counterexamples/divisions/division/bad-admin-level.yaml @@ -0,0 +1,21 @@ +--- +id: counterexample:division:bad-admin-level +type: Feature +geometry: + type: Point + coordinates: [0, 0] +properties: + theme: divisions + type: division + version: 0 + subtype: country + names: + primary: Invalid admin_level Example + country: ZZ + hierarchies: + - - division_id: counterexample:division:bad-admin-level + subtype: country + name: Invalid admin_level Example + admin_level: -1 + ext_expected_errors: + - "minimum: got -1, want 0" diff --git a/counterexamples/divisions/division/bad-capital-division-id.yaml b/counterexamples/divisions/division/bad-capital-division-id.yaml index fa6822397..5d3ce804a 100644 --- a/counterexamples/divisions/division/bad-capital-division-id.yaml +++ b/counterexamples/divisions/division/bad-capital-division-id.yaml @@ -18,6 +18,7 @@ properties: name: A division with an invalid capital_division_id property. norms: driving_side: right + admin_level: 0 capital_division_ids: [' '] ext_expected_errors: - "' ' does not match pattern" diff --git a/counterexamples/divisions/division/bad-country.yaml b/counterexamples/divisions/division/bad-country.yaml index f0e9566b8..6d7c758ad 100644 --- a/counterexamples/divisions/division/bad-country.yaml +++ b/counterexamples/divisions/division/bad-country.yaml @@ -18,6 +18,7 @@ properties: name: A division with an invalid country property. norms: driving_side: left + admin_level: 0 ext_expected_errors: - "maxLength: got 3, want 2" - "'ZZZ' does not match pattern" diff --git a/counterexamples/divisions/division/bad-geometry-coordinates.yaml b/counterexamples/divisions/division/bad-geometry-coordinates.yaml index dc1cb3615..cd76b46e8 100644 --- a/counterexamples/divisions/division/bad-geometry-coordinates.yaml +++ b/counterexamples/divisions/division/bad-geometry-coordinates.yaml @@ -18,5 +18,6 @@ properties: name: A division with invalid geometry coordinates. norms: driving_side: left + admin_level: 0 ext_expected_errors: - "properties/coordinates/items/type]: got string, want number" diff --git a/counterexamples/divisions/division/bad-geometry-type.yaml b/counterexamples/divisions/division/bad-geometry-type.yaml index 5071b949b..147bdc871 100644 --- a/counterexamples/divisions/division/bad-geometry-type.yaml +++ b/counterexamples/divisions/division/bad-geometry-type.yaml @@ -18,5 +18,6 @@ properties: name: A division with an invalid geometry type. norms: driving_side: left + admin_level: 0 ext_expected_errors: - "value must be 'Point'" diff --git a/counterexamples/divisions/division/bad-hierarchies.yaml b/counterexamples/divisions/division/bad-hierarchies.yaml index a75612536..d2818ddd4 100644 --- a/counterexamples/divisions/division/bad-hierarchies.yaml +++ b/counterexamples/divisions/division/bad-hierarchies.yaml @@ -20,6 +20,7 @@ properties: - division_id: counterexample:division:bad-hierarchies-county name: bar - [] + admin_level: 2 norms: driving_side: left ext_expected_errors: diff --git a/counterexamples/divisions/division/bad-names.yaml b/counterexamples/divisions/division/bad-names.yaml index fe2987feb..5981f6aef 100644 --- a/counterexamples/divisions/division/bad-names.yaml +++ b/counterexamples/divisions/division/bad-names.yaml @@ -20,6 +20,7 @@ properties: name: A division with invalid names norms: driving_side: left + admin_level: 0 ext_expected_errors: - "/propertyDefinitions/allNames/properties/primary/type]: got null, want string" - additional properties 'a-b-c-d-e-f-g-h-i-j-k-l' not allowed diff --git a/counterexamples/divisions/division/bad-norms.yaml b/counterexamples/divisions/division/bad-norms.yaml index bdc9847d9..721832ec2 100644 --- a/counterexamples/divisions/division/bad-norms.yaml +++ b/counterexamples/divisions/division/bad-norms.yaml @@ -19,6 +19,7 @@ properties: norms: driving_side: middle random_property: 10 + admin_level: 0 ext_expected_errors: - "value must be one of 'left', 'right'" - "/properties/properties/properties/norms/unevaluatedProperties]: false schema" diff --git a/counterexamples/divisions/division/bad-parent-division-id.yaml b/counterexamples/divisions/division/bad-parent-division-id.yaml index bb5d89ec1..3c4957b3e 100644 --- a/counterexamples/divisions/division/bad-parent-division-id.yaml +++ b/counterexamples/divisions/division/bad-parent-division-id.yaml @@ -21,6 +21,7 @@ properties: name: A division with an invalid parent division ID norms: driving_side: right + admin_level: 1 parent_division_id: " " ext_expected_errors: - "' ' does not match pattern" diff --git a/counterexamples/divisions/division/bad-region.yaml b/counterexamples/divisions/division/bad-region.yaml index 27faecb21..4ffcae64c 100644 --- a/counterexamples/divisions/division/bad-region.yaml +++ b/counterexamples/divisions/division/bad-region.yaml @@ -20,6 +20,7 @@ properties: - division_id: counterexample:division:bad-region subtype: region name: A division with an invalid ISO 3166-2 primary subdivision code ('region') + admin_level: 1 parent_division_id: counterexample:division:some-parent-division ext_expected_errors: - "minLength: got 3, want 4" diff --git a/counterexamples/divisions/division/parent-not-allowed-on-country.yaml b/counterexamples/divisions/division/parent-not-allowed-on-country.yaml index 9f0ef2cee..0d75c6945 100644 --- a/counterexamples/divisions/division/parent-not-allowed-on-country.yaml +++ b/counterexamples/divisions/division/parent-not-allowed-on-country.yaml @@ -16,6 +16,7 @@ properties: - - division_id: counterexample:division:parent-not-allowed-on-country subtype: country name: A country division that has a parent ID, which is not allowed + admin_level: 0 parent_division_id: counterexample:division:some-parent-division ext_expected_errors: - "[S#/properties/properties/allOf/3/then]: not failed" diff --git a/counterexamples/divisions/division/parent-required-on-sub-country.yaml b/counterexamples/divisions/division/parent-required-on-sub-country.yaml index cd58ef39a..811617189 100644 --- a/counterexamples/divisions/division/parent-required-on-sub-country.yaml +++ b/counterexamples/divisions/division/parent-required-on-sub-country.yaml @@ -20,5 +20,6 @@ properties: - division_id: counterexample:division:parent-required-on-sub-country subtype: region name: A sub-country division that lacks a parent ID + admin_level: 1 ext_expected_errors: - "missing property 'parent_division_id'" diff --git a/counterexamples/divisions/division_area/bad-class.yaml b/counterexamples/divisions/division_area/bad-class.yaml index fd1a0e58c..1dbeed9ee 100644 --- a/counterexamples/divisions/division_area/bad-class.yaml +++ b/counterexamples/divisions/division_area/bad-class.yaml @@ -14,5 +14,6 @@ properties: names: primary: A division area with an invalid class property. country: ZZ + admin_level: 0 ext_expected_errors: - "value must be one of 'land', 'maritime'" diff --git a/counterexamples/divisions/division_area/bad-country.yaml b/counterexamples/divisions/division_area/bad-country.yaml index a32280d71..3665bb5a3 100644 --- a/counterexamples/divisions/division_area/bad-country.yaml +++ b/counterexamples/divisions/division_area/bad-country.yaml @@ -14,6 +14,7 @@ properties: names: primary: A division area with an invalid country property. country: ZZZ + admin_level: 0 ext_expected_errors: - "maxLength: got 3, want 2" - "'ZZZ' does not match pattern" diff --git a/counterexamples/divisions/division_area/bad-division-id.yaml b/counterexamples/divisions/division_area/bad-division-id.yaml index 56fa81d24..9b3f79f42 100644 --- a/counterexamples/divisions/division_area/bad-division-id.yaml +++ b/counterexamples/divisions/division_area/bad-division-id.yaml @@ -14,5 +14,6 @@ properties: names: primary: A division area with an invalid division ID property. country: ZZ + admin_level: 0 ext_expected_errors: - "'abc ' does not match pattern" diff --git a/counterexamples/divisions/division_area/bad-geometry-coordinates.yaml b/counterexamples/divisions/division_area/bad-geometry-coordinates.yaml index 109efaa70..1d645e3f0 100644 --- a/counterexamples/divisions/division_area/bad-geometry-coordinates.yaml +++ b/counterexamples/divisions/division_area/bad-geometry-coordinates.yaml @@ -14,5 +14,6 @@ properties: names: primary: A division area with invalid geometry coordinates. country: ZZ + admin_level: 0 ext_expected_errors: - got number, want array diff --git a/counterexamples/divisions/division_area/bad-geometry-type.yaml b/counterexamples/divisions/division_area/bad-geometry-type.yaml index 4c5352743..0a2b4c6e7 100644 --- a/counterexamples/divisions/division_area/bad-geometry-type.yaml +++ b/counterexamples/divisions/division_area/bad-geometry-type.yaml @@ -14,6 +14,7 @@ properties: names: primary: A division area with an invalid geometry type. country: ZZ + admin_level: 0 ext_expected_errors: - "/properties/type/enum]: value must be 'Polygon'" - "/properties/type/enum]: value must be 'MultiPolygon'" diff --git a/counterexamples/divisions/division_area/bad-is-land.yaml b/counterexamples/divisions/division_area/bad-is-land.yaml index d83b8b2f1..d5368bf93 100644 --- a/counterexamples/divisions/division_area/bad-is-land.yaml +++ b/counterexamples/divisions/division_area/bad-is-land.yaml @@ -12,5 +12,6 @@ properties: division_id: counterexample:division_boundary:some-division is_land: yes country: ZZ + admin_level: 0 ext_expected_errors: - "is_land/type]: got string, want boolean" diff --git a/counterexamples/divisions/division_area/bad-is-territorial.yaml b/counterexamples/divisions/division_area/bad-is-territorial.yaml index 31282ee4a..5bb2bd8b1 100644 --- a/counterexamples/divisions/division_area/bad-is-territorial.yaml +++ b/counterexamples/divisions/division_area/bad-is-territorial.yaml @@ -13,5 +13,6 @@ properties: is_territorial: no is_land: true country: ZZ + admin_level: 0 ext_expected_errors: - "is_territorial/type]: got string, want boolean" diff --git a/counterexamples/divisions/division_area/bad-missing-is-land.yaml b/counterexamples/divisions/division_area/bad-missing-is-land.yaml index 3c7018342..98842b080 100644 --- a/counterexamples/divisions/division_area/bad-missing-is-land.yaml +++ b/counterexamples/divisions/division_area/bad-missing-is-land.yaml @@ -8,7 +8,8 @@ properties: theme: divisions type: division_area version: 0 - subtype: country - division_id: counterexample:division_boundary:some-division - is_territorial: false - country: ZZ \ No newline at end of file + subtype: country + division_id: counterexample:division_boundary:some-division + is_territorial: false + country: ZZ + admin_level: 0 diff --git a/counterexamples/divisions/division_area/bad-region.yaml b/counterexamples/divisions/division_area/bad-region.yaml index c35633c40..d9edc8f1c 100644 --- a/counterexamples/divisions/division_area/bad-region.yaml +++ b/counterexamples/divisions/division_area/bad-region.yaml @@ -15,6 +15,7 @@ properties: primary: A division area with an invalid ISO 3166-2 primary subdivision code ('region') country: ZZ region: this just seems wrong + admin_level: 1 ext_expected_errors: - "/propertyDefinitions/iso3166_2SubdivisionCode/maxLength]: maxLength: got 21, want 6" - "'this just seems wrong' does not match pattern" diff --git a/counterexamples/divisions/division_boundary/bad-class.yaml b/counterexamples/divisions/division_boundary/bad-class.yaml index 698be511e..19ef8d3e7 100644 --- a/counterexamples/divisions/division_boundary/bad-class.yaml +++ b/counterexamples/divisions/division_boundary/bad-class.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 0 subtype: country + admin_level: 0 class: foo divisions: ["example:division:country:left", "example:division:country:right"] is_disputed: false diff --git a/counterexamples/divisions/division_boundary/bad-division_ids-1.yaml b/counterexamples/divisions/division_boundary/bad-division_ids-1.yaml index e72f326d2..092efd36e 100644 --- a/counterexamples/divisions/division_boundary/bad-division_ids-1.yaml +++ b/counterexamples/divisions/division_boundary/bad-division_ids-1.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 1 subtype: region + admin_level: 1 class: land country: "XX" division_ids: ["example:division:country:left", "example:division:country:right", "example:division:country:right", 123] diff --git a/counterexamples/divisions/division_boundary/bad-division_ids-2.yaml b/counterexamples/divisions/division_boundary/bad-division_ids-2.yaml index 3bfedeee5..6d1324af4 100644 --- a/counterexamples/divisions/division_boundary/bad-division_ids-2.yaml +++ b/counterexamples/divisions/division_boundary/bad-division_ids-2.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 1 subtype: county + admin_level: 2 country: "XX" class: land division_ids: ["example:division:country:lonelylhsdivision"] diff --git a/counterexamples/divisions/division_boundary/bad-is-land.yaml b/counterexamples/divisions/division_boundary/bad-is-land.yaml index 11835e6ab..1deea2cad 100644 --- a/counterexamples/divisions/division_boundary/bad-is-land.yaml +++ b/counterexamples/divisions/division_boundary/bad-is-land.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 0 subtype: country + admin_level: 0 division_ids: ["example:division:country:left", "example:division:country:right"] is_land: yes is_territorial: false diff --git a/counterexamples/divisions/division_boundary/bad-is-territorial.yaml b/counterexamples/divisions/division_boundary/bad-is-territorial.yaml index 4ee7d2afc..7b7bf9618 100644 --- a/counterexamples/divisions/division_boundary/bad-is-territorial.yaml +++ b/counterexamples/divisions/division_boundary/bad-is-territorial.yaml @@ -9,10 +9,11 @@ properties: type: division_boundary version: 0 subtype: country + admin_level: 0 division_ids: ["example:division:country:left", "example:division:country:right"] class: land is_territorial: no is_land: true country: ZZ ext_expected_errors: - - "is_territorial/type]: got string, want boolean" \ No newline at end of file + - "is_territorial/type]: got string, want boolean" diff --git a/counterexamples/divisions/division_boundary/bad-not-both.yaml b/counterexamples/divisions/division_boundary/bad-not-both.yaml index bee287fe9..fa6f095bf 100644 --- a/counterexamples/divisions/division_boundary/bad-not-both.yaml +++ b/counterexamples/divisions/division_boundary/bad-not-both.yaml @@ -9,9 +9,10 @@ properties: type: division_boundary version: 1 subtype: country + admin_level: 0 is_land: true is_territorial: true class: land division_ids: ["example:division:country:left", "example:division:country:right"] ext_expected_errors: - - "division_boundary.yaml#/properties/properties/oneOf]: oneOf failed, subschemas 0, 1 matched" \ No newline at end of file + - "division_boundary.yaml#/properties/properties/oneOf]: oneOf failed, subschemas 0, 1 matched" diff --git a/counterexamples/divisions/division_boundary/missing-class.yaml b/counterexamples/divisions/division_boundary/missing-class.yaml index 287516eb2..9952db2e1 100644 --- a/counterexamples/divisions/division_boundary/missing-class.yaml +++ b/counterexamples/divisions/division_boundary/missing-class.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 0 subtype: macroregion + admin_level: 1 is_territorial: true is_land: false country: "XX" diff --git a/counterexamples/divisions/division_boundary/missing-country.yaml b/counterexamples/divisions/division_boundary/missing-country.yaml index 73462f91a..6efbd4ceb 100644 --- a/counterexamples/divisions/division_boundary/missing-country.yaml +++ b/counterexamples/divisions/division_boundary/missing-country.yaml @@ -9,9 +9,10 @@ properties: type: division_boundary version: 0 subtype: region + admin_level: 1 is_territorial: true is_land: false class: land division_ids: ["example:division:country:left", "example:division:country:right"] ext_expected_errors: - - "missing property 'country'" \ No newline at end of file + - "missing property 'country'" diff --git a/counterexamples/divisions/division_boundary/missing-division_ids.yaml b/counterexamples/divisions/division_boundary/missing-division_ids.yaml index 96f014e57..02505eab0 100644 --- a/counterexamples/divisions/division_boundary/missing-division_ids.yaml +++ b/counterexamples/divisions/division_boundary/missing-division_ids.yaml @@ -12,6 +12,7 @@ properties: is_territorial: false is_land: true subtype: macrocounty + admin_level: 2 country: "XX" ext_expected_errors: - "missing property 'division_ids'" diff --git a/examples/divisions/division/country.yaml b/examples/divisions/division/country.yaml index c2c4d4a54..9d86f0e06 100644 --- a/examples/divisions/division/country.yaml +++ b/examples/divisions/division/country.yaml @@ -18,4 +18,5 @@ properties: name: United States norms: driving_side: right + admin_level: 0 capital_division_ids: [ example:division:locality:washington_dc ] diff --git a/examples/divisions/division/dependency.yaml b/examples/divisions/division/dependency.yaml index 98292a535..2708c8587 100644 --- a/examples/divisions/division/dependency.yaml +++ b/examples/divisions/division/dependency.yaml @@ -34,5 +34,6 @@ properties: name: United States norms: driving_side: right + admin_level: 1 capital_division_ids: [ example:division:locality:san_juan ] parent_division_id: example:division:country:us diff --git a/examples/divisions/division/multiple_capital_division.yaml b/examples/divisions/division/multiple_capital_division.yaml index 0e8e890be..ee8fb19eb 100644 --- a/examples/divisions/division/multiple_capital_division.yaml +++ b/examples/divisions/division/multiple_capital_division.yaml @@ -26,5 +26,6 @@ properties: - division_id: example:division:region:pl-04 subtype: region name: Woj Kujawsko-Pomorskie + admin_level: 1 capital_division_ids: [ example:division:locality:bydgoszcz, example:division:locality:torun] parent_division_id: example:division:country:pl diff --git a/examples/divisions/division/perspectives.yaml b/examples/divisions/division/perspectives.yaml index d00468248..c89e1c6f3 100644 --- a/examples/divisions/division/perspectives.yaml +++ b/examples/divisions/division/perspectives.yaml @@ -24,6 +24,7 @@ properties: - - division_id: example:perspectives:trnc subtype: country name: Kuzey Kıbrıs + admin_level: 0 perspectives: mode: accepted_by countries: [TR] diff --git a/examples/divisions/division/population.yaml b/examples/divisions/division/population.yaml index d1044f221..a0742ad38 100644 --- a/examples/divisions/division/population.yaml +++ b/examples/divisions/division/population.yaml @@ -26,6 +26,7 @@ properties: - division_id: example:division:region:ca-on subtype: region name: Ontario + admin_level: 1 capital_division_ids: [ example:division:locality:toronto ] parent_division_id: example:division:country:ca population: 13550900 diff --git a/examples/divisions/division/region.yaml b/examples/divisions/division/region.yaml index c38bbfb42..e646519a7 100644 --- a/examples/divisions/division/region.yaml +++ b/examples/divisions/division/region.yaml @@ -26,5 +26,6 @@ properties: - division_id: example:division:region:us-ny subtype: region name: New York + admin_level: 1 capital_division_ids: [ example:division:locality:albany ] parent_division_id: example:division:country:us diff --git a/examples/divisions/division_area/country_land.yaml b/examples/divisions/division_area/country_land.yaml index f7620a998..7abee632f 100644 --- a/examples/divisions/division_area/country_land.yaml +++ b/examples/divisions/division_area/country_land.yaml @@ -310,3 +310,4 @@ properties: names: primary: United States country: US + admin_level: 0 diff --git a/examples/divisions/division_area/country_maritime.yaml b/examples/divisions/division_area/country_maritime.yaml index 6da93d96a..388f1ffac 100644 --- a/examples/divisions/division_area/country_maritime.yaml +++ b/examples/divisions/division_area/country_maritime.yaml @@ -86,3 +86,4 @@ properties: common: en: Finland country: FI + admin_level: 0 diff --git a/examples/divisions/division_area/is_land.yaml b/examples/divisions/division_area/is_land.yaml index 6ade21cbb..c3fc774d3 100644 --- a/examples/divisions/division_area/is_land.yaml +++ b/examples/divisions/division_area/is_land.yaml @@ -305,8 +305,9 @@ properties: is_land: true is_territorial: false country: US + admin_level: 0 version: 0 class: land division_id: example:division:country:us names: - primary: United States \ No newline at end of file + primary: United States diff --git a/examples/divisions/division_area/is_territorial.yaml b/examples/divisions/division_area/is_territorial.yaml index 18b8edda6..36c0810c3 100644 --- a/examples/divisions/division_area/is_territorial.yaml +++ b/examples/divisions/division_area/is_territorial.yaml @@ -79,6 +79,7 @@ properties: is_territorial: true is_land: false country: FI + admin_level: 0 version: 0 class: land division_id: example:division:country:fi diff --git a/examples/divisions/division_area/region_land.yaml b/examples/divisions/division_area/region_land.yaml index 6fa857863..ba51642ce 100644 --- a/examples/divisions/division_area/region_land.yaml +++ b/examples/divisions/division_area/region_land.yaml @@ -80,3 +80,4 @@ properties: primary: Umbria country: IT region: IT-55 + admin_level: 1 diff --git a/examples/divisions/division_boundary/disputed.yaml b/examples/divisions/division_boundary/disputed.yaml index 525a80bbb..613e63c85 100644 --- a/examples/divisions/division_boundary/disputed.yaml +++ b/examples/divisions/division_boundary/disputed.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 1 subtype: country + admin_level: 0 class: land is_land: true is_territorial: false diff --git a/examples/divisions/division_boundary/disputed_both.yaml b/examples/divisions/division_boundary/disputed_both.yaml index ee491390b..791187240 100644 --- a/examples/divisions/division_boundary/disputed_both.yaml +++ b/examples/divisions/division_boundary/disputed_both.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 1 subtype: country + admin_level: 0 class: land is_land: true is_territorial: false diff --git a/examples/divisions/division_boundary/is_land.yaml b/examples/divisions/division_boundary/is_land.yaml index 418a89f90..50d0865fd 100644 --- a/examples/divisions/division_boundary/is_land.yaml +++ b/examples/divisions/division_boundary/is_land.yaml @@ -9,7 +9,8 @@ properties: type: division_boundary version: 1 subtype: country + admin_level: 0 is_land: true is_territorial: false class: land - division_ids: ["example:division:country:left", "example:division:country:right"] \ No newline at end of file + division_ids: ["example:division:country:left", "example:division:country:right"] diff --git a/examples/divisions/division_boundary/is_territorial.yaml b/examples/divisions/division_boundary/is_territorial.yaml index f5d8b34b4..6c13a7a36 100644 --- a/examples/divisions/division_boundary/is_territorial.yaml +++ b/examples/divisions/division_boundary/is_territorial.yaml @@ -10,7 +10,8 @@ properties: type: division_boundary version: 1 subtype: country + admin_level: 0 is_territorial: true is_land: false class: maritime - division_ids: ["example:division:country:left", "example:division:country:right"] \ No newline at end of file + division_ids: ["example:division:country:left", "example:division:country:right"] diff --git a/examples/divisions/division_boundary/land_county.yaml b/examples/divisions/division_boundary/land_county.yaml index a9dc67197..dc47082eb 100644 --- a/examples/divisions/division_boundary/land_county.yaml +++ b/examples/divisions/division_boundary/land_county.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 1 subtype: region + admin_level: 1 class: land country: "XX" region: "XX-01" diff --git a/examples/divisions/division_boundary/land_region.yaml b/examples/divisions/division_boundary/land_region.yaml index a4e8a52fe..d9d162bef 100644 --- a/examples/divisions/division_boundary/land_region.yaml +++ b/examples/divisions/division_boundary/land_region.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 1 subtype: region + admin_level: 1 class: land country: "XX" is_land: true diff --git a/examples/divisions/division_boundary/maritime_country.yaml b/examples/divisions/division_boundary/maritime_country.yaml index 13d73ed4d..ca163134a 100644 --- a/examples/divisions/division_boundary/maritime_country.yaml +++ b/examples/divisions/division_boundary/maritime_country.yaml @@ -9,6 +9,7 @@ properties: type: division_boundary version: 1 subtype: country + admin_level: 0 class: maritime is_territorial: true is_land: false diff --git a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division/models.py b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division/models.py index a8227d3e6..a3ad0a5ca 100644 --- a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division/models.py +++ b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division/models.py @@ -17,6 +17,7 @@ UniqueItemsConstraint, ) from overture.schema.system.model_constraint import ( + FieldEqCondition, forbid_if, no_extra_fields, require_if, @@ -32,7 +33,7 @@ from ..enums import IS_COUNTRY, DivisionClass, PlaceType from ..models import CapitalOfDivisionItem -from ..types import Hierarchy +from ..types import AdminLevel, Hierarchy @no_extra_fields @@ -51,6 +52,12 @@ class Norms(BaseModel): @forbid_if(["parent_division_id"], IS_COUNTRY) @require_if(["parent_division_id"], ~IS_COUNTRY) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.COUNTRY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.DEPENDENCY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.MACROREGION)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.REGION)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.MACROCOUNTY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.COUNTY)) class Division( OvertureFeature[Literal["divisions"], Literal["division"]], Named, @@ -117,6 +124,7 @@ class Division( The default parent division is the parent division as seen from the default political perspective, if there is one, and is otherwise chosen somewhat arbitrarily. The hierarchies property can be used to inspect the exhaustive list of parent divisions.""", ), ] = None + admin_level: AdminLevel | None = None # Optional diff --git a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division_area/models.py b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division_area/models.py index 5519b40e4..06b38bb68 100644 --- a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division_area/models.py +++ b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division_area/models.py @@ -11,7 +11,11 @@ Named, Names, ) -from overture.schema.system.model_constraint import radio_group +from overture.schema.system.model_constraint import ( + FieldEqCondition, + radio_group, + require_if, +) from overture.schema.system.primitive import ( Geometry, GeometryType, @@ -22,9 +26,16 @@ from ..division.models import Division from ..enums import PlaceType +from ..types import AdminLevel from .enums import AreaClass +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.COUNTRY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.DEPENDENCY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.MACROREGION)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.REGION)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.MACROCOUNTY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.COUNTY)) @radio_group("is_land", "is_territorial") class DivisionArea( OvertureFeature[Literal["divisions"], Literal["division_area"]], Named @@ -93,3 +104,4 @@ class DivisionArea( description="ISO 3166-2 principal subdivision code of the division this area belongs to.", ), ] = None + admin_level: AdminLevel | None = None diff --git a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division_boundary/models.py b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division_boundary/models.py index 5cd0fcc13..86ea6e7cf 100644 --- a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division_boundary/models.py +++ b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/division_boundary/models.py @@ -10,6 +10,7 @@ from overture.schema.core.models import Perspectives from overture.schema.system.field_constraint import UniqueItemsConstraint from overture.schema.system.model_constraint import ( + FieldEqCondition, forbid_if, radio_group, require_if, @@ -24,11 +25,18 @@ from ..division import Division from ..enums import IS_COUNTRY, PlaceType +from ..types import AdminLevel from .enums import BoundaryClass @forbid_if(["country"], IS_COUNTRY) @require_if(["country"], ~IS_COUNTRY) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.COUNTRY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.DEPENDENCY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.MACROREGION)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.REGION)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.MACROCOUNTY)) +@require_if(["admin_level"], FieldEqCondition("subtype", PlaceType.COUNTY)) @radio_group("is_land", "is_territorial") class DivisionBoundary( OvertureFeature[Literal["divisions"], Literal["division_boundary"]] @@ -115,6 +123,7 @@ class DivisionBoundary( present on boundaries between different principal subdivisions or countries.""", ), ] = None + admin_level: AdminLevel | None = None is_disputed: Annotated[ bool | None, Field( diff --git a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py index 6fdacc482..621cfc416 100644 --- a/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py +++ b/packages/overture-schema-divisions-theme/src/overture/schema/divisions/types.py @@ -3,9 +3,20 @@ from pydantic import Field from overture.schema.system.field_constraint import UniqueItemsConstraint +from overture.schema.system.primitive import uint8 from .models import HierarchyItem +AdminLevel = NewType( + "AdminLevel", + Annotated[ + uint8, + Field( + description="Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", + ), + ], +) + Hierarchy = NewType( "Hierarchy", Annotated[ diff --git a/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json index b4ba3f48f..f3e8c2abd 100644 --- a/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_area_baseline_schema.json @@ -340,6 +340,92 @@ }, "properties": { "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "subtype": { + "const": "county" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "macrocounty" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "region" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "macroregion" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "dependency" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "country" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + } + ], "not": { "required": [ "id", @@ -369,6 +455,13 @@ } }, "properties": { + "admin_level": { + "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", + "maximum": 255, + "minimum": 0, + "title": "Admin Level", + "type": "integer" + }, "class": { "$ref": "#/$defs/AreaClass" }, diff --git a/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json index 53434bd29..fbd34ad41 100644 --- a/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_baseline_schema.json @@ -392,6 +392,90 @@ "properties": { "additionalProperties": false, "allOf": [ + { + "if": { + "properties": { + "subtype": { + "const": "county" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "macrocounty" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "region" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "macroregion" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "dependency" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "country" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, { "if": { "not": { @@ -438,6 +522,13 @@ } }, "properties": { + "admin_level": { + "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", + "maximum": 255, + "minimum": 0, + "title": "Admin Level", + "type": "integer" + }, "capital_division_ids": { "description": "Division IDs of this division's capital divisions. If present, this property will refer to the division IDs of the capital cities, county seats, etc. of a division.", "items": { diff --git a/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json b/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json index c76a177e8..336d2d484 100644 --- a/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json +++ b/packages/overture-schema-divisions-theme/tests/division_boundary_baseline_schema.json @@ -222,6 +222,90 @@ "properties": { "additionalProperties": false, "allOf": [ + { + "if": { + "properties": { + "subtype": { + "const": "county" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "macrocounty" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "region" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "macroregion" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "dependency" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, + { + "if": { + "properties": { + "subtype": { + "const": "country" + } + } + }, + "then": { + "required": [ + "admin_level" + ] + } + }, { "if": { "not": { @@ -284,6 +368,13 @@ } }, "properties": { + "admin_level": { + "description": "Integer representing the division's position in its country's administrative hierarchy, where lower numbers correspond to higher level administrative units.", + "maximum": 255, + "minimum": 0, + "title": "Admin Level", + "type": "integer" + }, "class": { "$ref": "#/$defs/BoundaryClass" }, diff --git a/reference/examples/divisions/division_area/country_land.yaml b/reference/examples/divisions/division_area/country_land.yaml index f7620a998..7abee632f 100644 --- a/reference/examples/divisions/division_area/country_land.yaml +++ b/reference/examples/divisions/division_area/country_land.yaml @@ -310,3 +310,4 @@ properties: names: primary: United States country: US + admin_level: 0 diff --git a/reference/examples/divisions/division_area/country_maritime.yaml b/reference/examples/divisions/division_area/country_maritime.yaml index 6da93d96a..388f1ffac 100644 --- a/reference/examples/divisions/division_area/country_maritime.yaml +++ b/reference/examples/divisions/division_area/country_maritime.yaml @@ -86,3 +86,4 @@ properties: common: en: Finland country: FI + admin_level: 0 diff --git a/reference/examples/divisions/division_area/is_land.yaml b/reference/examples/divisions/division_area/is_land.yaml index 6ade21cbb..c3fc774d3 100644 --- a/reference/examples/divisions/division_area/is_land.yaml +++ b/reference/examples/divisions/division_area/is_land.yaml @@ -305,8 +305,9 @@ properties: is_land: true is_territorial: false country: US + admin_level: 0 version: 0 class: land division_id: example:division:country:us names: - primary: United States \ No newline at end of file + primary: United States diff --git a/reference/examples/divisions/division_area/is_territorial.yaml b/reference/examples/divisions/division_area/is_territorial.yaml index 18b8edda6..36c0810c3 100644 --- a/reference/examples/divisions/division_area/is_territorial.yaml +++ b/reference/examples/divisions/division_area/is_territorial.yaml @@ -79,6 +79,7 @@ properties: is_territorial: true is_land: false country: FI + admin_level: 0 version: 0 class: land division_id: example:division:country:fi diff --git a/reference/examples/divisions/division_area/region_land.yaml b/reference/examples/divisions/division_area/region_land.yaml index 6fa857863..ba51642ce 100644 --- a/reference/examples/divisions/division_area/region_land.yaml +++ b/reference/examples/divisions/division_area/region_land.yaml @@ -80,3 +80,4 @@ properties: primary: Umbria country: IT region: IT-55 + admin_level: 1 diff --git a/schema/divisions/defs.yaml b/schema/divisions/defs.yaml index 4b3e3ec5d..caa2e70b1 100644 --- a/schema/divisions/defs.yaml +++ b/schema/divisions/defs.yaml @@ -57,6 +57,20 @@ description: Common schema definitions for divisions theme - microhood # A mini-neighborhood that is contained within a # division of type neighborhood. + admin_level: + description: + Integer representing this division's position in its country's + administrative hierarchy, where lower numbers correspond to higher + level administrative units. + + In Overture data releases, this value is typically equal to the + number of ancestor features in the division's primary hierarchy + (the one defined by following `parent_division_id`). Thus, a + country always has an `admin_level` of 0, a region has an + `admin_level` of 1, while further subdivisions have `admin_level` + values greater than 1. + type: integer + minimum: 0 hierarchy: description: A hierarchy of divisions, with the first entry being a country; diff --git a/schema/divisions/division.yaml b/schema/divisions/division.yaml index f4eb4d008..3026389c3 100644 --- a/schema/divisions/division.yaml +++ b/schema/divisions/division.yaml @@ -31,6 +31,19 @@ properties: # JSON Schema: Top-level object properties. not: { required: [parent_division_id] } else: required: [names, subtype, country, hierarchies, parent_division_id] + - if: + properties: + subtype: + enum: + - country + - dependency + - macroregion + - region + - macrocounty + - county + then: + required: + - admin_level properties: # JSON Schema: properties within GeoJSON top-level object 'properties' property subtype: { "$ref": "./defs.yaml#/$defs/propertyDefinitions/placetype" } class: @@ -149,6 +162,8 @@ properties: # JSON Schema: Top-level object properties. parent divisions. allOf: - "$ref": "../defs.yaml#/$defs/propertyDefinitions/id" + admin_level: + "$ref": "./defs.yaml#/$defs/propertyDefinitions/admin_level" perspectives: description: >- Political perspectives from which this division is considered diff --git a/schema/divisions/division_area.yaml b/schema/divisions/division_area.yaml index 985bdd60d..e49fd9221 100644 --- a/schema/divisions/division_area.yaml +++ b/schema/divisions/division_area.yaml @@ -26,6 +26,19 @@ properties: # JSON Schema: Top-level object properties. allOf: - "$ref": ../defs.yaml#/$defs/propertyContainers/overtureFeaturePropertiesContainer - "$ref": ../defs.yaml#/$defs/propertyContainers/namesContainer + - if: + properties: + subtype: + enum: + - country + - dependency + - macroregion + - region + - macrocounty + - county + then: + required: + - admin_level anyOf: - properties: is_land: @@ -73,3 +86,5 @@ properties: # JSON Schema: Top-level object properties. belongs to. allOf: - "$ref": "../defs.yaml#/$defs/propertyDefinitions/iso3166_2SubdivisionCode" + admin_level: + "$ref": "./defs.yaml#/$defs/propertyDefinitions/admin_level" diff --git a/schema/divisions/division_boundary.yaml b/schema/divisions/division_boundary.yaml index f03134116..52a65bc2f 100644 --- a/schema/divisions/division_boundary.yaml +++ b/schema/divisions/division_boundary.yaml @@ -27,6 +27,19 @@ properties: # JSON Schema: Top-level object properties. not: { required: [country] } else: required: [subtype, class, division_ids, is_land, is_territorial, country] + - if: + properties: + subtype: + enum: + - country + - dependency + - macroregion + - region + - macrocounty + - county + then: + required: + - admin_level oneOf: - properties: is_land: @@ -92,6 +105,8 @@ properties: # JSON Schema: Top-level object properties. present on boundaries between different principal subdivisions or countries. allOf: - "$ref": "../defs.yaml#/$defs/propertyDefinitions/iso3166_2SubdivisionCode" + admin_level: + "$ref": "./defs.yaml#/$defs/propertyDefinitions/admin_level" is_disputed: description: >- Indicator if there are entities disputing this division boundary.