Layer difference

differencefreeInput: bounding boxOutput: GeoJSON

Subtracts from the features of layer A everything that is covered by layer B.

Layer difference — reference frame E1: a sample result on OpenStreetMap data
reference frame E1 · 5.6 km² · 200 features · 1.4 s · OSM data of 2026-08-24 · parameters: layer_a=landuse, layer_b=buildings

Parameters and limits

API nameTypeRequiredDefaultRange or allowed values
layer_aone of the listed valuesyesbuildings | roads | poi | water | green_areas | railways | boundaries | landuse | waterways
layer_bone of the listed valuesyesbuildings | roads | poi | water | green_areas | railways | boundaries | landuse | waterways

The table is generated from the tool's own parameter contract: API names, types, defaults and the ranges its validator accepts.

Input, output and limits

The input is a rectangular bounding box in WGS84 plus one of nine data layers; some tools also take a point. The output is GeoJSON, JSON metrics or a GeoTIFF.

LayerWhat it holds
buildingsbuildings
roadsroads and streets
poipoints of interest: services, shops, tourism
waterwater bodies
green_areasgreen areas: parks, forests, lawns
railwaysrailways
boundariesadministrative boundaries
landuseland use
waterwayswaterways

Every tool in the section is free. The bounding box may cover up to 100 km². Rate limits are 10 requests per minute per tool run and 30 requests per minute for reading the catalogue. Without signing in you get up to 10 successful calculations a day; after that the service asks you to register and answers 402 with the code login_required. A box larger than the allowed area is also 402, and an unknown tool id is 404.

When the API refuses

CodeReason
400A parameter failed the tool's own check (the answer carries a validation_errors list) or the bbox does not hold four numbers.
402The bounding box is larger than 100 km² — or a visitor who is not signed in has used up 10 calculations for the day and the answer asks them to sign in (login_required).
403Access guard: every tool is free today, so this refusal reaches nobody.
404There is no tool with that identifier.
429Rate limit exceeded: 10 requests per minute per tool run.

Calculate right here

The map appears here once the page has loaded. Without JavaScript you can still order the calculation with the API example below.
Calculation frame, WGS84

Access

The tool is free. Visitors who are not signed in get 10 calculations a day; after signing in there is no daily cap. The bounding box may cover up to 100 km². OpenStreetMap data: snapshot of 2026-08-24.

Example call

curl -X POST https://osm2cdr.com/api/geo-analysis/difference \
  -H 'Content-Type: application/json' \
  -d '{"bbox":[37.6,55.74,37.64,55.76],"params":{"layer_a":"landuse","layer_b":"buildings"}}'

The same in Python

import requests

r = requests.post(
    "https://osm2cdr.com/api/geo-analysis/difference",
    json={'bbox': [37.6, 55.74, 37.64, 55.76], 'params': {'layer_a': 'landuse', 'layer_b': 'buildings'}},
)
print(r.json()["meta"])

Full parameter schema: GET /api/geo-analysis/difference/schema

Example response

{
  "tool": "difference",
  "meta": {
    "elapsed_ms": 1408,
    "feature_count": 200,
    "method": "postgis_sql",
    "data_snapshot": "2026-08-24"
  },
  "result": {
    "feature_count": 200,
    "geometry_type": "MultiPolygon",
    "properties": {
      "name": null,
      "osm_id": -15686311
    }
  }
}

The numbers come from the run that baked the sample above. A live answer also carries meta.quota — how many calculations the visitor has left for today. The response is shown as an excerpt; the full result is larger.